王道操作系统OS第二章进程管理

Posted 生命是有光的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道操作系统OS第二章进程管理相关的知识,希望对你有一定的参考价值。

✍、目录脑图

1、进程

程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。

进程:是动态的,是程序的一次执行过程。

1.1、进程的组成–PCB

  • 当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的"身份证号" – PID(Process ID,进程ID)
  • 操作系统要记录PID、进程所属用户ID(UID)[基本的进程描述信息,可以让操作系统区分各个进程]
  • 还要记录给进程分配了哪些资源(如:分配了多少内存、正在使用哪些I/O设备、正在使用哪些文件)[可用于实现操作系统对资源的管理]
  • 还要记录进程的运行情况(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)[可用于实现操作系统对进程的控制、调度]

这些信息都被保存在一个数据结构PCB(Oricess Control Block)中,即进程控制块,操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。


一个进程实体(进程映像)PCB、程序段、数据段组成。进程动态的,进程实体(进程映像)是静态的。

1.2、进程的特征

程序是静态的,进程是动态的,相比于程序,进程拥有以下特征:

  • 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的。
  • 并发性:内存中有多个进程实体,各进程可并发执行。
  • 独立性:进程是能独立运行、独立获得资源、独立接收调度的基本单位
  • 异步性:各进程是按各自独立的、不可预知的速度向前推进,操作系统要提供"进程同步机制"来解决异步问题。
  • 结构性:每个进程都会配置一个PCB。从结构上看,进程由程序段、数据段、PCB组成

1.3、小结

2、进程的状态

2.1、创建态、就绪态

  • 进程正在被创建时,它的状态是"创建态",在这个阶段操作系统会为进程分配资源、初始化PCB
  • 当进程创建完成后,便进入"就绪态",处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行

2.2、运行态

  • 当CPU空闲时,操作系统就会选择一个就绪进程,让它上处理机运行
  • 如果一个进程此时在CPU上运行,那么这个进程处于"运行态"

2.3、阻塞态

  • 在进程运行过程中,可能会请求等待某个事件的的发生(如等待某种系统资源的分配,或者等待其他进程的响应)

  • 在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入"阻塞态"

  • 当CPU空闲时,又会选择另一个"就绪态"进程上CPU运行

2.4、终止态

  • 一个进程可以执行 exit 系统调用,请求操作系统终止该进程。此时该进程会进入"终止态",操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB,当终止进程的工作完成之和,这个进程就彻底消失了。

2.5、进程状态的转换

  • 运行态->阻塞态 是一种进程自身做出的主动行为
  • 阻塞态->就绪态 不是进程自身能控制的,是一种被动行为

注意:不能由阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求)

  • 单CPU情况下,同一时刻只能会有一个进程处于运行态,多核CPU情况下,可能有多个进程处于运行态。

  • 阻塞态又称等待态、创建态又称新建态,终止态又称结束态

  • 进程PCB中,会有一个变量state来表示进程的当前状态。如:1表示创建态、2表示就绪态、3表示运行态…为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的PCB组织起来

2.6、进程的组织

进程的组织方式分为链接方式和索引方式:

2.7、小结

3、进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。简单理解:反正进程控制就是要实现进程状态转换

3.1、如何实现进程控制

原语是一种特殊的程序,它的执行具有原子性,也就是说,这段程序的运行必须是一气呵成,不能中断。

思考:为什么进程控制(状态转换)的过程要"一气呵成"?

如果不能"一气呵成",就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。

3.2、如何实现原语的"原子性"

原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。

可以使用"关中断指令"和"开中断指令"这两个特权指令来实现原子性。CPU执行了"关中断指令"之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。这样,关中断、开中断之间的这些指令就是不可被中断的,这就实现了"原子性"。

3.3、进程控制相关的原语

进程创建的原语:

进程终止的原语:

进程的阻塞和唤醒原语:

进程的切换原语:

3.4、小结

学习技巧:进程控制会导致进程状态的转换。无论哪个进程控制原语,要做的无非三类事情:

  1. 更新PCB中的信息

    a. 所有的进程控制原语一定都会修改进程状态标志

    b. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境

    c. 某进程开始运行前必然要恢复期运行环境

  2. 将PCB插入合适的队列

  3. 分配/回收资源

4、进程通信

进程通信就是指进程之间的信息交换。

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。

为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须实现的,为了保证进程间的安全通信,操作系统提供了一些方法。

4.1、共享存储

  • 两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现),当进程1在向共享空间写数据时,进程2是不允许访问共享空间的。
  • 操作系统只负责共享空间和同步互斥工具(如P、V操作)

