(一)基本概念
进程管理也称为处理机管理。
进程是资源分配和独立运行的基本单位。
1.程序与进程
程序顺序执行的特征:
- 顺序性
- 封闭性
- 可再现性
程序并发执行的特征:
- 失去了程序的封闭性
- 程序和机器的执行程序的活动不再一一对应
- 并发程序间的相互制约性
2.进程的组成
进程 是程序的一次执行,该程序可以和其他程序并发执行。
进程通常是由程序、数据和进程控制块(PCB
)组成的。
3.进程的状态及其状态间的切换
- 三态模型:运行、就绪、阻塞
- 五态模型:新建、就绪、运行、阻塞、终止
- 具有挂起状态的进程状态及其转换:活跃就绪、静止就绪、活跃阻塞、静止阻塞
(二)进程的控制
进程控制 就是对系统中的所有进程从创建到消亡的全过程实施有效的控制。
原语 是指若干条机器指令组成的,用于完成特定功能的程序段。
原语在执行时不能被分割。
(三)进程间的通信
进程通信 是指各个进程交换信息的过程。
1.同步与互斥
同步 是合作进程间的直接制约问题,互斥是申请临界资源进程间的间接制约问题。
进程的同步: 是指在系统中一些需要相互合作,协同工作的进程,这样的相互联系称为进程的同步。
进程间的互斥: 是指系统中多个进程因争用临界资源而互斥执行。
临界资源: 在多道程序系统环境中,各进程可以共享各类资源,但有些资源一次只能供一个进程使用,称为临界资源,如打印机、共享变量和表格等。
临界区: 是进程中对临界资源实施操作的那段程序。
对互斥临界区管理的原则:
- 有空即进
- 无空则等
- 有限等待
- 让权等待
2.信号量机制
信号量机制是一种有效的进程同步与互斥工具。
信号量机制主要有:整型信号量、记录型信号量、信号量集机制。
信号量S
的物理意义:S>=0
表示某资源的可用数,若S<0
,则其绝对值表示阻塞队列中等待该资源的进程数。
PV
操作是实现进程同步与互斥的常用方法。
P
操作表示申请一个资源,V
操作表示释放一个资源。
P操作: S:=S-1
,若S>=0
,则执行P
操作的进程继续执行;若S<0
,则置该进程为阻塞状态(因为无可用资源),并将其插入阻塞队列。
V操作: S:=S+1
,若S>0
,则执行V
操作的进程继续执行;若S<=0
,则从阻塞状态唤醒一个进程,并将其插入就绪队列,然后执行V
操作的进程继续。
利用PV
操作实现进程的互斥与同步。
3.高级通信原语
高级通信方式分为:
- 共享存储模式,相互通信的进程共享某些数据结构(或存储区)实现进程之间的通信;
- 消息传递模式,直接利用系统提供的一组通信命令来实现通信;
- 管道通信,管道是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件。
(四)管程
1.管程的引入
管程: 采用资源集中管理的方法,将系统中的资源用某种数据结构抽象地表示出来。
管程由一些共享数据、一组能为并发进程所执行的作用在共享数据上的操作的集合、初始代码及存取权组成。
2.管程的结构
每一个管程都有一个名字以供标识。
(五)进程调度
进程调度方式是指当有更高优先级的进程到来时如何分配CPU
。
调度方式分为:
- 可剥夺,当有更高优先级的进程到来时,强行将正在运行进程的
CPU
分配给高优先级的进程; - 不可剥夺。当有更高优先级的进程到来时,必须等待正在运行进程自动释放占用的
CPU
,然后将CPU
分配给更高优先级的进程。
1.三级调度
三级调度:
- 高级调度(长调度、作业调度、接纳调度)
- 中级调度(中程调度、对换调度)
- 低级调度(短程调度、进程调度)
2.调度算法
常用的调度算法有:
- 先来先服务(
FCFS
) - 时间片轮转
- 固定时间片
- 可变时间片
- 优先级调度
- 静态优先级
- 动态优先级
- 多级反馈调度
3.进程优先级确定
需要考虑的情况:
- 对于
I/O
型进程,让其进入最高优先级队列,以及时响应需要I/O
交互的进程。通常执行一个小的时间片,在该时间片内要求可处理完一次I/O
请求的数据,然后转入到阻塞队列。 - 对于计算型进程,每次都执行完时间片后进入更低级队列,最终采用最大时间片来执行,以减少调度次数。
- 对于
I/O
次数不多,主要是CPU
处理的进程,在I/O
完成后,返回优先I/O
请求时离开的队列,以免每次都回到最高优先级队列后再逐次下降。 - 为适应一个进程在不同时间段的运行特点,
I/O
完成时,提高优先级;时间片用完时,降低优先级。
(六)死锁
死锁: 指两个以上的进程互相都要求对方已经占有的资源导致无法继续运行下去的现象。
1.死锁产生的原因及4个必要条件
- 互斥条件
- 请求保持条件
- 不可剥夺条件
- 环路条件
2.死锁的处理
- 鸵鸟策略
- 预防策略
- 避免策略
- 检测与解除死锁
(七)线程
传统的进程有两个基本属性:
- 可拥有资源的独立单位
- 可独立调度和分配的基本单位
引入线程后,将传统进程的两个基本属性分开,线程作为调度和分配的基本单位,进程作为独立分配资源的单位。
线程分类:
- 用户级线程,不依赖于内核,该类线程的创建、撤销和切换都不利用系统调用来实现;
- 内核支持线程,依赖于内核,即无论是在用户进程中的线程,还是在系统中的线程,它们的创建、撤销和切换都利用系统调用来实现。