第二章 进程管理
1. 进程的概念、组成、特征
1.1 进程的概念
程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合
进程(Process):是动态的,是程序的一次执行过程,同一个程序多次执行会对应多个进程。
1.2进程的组成
PCB
进程控制块(PCB Process Control Block)
操作系统对进程进行管理工作所需的信息都存在PCB中
操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中
程序段、数据段
PCB是给操作系统用的,程序段、数据段是给进程自己用的
1.3 程序是如何运行的
一个进程实体(进程映像)由PCB、程序段、数据段组成。行过程中产生的
进程是动态的,进程实体(进程映像)是静态的。各种数据
进程实体反应了进程在某一时刻的状态(如:x++后,x=2)
、、三部分组成了进程实体(进程映像)引入进程实体的概念后,可把进程定义为:
注意:PCB是进程存在的唯一标志!
同时挂三个QQ号,会对应三个QQ进程,它们的PCB、数据段各不相同,但程序段的内容都是相同的(都是运行着相同的QQ程序)
程序段、数据段是给进程自己用的,与进程自身的运行逻辑有关
1.4 进程的特征
2. 进程的状态与转换
2.1 进程的状态
创建态
进程正在被创建时,它的状态是“创建态”,在这个阶段操作系统会为进程分配资源、初始化PCB
就绪态
当进程创建完成后,便进入“就绪态”,处于就绪态的进程已经具备运行条件,但由于没有空闲CPU,就暂时不能运行
运行态
如果一个进程此时在CPU上运行,那么这个进程处于“运行态CPU会执行该进程对应的程序(执行指令序列)
阻塞态
在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。
在这个事件发生之前,进程无法继续往下执行,此时操作系统会让这个进程下CPU,并让它进入“阻塞态
当CPU空闲时,又会选择另一个“就绪态”进程上CPU运行
终止态
一个进程可以执行exit 系统调用,请求操作系统终止该进程。
此时该进程会进入“终止态”,操作系统会让该进程下CPU,
并回收内存空间等资源,最后还要回收该进程的PCB。
2.2 进程状态的转换
进程PCB中,会有一个变量 state来表示进程的当前状态。如:1表示创建态、2表示就绪态、3表示运行态。
为了对同一个状态下的各个进程进行统一的管理,操作系统会将各个进程的RCB组织起来。
2.3 进程的组织方式
链式方式
索引方式
绝大部分操作系统使用链式方式进行进程的组织
3. 进程控制
3.1 概念
什么是进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
简化理解:反正进程控制就是要实现进程状态转换¿
如何实现进程控制
实现
使用原语
一气呵成实现
如何实现原语的“原子性”
正常情况:CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前这段程序,转而执行相应的中断处理程序。
CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查
这样,关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了“原子性”
原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。 可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性
3.2 原语
创建原语
撤销原语
感兴趣了解下
阻塞原语与唤醒原语
阻塞唤醒要成对出现
切换原语
程序是如何运行的
4. 进程通信
4.1 概念
进程间通信(Inter-ProcessCommunication,IPC)是指两个进程之间产生数据交互。
为什么进程通信需要操作系统支持?
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
4.2 共享存储
为避免出错,各个进程对共享空间的访问应该是互斥的。
各个进程可使用操作系统内核提供的同步互斥工具(如P、V操作)
基于数据结构的共享
基于数据结构的共享:比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种
基于存储区的共享
基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统。这种共享方式速度很快,是一种
4.3 消息传递
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
直接通信方式
消息发送进程要指明接收进程的ID
间接通信方式
通过“信箱”间接地通信因此又称"信箱通信方式"
4.4 管道通信
“管道”是一个特殊的共享文件,又名pipe文件。其实就是在 内存中开辟一个大小固定的内存缓冲区
FIFO、类似队列(循环队列)
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
- 各进程要互斥地访问管道 (由操作系统实现)
- 当管道写满时,写进程将阻塞,直到读进程将管道中的数据取走,即可唤醒写进程。
- 当管道读空时,读进程将阻塞,直到写进程往管道中写入数据,即可唤醒读进程。
- 管道中的数据一旦被读出,就彻底消失。因此,当多个进程读同一个管道时,可能会错乱。对此,通常有两种解决方案:①一个管道允许多个写进程,一个读进程(2014年408真题高教社官方答案);②允许有多个写进程,多个读进程,但系统会让各个读进程轮流从管道中读数据(Linux的方案)。
5. 线程的概念
5.1 什么是线程,为什么要引入线程
有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了“线程”,来增加并发度。
可以把线程理解为“轻量级进程”线程是一个基本的CPU执行单元 也是程序执行流的最小单位
引入线程之后,不仅是进程之间可以并发,进程内的各线程之间 也可以并发,从而进一步提升了系统的并发度,使得一个进程内 也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打 印机、内存地址空间等都是分配给进程的)。
5.2 带来的变化
5.3 线程的属性
6. 线程的实现方式和多线程模型
6.1 线程的实现方式
线程库实现(用户级线程)
早期的系统没有实现内核级线程
内核级线程
6.2 多线程模型
在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型
一对一模型
多对一模型
多对多模型
7. 线程的状态转换与组织控制
7.1 线程的状态与转换
7.2 线程的组织与控制
8. 处理机调度概念、层次
8.1 基本概念
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题。
8.2 三个层次
高级调度(作业调度)
每个作业只调入一次,调出一次
中级调度
低级调度(进程调度)
低级调度(进程调度/处理机调度)——按照某种策略从就绪队列中选取一个进程,将处理机分配给它。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
8.3 三层调度的联系、对比
8.4 补充知识
9. 进程调度的时机切换与过程调度方式
9.1 时机
进程调度度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机。
9.2 切换与过程
9.3 方式
非剥夺调度方式
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统
剥夺调度方式
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统.
10.调度器、闲逛进程
10.1 调度器/调度程序(scheduler)
非抢占
就是cpu空闲的时候调度器就会出来看一下让哪个进程上cpu
10.2 闲逛进程
11. 调度算法的评价指标
11.1 CPU利用率
11.2 系统吞吐量
11.3 周转时间
11.4 等待时间
11.5 响应时间
对于计算机用户来说,会希望自己的提交的请求(比如通过键盘输入了一个调试命令)尽早地开始被系统服务、回应。
响应时间,指从用户提交请求到首次产生响应所用的时间。
12. 调度算法1(早期的批处理系统)
12.1 先来先服务(SCFS)
周转时间=完成时间-到达时间
带权周转时间=周转时间/运行时间
等待时间=周转时间-运行时间 - (I/O操作的时间)
12.2 最短作业优先(SJF)
SPF(非抢占式)
SRTN(抢占式)
注意
总结
12.3 最高响应比优先(HRRN)
12.4 知识回顾与重要考点
13 调度算法2 (交互式系统)
13.1 时间片轮转调度算法(RR)
如果,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。
另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),,从而导致实际用于进程执行的时间比 例减少。
一般来说,设计时间片时要让切换进程的开销占比不超过1%
13.2 优先级调度算法
13.3 多级反馈队列调度算法
13.4 知识回顾与重要考点
14. 调度算法3 多级队列调度
15. 进程同步、进程互斥
15.1 概念
进程同步
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互 合作。
进程互斥
进程的“并发”需要“共享”的支持。各个并发执行的进程不可避免的需要共享一些系统资源(比如内存,又比如打印机、摄像头这样的I/O设备)