今天看了几个函数,觉得自己理解的挺不错的
此函数用来把当前任务置为指定的睡眠状态(可中断或者不可中断的)
其中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