进程睡眠与唤醒函数

时间:2021-02-26 14:55:41

今天看了几个函数,觉得自己理解的挺不错的进程睡眠与唤醒函数



此函数用来把当前任务置为指定的睡眠状态(可中断或者不可中断的)

其中p是等待任务队列的头指针

static inline void __sleep_on(struct task_struct **p, int state)
{
struct task_struct *tmp;    


if (!p)    //如果p指向NULL,则退出!!  想想这个任务什么时候会指向NULL呢??我还没想出来>.<  也许是为了程序的健壮性吧!!!
return;
if (current == &(init_task.task))    //如果当前的指针指向任务0,oh congratulations!! 你的电脑将会死机
panic("task[0] trying to sleep");
tmp = *p;         //保留头指针
*p = current;    //将当前的指针赋值给头指针,意思就是头指针指向当前任务。。     好像有点啰嗦,也许会对你的理解有帮助!!
current->state = state;      //将传递进来的状态参数赋给当前的任务
repeat: schedule();         //这个调度函数用来干嘛呢???   首先你要先理解这个调度函数,请看:
          //当我们的等待队列有任务被唤醒时
  //那么我们刚刚被唤醒的任务的counter的值比当前任务的counter值大,所以此时会运行刚刚被唤醒的那个任务
    //但是,我们又想运行当前的任务,所以下面将这些刚刚被唤醒的任务置为不可中断睡眠状态(TASK_UNINTERRUPTIBLE)
if (*p && *p != current) {
(**p).state = 0;
current->state = TASK_UNINTERRUPTIBLE;     //说实话,我认为这个有问题,应该删掉,前面已经设置过state了。。
//虽然我们传入的是可中断睡眠状态或者不可中     //断睡眠状态,但是这个强制设置不可中断睡眠状态,不科学。。。
goto repeat;          //当之后唤醒的任务不为空,并且不是当前任务时,就返回到调度程序
}
if (!*p)
printk("Warning: *P = NULL\n\r");
if (*p = tmp)           //。。
tmp->state=0;
}

//接下来的函数就很好理解了。呱呱。。
void interruptible_sleep_on(struct task_struct **p)    //将指定的任务设置为可中断的睡眠状态,可以通过信号,任务超时等手段唤醒
{
__sleep_on(p,TASK_INTERRUPTIBLE);
}


void sleep_on(struct task_struct **p)    //将指定任务设置为不可中断的睡眠状态,这种睡眠状态只能通过wake_up明确唤醒之。。
{
__sleep_on(p,TASK_UNINTERRUPTIBLE);
}


void wake_up(struct task_struct **p)   //唤醒*p指向的任务,若该任务已经处于停止或者僵死状态,则显示警告信息。。
{
if (p && *p) {
if ((**p).state == TASK_STOPPED)       //任务处于停止状态
printk("wake_up: TASK_STOPPED");
if ((**p).state == TASK_ZOMBIE)
printk("wake_up: TASK_ZOMBIE");   //任务处于僵死状态
(**p).state=0;   //哟西,正式唤醒了任务p
}
}