操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

26 | 多个活动要安排(下):如何实现进程的等待与唤醒机制?

init_ab_thread()
thread_b_main()
thread_a_main()
krlcpuidle_start()
krlcpuidle_main()
new_cpuidle()
new_cpuidle_thread()
krlsched_up(kwlst_t *wlst)
krlsched_wait(kwlst_t *wlst)
list_h_t wl_list
uint_t wl_tdnr
spinlock_t wl_lock
测试
空转进程
等待和唤醒机制
测试多进程
初始化多个进程
空转进程运行
建立空转进程
进程唤醒
进程等待
进程等待结构
思考题
重点回顾
多进程运行
空转进程
进程等待与唤醒
进程的等待与唤醒机制

该思维导图由 AI 生成,仅供参考

你好,我是 LMOS。
上节课,我带你一起设计了我们 Cosmos 的进程调度器,但有了进程调度器还不够,因为调度器它始终只是让一个进程让出 CPU,切换到它选择的下一个进程上去运行。
结合前面我们对进程生命周期的讲解,估计你已经反应过来了。没错,多进程调度方面,我们还要实现进程的等待与唤醒机制,今天我们就来搞定它。
这节课的配套代码,你可以从这里下载。

进程的等待与唤醒

我们已经知道,进程得不到所需的某个资源时就会进入等待状态,直到这种资源可用时,才会被唤醒。那么进程的等待与唤醒机制到底应该这样设计呢,请听我慢慢为你梳理。

进程等待结构

很显然,在实现进程的等待与唤醒的机制之前,我们需要设计一种数据结构,用于挂载等待的进程,在唤醒的时候才可以找到那些等待的进程 ,这段代码如下所示。
typedef struct s_KWLST
{
spinlock_t wl_lock; //自旋锁
uint_t wl_tdnr; //等待进程的个数
list_h_t wl_list; //挂载等待进程的链表头
}kwlst_t;
其实,这个结构在前面讲信号量的时候,我们已经见过了。这是因为它经常被包含在信号量等上层数据结构中,而信号量结构,通常用于保护访问受限的共享资源。这个结构非常简单,我们不用多说。

进程等待

现在我们来实现让进程进入等待状态的机制,它也是一个函数。这个函数会设置进程状态为等待状态,让进程从调度系统数据结构中脱离,最后让进程加入到 kwlst_t 等待结构中,代码如下所示。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了进程的等待与唤醒机制的实现方法,以及空转进程的建立和运行原理。作者首先讲解了进程等待与唤醒的基本原理,并介绍了用于挂载等待进程的数据结构。随后详细解释了进程进入等待状态和进程唤醒的具体实现方法,包括设置进程状态、脱链和加入等待结构等步骤。特别强调了空转进程的特殊性,以及建立空转进程的具体代码实现。文章还讨论了多进程运行的情况,并对进程调度进行了测试。通过本文,读者可以快速了解进程调度器的相关知识,对进程的等待与唤醒机制有了更深入的理解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 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-07
    9
  • pedro
    置顶
    并不会,进程进入等待只是进程状态发生了改变,进程还未让出当前CPU的执行权,待调度后,即 krlschedul(),会寻找已经准备好的其它进程,切换CPU上下文,让出CPU,此时该进程才会真正的停止。 所以调度函数至关重要!

    作者回复: 66666 对的

    2021-07-07
    2
    16
  • geek2020
    好奇很多资料说java执行了Thread.sleep()后,会主动让出CPU的使用权,是怎么做到的?

    作者回复: sleep 会设置定时器 然后 主动 调用调度器

    2021-07-15
    3
    3
  • Feen
    进程进入等待状态后,进程本身处于等待状态,进程被剥夺CPU使用权是通过krlschedul()函数剥夺的,而进程本身并没有调用krlschedul()函数,所以不会立即停止运行,而剥夺CPU使用权是由krlschedul()函数控制的,当保存当前进程寄存器和栈,并且准备好下一个进程的运行函数后,才会让当前进程退出CPU而停止运行了。

    作者回复: 对的

    2021-07-13
    2
  • 青玉白露
    进程不会马上停止运行,调用krlschedul()之后,会调度新的进程。

    作者回复: 是的 正确

    2021-07-07
    1
  • 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-23
    2
  • 艾恩凝
    自己建的工程,怎么新建空转进程的时候 运行到krlthread_kernstack_init 函数中,就会报14号异常,这是怎么回事,就是初始化内核栈的时候,按道理说这都是物理地址,怎么还是会进入14 异常

    作者回复: 是不是 地址 映射 的问题

    2022-05-05
    3
  • 胡涂涂
    这个调度机制很像嵌入式中实时操作系统的多任务调度,空转进程对标空闲任务。空转任务中,可以做一些维护性的任务,不能让cpu闲下来,哈哈哈

    作者回复: 是的

    2022-04-26
  • 阿顺
    想咨询下进程如何决策何时要等待,并让出cpu?

    作者回复: 当然是资源 不满足时

    2021-08-28
收起评论
大纲
固定大纲
进程的等待与唤醒
进程等待结构
进程等待
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部