共享存储分为基于数据结构的共享和基于存储区的共享。

  • 基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢,限制多,是一种低级通信方式
  • 基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。

4.2、管道通信

  1. 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道
  2. 各进程要互斥地访问管道
  3. 数据以字符流的形式写入管道,当管道写满时,写进程 的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()进程调用将被阻塞。
  4. 如果没写满,就不允许读。如果没读空,就不允许写
  5. 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

4.3、消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的"发送消息/接收消息"两个原语进行数据交换。

消息传递分为直接通信方式和间接通信方式:

  • 直接通信方式:消息直接挂到接收进程的消息缓冲队列上
  • 间接通信方式:消息要先发送到中间实体(信箱)中,因此也称"信箱通信方式"。

4.4、小结

5、多线程模型

5.1、什么是线程

有的进程可能需要"同时"做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了"线程",来增加并发度。

传统的进程是程序执行流的最小单位,引入线程后,线程成为了程序执行流的最小单位。

可以把线程理解为"轻量级进程",线程是一个基本的CPU执行单元,也是程序执行流的最小单位

引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件),引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的),线程则作为处理机的分配单元

5.2、引入线程的变化

5.3、线程的属性

6、线程的实现方式

6.1、用户级线程

早期的操作系统(如:早期Unix)只支持进程,不支持线程。当时的"线程"是由线程库实现的。

  1. 用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)。

  2. 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。

  3. 在用户看来,是有多个线程,但是在操作系统内核看来,并意识不到线程的存在。“用户级线程"就是"从用户视角能看到的线程”。

  4. 优缺点:

    优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

    缺点:当一个用户及线程被阻塞后,整个进程都会被阻塞,并发度不高,多个进程不可在多核处理机上并行运行。

6.2、内核级线程

内核级线程:又称内核支持的线程,由操作系统支持的线程

  1. 内核级线程的管理工作操作系统内核完成。

  2. 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。

  3. 操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。"内核级线程“就是”从操作系统内核视角能看到的线程"

  4. 优缺点

    优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

    缺点::一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

6.3、多线程模型

在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型。

6.3.1、一对一模型

  • 一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
  • 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
  • 缺点::一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

6.3.2、多对一模型

  • 多对一模型:多个用户及线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
  • 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
  • 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

重点:操作系统只"看得见"内核级线程,因此只有内核级线程才是处理机分配的单位

6.3.3、多对多模型

  • 多对多模型:n个用户级线程映射到m个内核级线程(n>=m)。每个用户级进程对应m个内核级进程
  • 优点:克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

6.4、小结

7、进程调度

7.1、调度的基本概念

当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是"调度"研究的问题。

7.2、调度的三个层次

7.2.1、高级调度

高级调度(作业调度):按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会创建PCB,调出时才撤销PCB。

  • 简化理解:好几个程序需要启动,到底先启动哪个
  • 作业:一个具体的任务
  • 用户向系统提交一个作业 = 用户让操作系统启动一个程序(来处理一个具体的任务)

7.2.2、低级调度

低级调度(进程调度/处理机调度):按照某种策略从就绪队列中选取一个进程,将处理机分配给它。

进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。

7.2.3、中级调度

内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。

暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列

中级调度(内存调度):按照某种策略决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高

7.3、七状态模型

暂时调到外存等待的进程状态为"挂起状态(挂起态)",挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。

挂起和阻塞的区别:

  • 两种状态哦都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。
  • 有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因再把阻塞挂起进程进一步细分为多个队列。

7.4、三层调度的联系

要做什么调度发生在发生频率对进程状态的影响
高级调度
(作业调度)
按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程外存->内存
(面向作业)
最低无->创建态->就绪态
中级调度
(内存调度)
按照某种规则,从挂起队列中选择合适的进程将其数据调回内存外存->内存
(面向进程)
中等挂起态->就绪态(阻塞挂起->阻塞态)
低级调度
(进程调度)
按照某种规则,从就绪队列中选择一个进程为其分配处理机内存->CPU最高就绪态->运行态

7.5、小结

7.6、进程调度的时机

进程调度(低级调度):就是按照某种算法从就绪队列中选择一个进程为其分配处理机。

需要进行进程调度与切换的情况如下图:

不能进行进程调度与切换的情况:

  • 有的系统中,只允许进程主动放弃处理机
  • 有的系统中,进程可以主动放弃处理机,当有更紧急的任务需要处理时,也会强行剥夺处理机(被动放弃)
  • 进程在普通临界区是可以进行调度、切换的。

进程在操作系统内核程序临界区不能进行调度与切换。 (√)

