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用于进程共享资源的睡眠与唤醒的主要内容,如果未能解决你的问题,请参考以下文章

08 linux011进程调度

linux 内核睡眠与唤醒

《linux设备驱动开发详解》笔记——8阻塞与非阻塞IO

Linux进程的睡眠和唤醒

ubuntu 进程睡眠怎么唤醒

linux进程的管理与调度