进程睡眠与唤醒函数详解程序员

今天看了几个函数,觉得自己理解的挺不错的微笑

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

其中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 
} 
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/7294.html

(0)
上一篇 2021年7月17日
下一篇 2021年7月17日

相关推荐

发表回复

登录后才能评论