26 | 多个活动要安排(下):如何实现进程的等待与唤醒机制?
LMOS
该思维导图由 AI 生成,仅供参考
你好,我是 LMOS。
上节课,我带你一起设计了我们 Cosmos 的进程调度器,但有了进程调度器还不够,因为调度器它始终只是让一个进程让出 CPU,切换到它选择的下一个进程上去运行。
结合前面我们对进程生命周期的讲解,估计你已经反应过来了。没错,多进程调度方面,我们还要实现进程的等待与唤醒机制,今天我们就来搞定它。
进程的等待与唤醒
我们已经知道,进程得不到所需的某个资源时就会进入等待状态,直到这种资源可用时,才会被唤醒。那么进程的等待与唤醒机制到底应该这样设计呢,请听我慢慢为你梳理。
进程等待结构
很显然,在实现进程的等待与唤醒的机制之前,我们需要设计一种数据结构,用于挂载等待的进程,在唤醒的时候才可以找到那些等待的进程 ,这段代码如下所示。
进程等待
现在我们来实现让进程进入等待状态的机制,它也是一个函数。这个函数会设置进程状态为等待状态,让进程从调度系统数据结构中脱离,最后让进程加入到 kwlst_t 等待结构中,代码如下所示。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了进程的等待与唤醒机制的实现方法,以及空转进程的建立和运行原理。作者首先讲解了进程等待与唤醒的基本原理,并介绍了用于挂载等待进程的数据结构。随后详细解释了进程进入等待状态和进程唤醒的具体实现方法,包括设置进程状态、脱链和加入等待结构等步骤。特别强调了空转进程的特殊性,以及建立空转进程的具体代码实现。文章还讨论了多进程运行的情况,并对进程调度进行了测试。通过本文,读者可以快速了解进程调度器的相关知识,对进程的等待与唤醒机制有了更深入的理解。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》,新⼈⾸单¥68
《操作系统实战 45 讲》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- neohope置顶一、数据结构 全局有一个osschedcls变量,其数据结构为schedclass_t,用于管理所有cpu的所有进程。 schedclass_t包括一个 schdata_t数组,每个cpu对应一个。 schedclass_t.schdata_t[i],用于管理第i个cpu的全部进程。 schedclass_t.schdata_t[i]包括一个thrdlst_t数组,每个进程优先级对应一个。 schedclass_t.schdata_t[i].thrdlst_t[j]中,管理了第i个cpu的,优先级为j的全部进程。 二、idel进程 idel进程初始化及启动: init_krl->init_krlcpuidle->new_cpuidle->new_cpuidle_thread->krlthread_kernstack_init【krlcpuidle_main传参】->krlschedul->krlcpuidle_start->retnfrom_first_sched启动idel进程 idel进程调度: idel进程启动后,会不停的在krlcpuidle_main函数中循环调用krlschedul,只要有其他进程可以运行,就让渡CPU使用权给到其他进程; 其他进程调用krlschedul让渡CPU使用权时,如果找不到”下一进程“,会将CPU使用权给回到idel进程; 三、进程的等待与唤醒【信号量为例】 信号量sem_t,有一个等待进程列表kwlst_t,保存了等待获取信号量的全部进程列表 获取信号量: 进程调用krlsem_down->当信号量不足时krlwlst_wait->主动调用krlsched_wait让渡CPU使用权,让其他进程优先运行 即使其他进程把CPU使用权又还回来,也会继续循环,不断尝试获取信号量 释放信号量: 进程调用krlsem_up->krlwlst_allup->对kwlst_t中全部等待进程,依次调用krlsched_up->被给与CPU使用权的进程,会立即唤醒并尝试获取信号量 最后,有一个问题没想清楚,还请老师帮忙解答一下: 系统的idel进程只有一个,如果多个cpu同时空闲,会不会有问题啊?空闲进程不用per_cpu吗?
作者回复: 不会有问题的 因 SMP下每个CPU会对应一个idle 进程 运行同一份代码
2021-07-079 - pedro置顶并不会,进程进入等待只是进程状态发生了改变,进程还未让出当前CPU的执行权,待调度后,即 krlschedul(),会寻找已经准备好的其它进程,切换CPU上下文,让出CPU,此时该进程才会真正的停止。 所以调度函数至关重要!
作者回复: 66666 对的
2021-07-07216 - geek2020好奇很多资料说java执行了Thread.sleep()后,会主动让出CPU的使用权,是怎么做到的?
作者回复: sleep 会设置定时器 然后 主动 调用调度器
2021-07-1533 - Feen进程进入等待状态后,进程本身处于等待状态,进程被剥夺CPU使用权是通过krlschedul()函数剥夺的,而进程本身并没有调用krlschedul()函数,所以不会立即停止运行,而剥夺CPU使用权是由krlschedul()函数控制的,当保存当前进程寄存器和栈,并且准备好下一个进程的运行函数后,才会让当前进程退出CPU而停止运行了。
作者回复: 对的
2021-07-132 - 青玉白露进程不会马上停止运行,调用krlschedul()之后,会调度新的进程。
作者回复: 是的 正确
2021-07-071 - Ivan.Qi遇到一个问题,暂时没什么头绪 1. 通过krlnew_thread 初始化一个进程 krlnew_thread("kernelthread-a", (void*)thread_a_main, KERNTHREAD_FLG, PRILG_SYS, PRITY_MIN, DAFT_TDUSRSTKSZ, DAFT_TDKRLSTKSZ); 2. 进程自定义函数 void thread_a_main(){ uint_t i = 0; kprint("进程A运行:%x\n", i); } 3. 然后程序执行 1. new_cpuidle 2. init_a_thread 3. krlcpuidle_start -> retnfrom_first_sched 4. 最后提示 当前进程: kernelthread-a,犯了不该犯的错误:13, 所以要杀
作者回复: 你修改代码 了吗
2022-08-24归属地:湖北3 - 我是新手ABC有个疑问:如果空转函数一直运行的话,也就是CPU不是在运行用户代码就是在运行空转函数,那CPU的使用率会不会一直是100%呢?
作者回复: 是的 但系统中不只有空转进程
2022-05-232 - 艾恩凝自己建的工程,怎么新建空转进程的时候 运行到krlthread_kernstack_init 函数中,就会报14号异常,这是怎么回事,就是初始化内核栈的时候,按道理说这都是物理地址,怎么还是会进入14 异常
作者回复: 是不是 地址 映射 的问题
2022-05-053 - 胡涂涂这个调度机制很像嵌入式中实时操作系统的多任务调度,空转进程对标空闲任务。空转任务中,可以做一些维护性的任务,不能让cpu闲下来,哈哈哈
作者回复: 是的
2022-04-26 - 阿顺想咨询下进程如何决策何时要等待,并让出cpu?
作者回复: 当然是资源 不满足时
2021-08-28
收起评论