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 进程的等待与唤醒机制的主要内容,如果未能解决你的问题,请参考以下文章

JAVASE-DAY14

Linux队列

线程系列三线程的等待与唤醒机制

等待与唤醒机制

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_7_等待唤醒机制需求分析

10、同步互斥机制3(进程通信)(操作系统笔记)