文章目录
进程管理
2.1 进程的概念、组成和特征
概念
程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
进程(Process):是动态的,是程序的一 次执行过程。
组成
一个进程实体(进程映像)由PCB、程序段、数据段组成。 进程是动态的,进程实体(进程映像)是静态的。 进程实体反应了进程在某一时刻的状态(如:x++后,x=2)
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
当进程被创建时,操作系统会为该进程 分配一个唯一的、不重复的“身份证 号”—— PID(Process ID,进程ID)
-
PCB(进程控制块,是进程存在的唯 一标志)
-
程序段
- 程序代码(指令序列)
-
数据段
- 运行过程中产生的各种数据(如:程序中定义的变量)
(PCB 是给操作系统用的。 程序段、数据段是给进程自己用的。)
PCB的作用
- 作为独立运行基本单位的标志
- PCB还进程存在的唯一标识,随着进程的创建而创建消亡结束而消亡
- 能实现间断性运行方式
- 进程堵塞而暂停运行时的CPU现场信息保存在PCB中,以进程调度时恢复CPU现场使用
- 提供进程管理所需要的信息
- PCB中记录了程序和数据在内、外存始址指针,以及进程所需资源清单等
- 提供进程调度所需要的信息
- PCB中记录了进程的状态、优先级、已执行时间等。
- 实现与其它进程的同步与通信
- PCB中有响应的同步信号量
特征
- 动态性
- 进程的最基本特征
- 并发性
- 独立性
- 进程能独立运行、独立获得资源、独立接受调度的基本单位
- 异步性
- 各进程以不可预知的速度向前推进,可能导致运行结果的不确定性
- 结构性
2.2 进程的状态与转换
进程的状态
- 创建态
- 操作系统会为进 程分配资源、初始化PCB
- 就绪态
- 进程已具备运行条件, 但由于没有空闲CPU,暂时不能运行
- 运行态
- CPU会执行该进程对应的程序(执行指令序列)
- 阻塞态
- 终止态
- 下CPU,系统回收资源
进程状态的转换
进程PCB中,会有一个变量 state 来表示进程的当前状态。
进程的组织方式
-
线性方式
-
将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中
-
实现简单、开销小,但每次查找时都需要扫描整张表,
因此适合进程数目不多的系统。
-
-
链式方式
- 按照进程状态将PCB分为多个队列
- 操作系统持有指向各个队列的指针
-
索引方式
- 根据进程状态的不同,建立几张索引表
- 操作系统持有指向各个索引表的指针
2.3 进程控制
基本概念
- 实现进程状态的转换
- 用“原语”实现
原语
原语是一种特殊的程序段,它的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。
可以用 “关中断指令”和“开中断指令”这两个特权指令实现原子性
CPU执行了关中断指令之后,就不再例行 检查中断信号,直到执行开中断指令之后 才会恢复检查。
进程控制相关的原语
程序的运行
CPU中会设置很多 “寄存器”,用来存 放程序运行过程中所 需的某些数据。
- 一些寄存器eg:
- PSW:程序状态寄存器
- PC:指令寄存器,存放当前正在执行的指令
- IR:指令寄存器,存当前正在执行的指令
- 通用寄存器:其他一些必要的信息
进程控制会导致进程状态的转换。无论哪个进程控制原语,要做的无非三类事情:
-
更新PCB中的信息
a. 所有的进程控制原语一定都会修改进程状态标志
b. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
c. 某进程开始运行前必然要恢复期运行环境
-
将PCB插入合适的队列
-
分配/回收资源
2.4 进程的通信
各进程拥有的内存地址空间相互独立。一个进程不能直接访问另一个进程的地址空间。为了保证进程间的安全通信,操作系统提供了一些方法。
共享存储
两进程对共享空间的访问必须是互斥的(eg:互斥工具P、V操作)
- 基于数据结构的共享(低级通信方式)
- 基于存储区的共享(高级通信方式)
消息传递
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收 消息”两个原语进行数据交换。
- 直接通信方式
- 消息直接挂到接收进 程的消息缓冲队列上
- 间接通信方式
- 消息要先发送到中间实体(信箱)中,因此 也称“信箱通信方式”。Eg:计网中的电子 邮件系统
管道通信
(“管道”一个大小固定的缓冲区)
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
- 各进程要互斥地访问管道。
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
- 如果没写满,就不允许读。如果没读空,就不允许写。
- 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。