8.4 进程控制

进程控制

https://note.youdao.com/s/72dkbOS8

进程的控制结构

要对进程进行控制,首先就要对进程进行识别,进程本身也应该有其自身的结构

其实,操作系统本身就是一个程序,有一句经典的话:程序 = 算法 + 数据结构所以对于单个进程来说,可以用一种数据结构来表示它,这种数据结构称之为进程控制块PCB

PCB是进程存在的唯一标识。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mKbtFPa8-1638516548626)(https://note.youdao.com/yws/res/c/WEBRESOURCE04c46abbb6494feb4b95fd0e41c12c9c)]
++那么这些PCB之间是如何组织的?++

通常我们使用的是链表的方式进行组织的,就是把相同状态的进程链在一起,组成各种队列

就绪队列阻塞队列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZDCoq5KJ-1638516548632)(https://note.youdao.com/yws/res/e/WEBRESOURCE557dcf5b86f7926966be5e53bf1cdb8e)]

除此之外,还有索引方式,将相同状态的索引放在一个索引表里

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OgkoCHzx-1638516548633)(https://note.youdao.com/yws/res/e/WEBRESOURCE3e3ef0f12b4f467f0d6c7b1a244dc90e)]

不过一般用的都是链表,更灵活。

进程的切换

也叫做上下文切换一个正在运行的进程被中断,另一个就绪状态的进程进入运行状态。

一般情况下会有以下步骤:

  1. 首先,要保存处理器的上下文环境,将CPU程序计数器和寄存器的值保存到进程的私有堆栈中;
  2. 更新当前进程的PCB(包括状态变更);
  3. 当前的进程移到就绪或者阻塞队列中;
  4. 根据调度算法,选择就绪队列中一个合适的新进程,将其更改为运行态;
  5. 更新内存管理的数据结构;
  6. 新进程内,把新进程内保存的上下文信息载入到CPU的寄存器和程序寄存器,占有CPU

++上下文切换都发生在那些场景里呢?++

  • 为了保证所有的进程都可以得到公平的调度,CPU时间会被划分成一段段的时间片,这些时间片被轮流分给各个进程,当某个进程的时间片被耗尽了,就会被系统挂起,切换到其他正在等待的进程;
  • 进程的系统资源不足时(比如内存),也会被挂起,等待资源满足后再运行;
  • 进程被睡眠函数sleep主动挂起时;
  • 优先级更高的的进程运行时,原进程也会被挂起;
  • 硬件中断时,CPU上的进程被中断挂起,转而执行内核中的中断服务程序。

猜你喜欢

转载自blog.csdn.net/weixin_43824188/article/details/121699832
8.4