睡眠与唤醒(草稿)

睡眠与唤醒 (草稿)

1.    调用 nanosleep() 以后发生了什么?

nonosleep() 是一个系统调用,在内核中对应的是 sys_nonosleep()

sys_nonosleep:
   
创建一个定时器

struct hrtimer_sleeper {
    struct hrtimer timer;
    struct task_struct *task;
};


void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task)
{
    sl->timer.function = hrtimer_wakeup;
    sl->task = task;
}

定时器的处理函数设置为 hrtimer_wakeup()

将当前进程状态设置为TASK_INTERRUPTIBLE

启动定时器

调用 schedule(),主动进行进程调度,放弃控制权

Schedule() 检查当前进程,发现是TASK_INTERRUPTIBLE,就把它从执行队列中删除。因此,现在这个进程已经不属于任何队列了,那么到哪能找到它了?对,通过定时器还能找到它。另外,还可以根据 PID ,从 pidhash[] 中找到这个进程。


2.    时间到了以后如何唤醒进程?

static int hrtimer_wakeup(struct hrtimer *timer)
{
    struct hrtimer_sleeper *t =
        container_of(timer, struct hrtimer_sleeper, timer);
    struct task_struct *task = t->task;

    t->task = NULL;
    if (task)
        wake_up_process(task);

    return HRTIMER_NORESTART;
}

从定时器中得到对应的 task,然后通过 wake_up_process(),又把这个进程设置为 RUNNING,并加入到可执行队列中。


3.    Sleep 期间为什么能处理信号?

这就是TASK_INTERRUPTIBLE 和TASK_UNINTERRUPTIBLE 的区别,对于通过 nanosleep() 这种方式进入睡眠的进程,是可以被信号打断的,当信号到来时,进程会被设置为可运行


if (unlikely((prev->state & TASK_INTERRUPTIBLE) &&
        unlikely(signal_pending(prev))))
prev->state = TASK_RUNNING;


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值