1. 进程控制
进程控制的主要功能是对系统中所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。简单理解,进程控制就是实现进程状态的转换。
实现:通过原语(原语的执行具有原子性,要么全做要么全不做,可以通过两个特权指令——关中断指令和开中断指令来实现。CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才恢复检查,这样,关中断和开中断之间的这些指令序列就是不可被中断的,这就实现了原子性)
2. 进程控制相关原语
2.1 创建原语(创建态就绪态)
- 申请空白PCB
- 为新进程分配所需资源
- 初始化PCB
- 将PCB插入就绪队列
2.2 撤销原语(就绪态/阻塞态/运行态终止态无)
- 从PCB集合中找到终止进程的PCB
- 若进程正在运行,则立即剥夺CPU,将CPU分配给其他进程
- 终止其所有子进程(进程间的关系是树形结构)
- 将该进程拥有的所有资源归还给父进程或OS
- 删除PCB
2.3 阻塞原语
- 找到要阻塞的进程对应的PCB
- 保护进程运行现场,将PCB状态信息设置为阻塞态,暂时停止进程的运行
- 将PCB插入相应的事件等待队列
2.4 唤醒原语
- 在事件等待队列中找到PCB
- 将PCB从等待队列中移除,设置进程为就绪态
- 将PCB插入就绪队列,等待被调度
2.5 切换原语
- 将运行环境存入PCB
- PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复进程所需的运行环境
小结:无论哪个进程控制原语,要做的无非三类事情——更新PCB中的信息、将PCB插入合适的队列、分配或回收资源
3. 进程通信
顾名思义,就是进程之间的信息交换。进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证安全,一个进程不能直接访问另一个进程的地址空间,但是进程之间的信息交换又是必须实现的,为此OS提供了三种方法,分别是:共享存储、消息传递、管道通信。
3.1 共享存储
两个进程被OS分配一个共享空间。不过两个进程对共享空间的访问必须是互斥的(通过OS提供的工具来实现),OS只负责提供共享空间和同步互斥工具
- 基于数据结构的共享:比如共享空间里只能存放一个固定长度的数组,这种方式速度慢,限制多,属于低级通信方式
- 基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是OS,高级通信方式,速度更快
3.2 管道通信
- 管道是指用于连续读写进程的一个共享文件,其实就是在内存中开辟的一个大小固定的缓冲区。
- 管道只能采用半双工通信,某一段时间内只能实现单向传输。如果要实现双向同时通信,则需要设置两个管道
- 各进程要互斥地访问管道,数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走之后,管道变空,此时读进程的read()系统调用将被阻塞
- 如果没写满,就不允许读,如果没读空,就不允许写
- 数据一旦被读出,就从管道中被丢弃,这就意味着读进程最多只能有一个
3.3 消息传递
进程间的数据交换以格式化的消息(Message)为单位,进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换
- 直接通信:消息直接挂到接收进程的消息缓冲队列上
- 间接通信:消息要先发送到中间实体(信箱)中,因此也称信箱通信方式
网友评论