void sleep_on(struct task_struct **p)
{
struct task_struct *tmp;
if (!p) //若指针无效,则退出
return;
if (current == &(init_task.task)) //若当前任务是任务0则死机
panic("task[0] trying to sleep");
tmp = *p; //让tmp指向已经在等待队列上的任务
*p = current; //将睡眠队列头的等待指针指向当前任务
current->state = TASK_UNINTERRUPTIBLE; //将当前任务置为不可中断的等待状态
schedule(); //重新调度
// 只有当这个等待任务被唤醒时,调度程序才又返回到这里,则表示进程已被明确地唤醒。
if (tmp)
{
struct task_struct *tmp;
if (!p) //若指针无效,则退出
return;
if (current == &(init_task.task)) //若当前任务是任务0则死机
panic("task[0] trying to sleep");
tmp = *p; //让tmp指向已经在等待队列上的任务
*p = current; //将睡眠队列头的等待指针指向当前任务
current->state = TASK_UNINTERRUPTIBLE; //将当前任务置为不可中断的等待状态
schedule(); //重新调度
// 只有当这个等待任务被唤醒时,调度程序才又返回到这里,则表示进程已被明确地唤醒。
if (tmp)
tmp->state=0; // 若在其前还存在等待的任务,则也将其置为就绪状态(唤醒)。
}
在几个进程为等待同一资源而多次调用该函数时,程序就隐式地构筑出一个等待队列。
在插入等待队列后,sleep_on()函数就会调用schedule()函数去执行别的进程。当进程被唤醒而重新
执行时就会执行后续的语句,把比它早

本文详细分析了Linux内核0.11版本中sleep_on()函数的工作原理,特别是在多进程等待同一资源时如何构建等待队列。当资源可用时,wake_up()函数如何按顺序唤醒等待的进程,确保调度的正确性。通过示例说明了task1, task2, task3的唤醒过程。"
124042230,1368632,PHP ArrayAccess接口:实现数组式访问对象,"['PHP', '接口', '数组操作']
最低0.47元/天 解锁文章
3133





