进程的三种基本状态
进程是程序的一次执行
- 运行态:占有CPU,并在CPU上运行
- 就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行
- 阻塞态:因等待某一事件而暂时不能运行
此外还有创建态、终止态
进程状态的转换
进程控制
实现进程状态的转换
用原语实现进程控制。原语的特点是执行期间不允许中断, 只能一气呵成。原语采用关中断指令和开中断指令实现。
把PCB放入队列当中,并且保证,PCB当中的数据也被修改。
原语运行在核心态。
进程控制会导致进程状态的转换。无论哪个原语,要做的就三类事情:
- 更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
- 所有进程控制原语一定都会修改进程状态标志
- 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- 某进程开始运行前必然要恢复其运行环境
- 将PCB插入合适的队列
- 分配 / 回收资源
进程通信
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有内存地址空间相互独立。
共享存储
两个进程对共享空间的访问必须是互斥的。
- 基于数据结构的共享
- 基于存储区的共享
消息传递
消息头:发送进程ID、接收进程ID、消息类型、消息长度等格式化的信息
-
直接通信方式
消息直接挂到接收进程的消息缓冲队列上。 -
间接通信方式
消息要发送到中间实体中
管道通信
管道只能采用半双工通信,某一时间段内只能实现单向传输。
各进程要互斥地访问管道
数据一旦被读出,就从管道中被抛弃,读进程最多只能有一个,否则可能会有读错数据的情况。
线程
线程成为了程序执行流的最小单位,是一个基本的CPU执行单元。
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)
内核级线程
用户级线程
多线程模型
多对一模型:多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
多对多模型:克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
补充
“挂起”和“阻塞”区别:
两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下,进程映像还在内存中。
进程调度
进程调度,就是按照某种算法,从就绪队列中选择一个进程为其分配处理机。
进程同步、进程互斥
同步也称为直接制约关系,它是为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源自于他们之间的相互合作。
我们把一个时间段内只允许一个进程使用的资源称为临界资源。
对临界资源的访问,必须互斥进行。
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。
- 忙则等待。当已有进程进入临界区,其他试图进入临界区的进程必须等待。
- 有限等待
- 让权等待
进程互斥的软件实现方法
- 单标志法:
两个进程在访问完临界区后,会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。
turn表示当前允许进入临界区的进程号,而只有当前允许进入临界区的进程在访问了临界区之后,才会修改turn的值。
-
双标志先检查
设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿。比如flag[0] = true,意味着0号进程P0现在想要进入临界区。每个进程在进入临界区之前先检查有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。
主要问题在于:违反了“忙则等待”的原则 -
双标志后检查
前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,先上锁后检查也是一种策略
-
Peterson算法
在双标志后检查法中,两个进程都争着想进入临界区,最后都无法进入临界区。可以先让进程尝试主动让对方先使用临界区。
Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则。但是依然没有遵循让权等待原则,即进入while循环,占用cpu资源,进入忙等状态。
进程互斥的软件实现方法
- 中断屏蔽方法
信号量机制
用户进程可以通过使用操作系统提供了一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。
原语,是一种特殊的程序段,其执行只能一气呵成,不可中断。原语是由关中断、开中断指令实现。
整型信号量
记录型信号量
整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量。
信号量机制实现进程互斥、同步
- 进程互斥
- 分析并发进程的关键活动,划定临界区
- 设置互斥信号量mutex,初值为1
- 在临界区之前执行P
- 在临界区之后执行V
- 进程同步
比如,P1、P2并发执行,由于存在异步性,因此二者交替推进的次序是不确定的。
- 分析
P22!!!