Linux内核0.11版本sched.c中sleep_on()函数分析

本文详细分析了Linux内核0.11版本中sleep_on()函数的工作原理,特别是在多进程等待同一资源时如何构建等待队列。当资源可用时,wake_up()函数如何按顺序唤醒等待的进程,确保调度的正确性。通过示例说明了task1, task2, task3的唤醒过程。" 124042230,1368632,PHP ArrayAccess接口:实现数组式访问对象,"['PHP', '接口', '数组操作']
摘要由CSDN通过智能技术生成
 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)  

         tmp->state=0;  // 若在其前还存在等待的任务,则也将其置为就绪状态(唤醒)。

 }

在几个进程为等待同一资源而多次调用该函数时,程序就隐式地构筑出一个等待队列。

在插入等待队列后,sleep_on()函数就会调用schedule()函数去执行别的进程。当进程被唤醒而重新
执行时就会执行后续的语句,把比它早进入等待队列的一个进程唤醒。

例如,当task1,task2,task3因为资源暂时不可用而先后调用sleep_on()函数时,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值