11 linux011用于进程共享资源的睡眠与唤醒
Posted 资质平庸的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
被唤醒进程在随后得到调度后,睡眠函数运行结束返回即其运行栈才被回收。
以上是关于11 linux011用于进程共享资源的睡眠与唤醒的主要内容,如果未能解决你的问题,请参考以下文章