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)为单位,进程通过操作系统提供的发送消息/接收消息两个原语进行数据交换

  • 直接通信:消息直接挂到接收进程的消息缓冲队列上
  • 间接通信:消息要先发送到中间实体(信箱)中,因此也称信箱通信方式