第二章 进程的描述与控制
思维导图
2.1前驱图和程序执行
程序顺序执行:一个较大程序通常都由若干个程序段组成。
程序在执行时,必须按照某种先后次序逐个执行,仅当前一操作执行完成后,才能执行后续操作。
前驱图 有向无循环图,用于描述进程之间执行的先后顺序
节点表示进程或程序段,有向边表示前趋关系。
程序并行执行 采用多道程序技术,将多个程序同时装入内存,使之并发运行。
程序并发执行的特征
间断性
- 并发程序之间相互制约
- 执行——暂停执行——执行
失去封闭性
- 多个程序共享全机资源
- 执行状态受外界因素影响
不可再现性
- 程序多次执行后,虽然其执行的环境和初始条件都相同,但得到的结果却各不相同。
2.2 进程的定义和特征
进程的定义有如下几点
-
进程是程序的一次执行。
-
进程是一个程序及其数据在处理机上顺序执行时所发生的活动
-
进程是程序在一个数据集合上执行的过程,它是系统进行资源分配和调度的一个独立单位。
进程定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
进程控制块:(PCB):专门的数据结构,与进程一一对应
2.2.1进程的特征
- 动态性:有一个生命期
- 并发性:一段时间内同时运行
- 独立性:进程实体是一个能独立运行的基本单位,是系统重资源分配的基本单位。
- 按各自独立的、不可预知的速度向前推进。
2.2.2进程与程序的区别
进程是程序的一个实例,是程序的一次执行。
进程是活动的,程序是静态的
程序是进程的代码部分
进程在内存,程序在外存
2.2.3进程的状态及转换
就绪状态:一个较大的程序通常都由若干个程序段组成。
程序在执行时,必须按照某种先后次序逐个执行,仅当前一操作执行后,才能执行后续操作。
执行状态:已获得CPU,正在执行的状态
单处理机:一个进程处于执行状态
多处理机:多个进程处于执行状态
阻塞状态:正在执行的进程由于发生某事件而暂时无法继续执行的状态。
典型事件:请求I/O 、 申请缓冲空间
根据阻塞原因:设置多个阻塞队列。
2.2.4进程控制块
PCB是进程的一部分,是操作系统中最重要的记录性数据结构,是进程存在的唯一标志,常驻内存。
PCB的作用
作为独立运行基本单位的标志;
能实现间断性的运行方式
提供进程管理所需要的信息
提供进程调度所需要的信息
实现与其他进程的同步与通信
PCB的信息
进程标识符
处理机状态
进程调度信息
进程控制信息
PCB的组织方式
线性方式 链接方式 索引方式
2.3进程的描述与控制
进程管理最基本的功能
一般是由OS中内核的原语实现
2.3.1进程创建
进程的创建具有层次结构
引起进程创建的事件有:用户登录、作业调度、提供服务、应用请求。
进程图:描述进程家族关系的有向树
进程创建过程
- 申请空白PCB
- 分配所需资源
- 初始化PCB
- 插入就绪队列
2.3.2进程终止
引起进程终止的事件
- 根据被终止进程的标识符,从PCB集合中检索该进程的PCB,从中读出该进程的状态
- 若被终止进程正处于执行状态,应立即终止该程序的执行,并设置调度标志为真,用于指示该进程被终止后应重新进行调度
- 若该进程还有子孙进程,还应将其所有子进程予以终止
- 将该进程所拥有的全部资源,归还给其父进程或系统
- 将被终止流程(PCB)从所在队列中移去
2.3.3进程的阻塞与唤醒
引起进程阻塞和唤醒的事件
向系统请求共享资源失败;等待某种操作的完成;新数据尚未到达;等待新任务的到达。
进程阻塞过程
阻塞原语Block() 进程的阻塞是进程自身的一种主动行为
具体过程:停止执行;状态由执行改为阻塞;将PCB插入阻塞队列
进程唤醒过程
唤醒原语Wakeup()
具体过程:从阻塞队列中移出;状态由阻塞改为就绪;将PCB插入就绪队列
必须成对使用Block和Wakeup原语
2.3.4进程的挂起与激活
进程的挂起:Suspend()原语
执行过程:1.更改状态,2.复制PCB到指定区域
3.重新调度
进程的激活过程:Active()原语
执行过程:1,重新调入内存。2.更改状态
3.重新调度
2.4进程通信
2.4.1进程通信概念
进程通信是指进程之间的信息交换
低级进程通信:进程的同步和互斥
效率低,通信对用户不透明。
高级进程通信:使用方便,高效地传送大量数据。
2.4.2进程通信类型
共享内存(共享存储器系统)
基于共享数据结构的通信方式(效率低)
基于共享存储区的通信方式(高级)
管道通信
管道:用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。
管道机制的协调能力:互斥、同步、判断对方是否存在。
消息队列(消息传递系统)
直接通信方式
间接通信方式(通过邮箱)
客户机-服务器系统
套接字(Socket)
远程过程调用(RPC)
远程方法调用(RMI,Java)
消息传递通信实现方式
直接通信方式:发送原语:send(receiver,message)
接收原语:receive(sender,message)
间接通信方式:通过信箱来完成
信箱结构:信箱头+信箱体
消息的发送和接收
发送原语:send(mailbox,message)
接收原语: receive (mailbox,message)
信箱类型:私用邮箱,公共邮箱,共享邮箱
2.4.3 Linux进程通信方式
管道 共享内存 消息队列 信号量 套接字 信号
2.5线程的基本概念
相关时间:60年代中期:提出进程概念 80年代中期:提出线程概念,90年代后:多处理机系统引入线程。
引入进程的目的:使多个程序并发执行→提高资源利用率以及系统吞吐量。
进程的2个基本属性:
根据汤小丹书中提到
1.进程是一个可拥有资源的独立单位
2.进程是一个可独立调度和分派的基本单位
2.5.1提出线程的目的
- 减少程序在并发执行时所付出的时空开销
- 使OS有更好的并发性
- 适用于多处理机结构的计算机系统
进程是拥有资源的基本单位
线程作为调度和分派的基本单位
2.5.2线程与进程的比较
调度的基本单位
- 在传统的OS中,拥有资源、独立调度和分派的基本单位都是进程
- 在引入线程的OS中,线程作为调度和分派的基本单位,进程作为资源拥有的基本单位
- 在同一进程中,线程的切换不会引起进程切换,在由一个进程中的线程切换到另一个进程中的线程时,将会引起进程切换。
并发性
在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,也可以并发执行
拥有资源
进程是系统中拥有资源的一个基本单位,他可以拥有资源
线程本身不拥有系统资源,仅有一点可以保证独立运行的资源
允许多个线程共享其隶属进程所拥有的资源
独立性
同一个进程的不同线程之间的独立性要比不同进程之间的独立性低很多。
系统开销
在创建或撤消进程时,OS所付出的开销将显著大于创建或撤消线程时的开销。
线程切换的代价远低于进程切换的代价。
同一进程中的多个线程之间的同步和通信也比进程的简单。
支持多处理系统
2.5.3线程的状态和线程控制块
线程状态:
执行态,就绪态,阻塞态
线程状态转换与进程状态转换一样
线程控制块
线程标识符、一组寄存器、线程运行状态、优先级、线程专有存储区、信号屏蔽、堆栈指针
2.6线程的实现
实现方式:
内核支持线程KST
用户级线程ULT
组合方式
具体实现:
内核支持线程的实现(利用系统调用)
用户级线程的实现(借助中间系统)
2.6.1内核支持线程KST
在内核空间实现的优点和缺点
优点:
在多处理机系统中,内核可同时调度同一进程的多个线程
如一个线程阻塞了,内核可调度其他线程(同一或其他进程)。
线程的切换比较快,开销小。
内核本身可采用多线程技术,提高执行速度和效率。
缺点:
对用户线程,开销较大(需要用户态切换到内核态)
2.6.2用户级线程ULT
用户空间实现
优点:
线程切换不需要转换到内核空间
调度算法可以是进程专用的
线程的实现与OS平台无关
缺点:
系统调用的阻塞问题:一个线程阻塞,全部线程阻塞。
多线程应用不能利用多处理机进行多重处理的优点。
2.6.3ULT与KST组合方式
多对一模型
一对一模型
多对多模型
2.6.4多对一模型
- 多个用户线程映射到一个内核线程
- 多个线程不能并行运行在多个处理器上
- 线程在用户态执行,因此是高效的,但一个线程的阻塞系统调用会导致整个进程的阻塞
2.6.5一对一模型
- 内个用户级别线程映射到一个内核线程
- 相较于多对一模型有更好的并发性
- 允许多个并行运行在多个处理器上
- 创建一个ULT需要创建一个KLT,效率较差
例子:Linux WIndows95
2.6.6多对多模型
多个用户级别线程映射为相等或小于数目的内核线程
允许操作系统创建足够多的KLT