14 进程的等待与唤醒机制
Posted xuan01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14 进程的等待与唤醒机制相关的知识,希望对你有一定的参考价值。
进程的等待结构:
kwlst_t 结构用于挂载等待的进程;经常被包含在信号量等结构,是用于保护访问受限的贡献资源;
进程等待:
krlsched_wait 函数:获取当前正在运行的进程,设置进程状态为等待状态,执行脱链操作,并将进程加入等待结构;
进程唤醒:
krlsched_up 函数:从等待数据结构中获取进程,然后设置进程的状态为运行状态,最后将这个进程加入到进程优先级链表中;
空转进程:
空转进程是进程调度器的最后选择;每个CPU一个空转进程;
建立空转进程:
cosmos的空转进程是内核进程,不加入调度系统,而是一个专用的指针指向它;
new_cpuidle 接口函数,调用new_cpuidle_thread 函数,建立空转进程;借用之前的建立进程的操作,最后设置调度系统结构的空转进程和当前进程 指针 ,指向这个空转进程;
其中,将 krlcpuidke_main 空转进程的主函数 传进初始化内核栈函数;主函数就是一个死循环;
空转进程运行:
作为第一进程,手动启动,没法调度;krlcpuidle_start 函数:取出空转进程,设置一下机器上下文结构和运行状态,接着调用retnfrom_first_sched 函数,恢复进程内核栈中的内容,启动运行;
将建立空转进程和启动空转封装为初始化空转进程函数,最后 初始化进程调度器和初始化空转进程 由init_krl函数最后调用;
实验部分(后续更新):
多进程运行:
现在的状态:空转进程调用了 进程调度器, 而进程调度器选择了空转进程, 一个闭环;
实验部分:
建立两个内核进程,运行两个函数,都调用 krlschedul 函数, 交替运行;
11 linux011用于进程共享资源的睡眠与唤醒
用进程调度状态
、进程调度
和一个指向上一个睡眠进程PCB的指针
实现了进程在共享资源时的睡眠等待与唤醒机制,分别包装成睡眠和唤醒两个函数。
此机制的实现非常简单,但不太容易被理解。
1 进程等待资源的睡眠
[1] 初始一个用于某资源共享的PCB指针为NULL,表征之前无进程睡眠等待;
[2] 在睡眠函数栈中保存该PCB指针,置PCB指针指向当前进程的PCB;置当前进程状态为不可调度状态,随即调度进程调度函数完成进程调度;
[3] 在调用进程调度函数
之后唤醒(置回可调度状态)栈中所保存PCB所指进程。
这个过程有3个要点:
[1] 睡眠函数栈在调度函数
返回前一直存在;
[2] 调度函数
的返回依赖于当前进程被唤醒后;
[3] 当前进程被唤醒即调度函数
返回后,立即唤醒在该进程之前睡眠的进程。
是的,每一处都是要点。
2 进程的唤醒
唤醒睡眠等待的进程时,只需唤醒最后一个进入睡眠的进程(即1中提到的PCB所指向的进程),让被唤醒进程依次唤醒之前睡眠等待的进程。
3 等待资源进程的睡眠与唤醒过程
[1] 3个进程依次通过PCB进入睡眠等待
PCB = NULL;
+----------------+ +->+---------------+ +->+---------------+
|t = PCB(NULL) | | |t = PCB(PCB1) | | |t = PCB(PCB2) |
+----------------+ | +---------------+ | +---------------+
|PCB = PCB1 | | |PCB = PCB2 | | |PCB = PCB3 |
+----------------+ | +---------------+ | +---------------+
|PCB1 unrunning | | |PCB2 unrunning | | |PCB3 unrunning |
| && schedule |run other| | && schedule |run other| | && schedule |
+----------------+---------+ +---------------+---------+ +---------------+
|t(NULL) running| |t(PCB1) running| |t(PCB2) running|
+----------------+ +---------------+ +---------------+
P1 P2 P3
PCB指向最后一个进入睡眠进程的PCB即PCB3,各进程睡眠函数的运行栈一直存在(t一直在)。
[2] 唤醒最后一个进入睡眠等待的进程,然后各进程被依次唤醒
wake_up: PCB(PCB3) running; PCB = NULL
|
| +----------------+ +---------------+ +---------------+
| |t = PCB(PCB2) | |t = PCB(PCB1) | |t = PCB(NULL) |
| +----------------+ +---------------+ +---------------+
| |PCB = PCB3 | |PCB = PCB2 | |PCB = PCB1 |
| +----------------+ +---------------+ +---------------+
| |PCB1 unrunning | |PCB2 unrunning | |PCB3 unrunning |
| | && schedule | | && schedule | | && schedule |
+-->+----------------+ +->+---------------+ +->+---------------+
|t(PCB2) running| | |t(PCB1) running| | |t(NULL) running|
+----------------+ | +---------------+ | +---------------+
| ... |-+ | ... |-+ | ... |
P3 P2 P1
被唤醒进程在随后得到调度后,睡眠函数运行结束返回即其运行栈才被回收。
以上是关于14 进程的等待与唤醒机制的主要内容,如果未能解决你的问题,请参考以下文章