一.进程的状态
- 运行态:占有CPU,并在CPU上运行
- 就绪态:已经具备了运行的条件,一旦获得处理机,即可立即进入运行态
- 阻塞态:因等待某一事件而暂时不能运行
- 创建态:进程正在被创建,操作系统为进程分配资源,初始化PCB
- 终止态:进程正在从系统中撤销,系统正在回收资源,撤销PCB
二.进程状态的转换
- 就绪态—>运行态:进程被调度
- 运行态—>就绪态:时间片到,或者CPU被其他优先级更高的进程抢占
- 运行态—>阻塞态:等待资源分配或等待某事件发生(主动行为)
- 阻塞态—>运行态:等待的资源到位或等待的事件发生(被动行为)
- 创建态—>就绪态:系统完成创建进程的相关工作
- 运行态—>终止态:进程运行结束或运行过程中遇到了不可修复的错误
三.进程控制
- 用原语实现进程控制,原语的特点是一气呵成不中断
- 原语采用关中断和开中断指令实现,这两个指令都是特权指令,要在核心态下执行。
四.进程控制相关的原语
无论哪个进程控制原语,要做的无非三类事情:
-
1.更新PCD中的信息
(1)一定会修改进程状态标志
(2)剥夺当前运行进程的CPU使用权必然需要保存其运行环境
(3)某进程开始运行前必然要恢复其运行环境 -
2.将PCB插入合适的队列
-
3.分配/回收资源
创建原语:
撤销原语:
阻塞和唤醒原语:
- 阻塞原语和唤醒原语必须成对使用
进程切换原语:
五.进程通信
1.概念
- 进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立
- 而为了保证安全,一个进程不能直接访问另一个进程的地址空间
- 但是进程之间的信息交换又是必须进行的,而为了保证进程间的安全通信,操作系统提供了一些方法:共享存储,消息传递,管道通信。
2.共享存储
即设置一个共享空间来进行信息交换
- 两个进程对共享空间的访问必须是互斥的,某一时间段内只能有一个进程访问该共享空间
- 基于数据结构的共享:
该共享空间只能存放某一特定数据结构的数据,比如只能存放长度为10的数组。这种共享方式速度慢,限制多,是一种低级通信方式。 - 基于存储区的共享:
在内存种画出一块共享存储区,数据的形式,存放位置都有进程决定,而不是操作系统。这种共享方式速度快,限制少,是一种高级通信方式。
3.管道通信
- “管道”就是一个连接读写进程的共享文件,其实就是在内存中开辟的一个大小固定的缓存区
- 管道只能采用半双工通信(同一时间段内只能实现单向传输),如果要实现双向传输,需要设置两个管道。
- 各进程依然要互斥的访问管道
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用被阻塞,等待读进程将数据取走。当读进程将数据全部取走以后,管道变空,此时读进程的read()系统调用被阻塞。
- 如果没写满,就不允许读。如果没取空,就不允许写。
- 数据一旦被读出,就从管道中抛弃,这就意味着读进程只能有一个,否则可能会有数据读错的情况。
4.消息传递
- 进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的发送/接收消息两个原语实现信息交换。
-
直接通信方式:消息直接挂到接收进程的消息缓存队列上
进程一通过发送原语将消息挂到进程二的消息缓存队列上去,进程二通过接收原语依次读取消息缓存队列上的消息。
-
间接通信方式:消息要先发送到中间实体(信箱)中
进程一先通过发送原语将消息发送到信箱中去,进程二再通过接收原语从信箱中取走消息
六.小结
- 进程控制通过原语实现
- 剥夺运行进程的CPU时,一定要保存当前的运行环境
- 某个进程开始运行前一定要恢复其运行环境
- PCB要根据此时的状态放入合适的队列
- 进程通信时一定保证信息交换的正确性,一般要求进程互斥的访问共享空间或管道。