进程处于临界区不能进行处理机调度。(×)

临界资源:一个时间段内只允许一个进程使用的资源,各进程需要互斥地访问临界资源。

临界区:访问临界资源的那段代码。

内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)

7.7、进程调度的方式

  • 非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
    • 实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统
  • 剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
    • 可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统。

7.8、进程的切换与过程

“狭义的进程调度”与“进程切换”的区别:

  • 狭义的进程调度指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)
  • 进程切换是指一个进程让出处理机,由另一个进程占用处理机的过程。

广义的进程调度包含了选择一个进程和进程切换两个步骤。

进程切换的过程主要完成了:

  1. 对原来运行进程各种数据的保存
  2. 对新的进程各种数据的恢复(如:程序计数器、程序状态字、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块)

注意进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。

7.9、小结

8、调度算法的评价指标

8.1、CPU利用率

由于早期的CPU造价极其昂贵,因此人们会希望让CPU尽可能多地工作

CPU利用率: 指CPU “忙碌”的时间占总时间的比例。 利用率 = (忙碌的时间)/(总时间)
利 用 率 = 忙 碌 的 时 间 总 时 间 利用率 = \\frac忙碌的时间总时间 =

8.2、系统吞吐量

对于计算机来说,希望能用尽可能少的时间处理完尽可能多的作业

系统吞吐量:单位时间内完成作业的数量。系统吞吐量 = (总共完成了多少道作业)/总共花了多少时间

系 统 吞 吐 量 = 总 共 完 成 了 多 少 道 作 业 总 共 花 了 多 少 时 间 系统吞吐量 = \\frac总共完成了多少道作业总共花了多少时间 =

8.3、周转时间

对于计算机的用户来说,他很关心自己的作业从提交到完成花了多少时间。

周转时间:指从作业被提交给系统开始,到作业完成为止的这段时间间隔。它包括四个部分

  • 作业在外存后备队列上等待作业调度(高级调度)的时间
  • 进程在就绪队列上等待进程调度(低级调度)的时间
  • 进程在CPU上执行的时间
  • 进程等待I/O操作完成的时间

后三项在一个作业的整个处理过程中,可能发生多次。

周转时间 = 作业完成时间 - 作业提交时间。[对于用户来说,更关心自己的单个作业的周转时间]

平均周转时间 = (各作业周转时间之和)/作业数。[对于操作系统来说,更关心系统的整体表现,因此更关心所有作业周转时间的平均值]

带权周转时间

平 均 周 转 时 间 = 各 作 业 周 转 时 间 之 和 作 业 数 平均周转时间 = \\frac各作业周转时间之和作业数 =

带 权 周 转 时 间 = 作 业 周 转 时 间 作 业 实 际 运 行 时 间 = 作 业 完 成 时 间 − 作 业 提 交 时 间 作 业 实 际 运 行 的 时 间 带权周转时间 = \\frac作业周转时间作业实际运行时间 = \\frac作业完成时间-作业提交时间作业实际运行的时间 ==

带权周转时间必然≥1,且带权周转时间与周转时间都是越小越好。
平 均 带 权 周 转 时 间 = 各 作 业 带 权 周 转 时 间 之 和 作 业 数 平均带权周转时间 = \\frac各作业带权周转时间之和作业数 =
对于周转时间相同的两个作业,实际运行时间长的作业在相同时间内被服务的时间更多,带权周转时间更小,用户满意度更高。

对于实际运行时间相同的两个作业,周转时间短的带权周转时间更小,用户满意度更高。

8.4、等待时间

计算机的用户希望自己的作业尽可能少的等待处理机

等待时间:指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。

对于进程来说,等待时间就是指进程建立后等待被服务的时间之和,在等待I/O完成的期间其实进程也是在被服务的,所以不计入等待时间。

对于作业来说,不仅要考虑建立进程后的等待时间还要加上作业在外存后备队列中等待的时间

一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业/进程的等待时间。当然,与前面指标类似,也有“平均等待时间”来评价整体性能。

8.5、响应时间

对于计算机用户来说,会希望自己的提交的请求(比如通过键盘输入了一个调试命令)尽早地开始被系统服务、回应。

响应时间:指从用户提交请求首次产生响应所用的时间。

8.6、小结

9、调度算法

进程管理(二[1])

(王道408考研操作系统)第二章进程管理-第三节9:读者写者问题

王道操作系统OS进程管理

王道操作系统OS进程管理

(王道408考研操作系统)第二章进程管理-第三节8:经典同步问题之吸烟者问题

(王道408考研操作系统)第二章进程管理-第三节11:哲学家进餐问题