- 互相协作的进程可直接共享逻辑地址空间(即代码和数据),
- 或只通过文件或消息来共享数据。
- 前者可通过轻量级进程或线程来实现,见第4章。
- 共享数据的并发访问产生数据的不一致。
- 本章论各种机制,
- 确保共享同一逻辑地址空间的协作进程可有序地执行,
- 从而能维护数据的一致性。
- 引入临界区域问题,其解决方案可用于确保共享数据的一致性。
- 描述临界区域问题的多种软件解决方案。
- 描述临界区域问题的多种硬件解决方案。
- 引入原子事务的概念,并描述确保原子操作的有关机制
6.1 背景
- 3章论一种系统模型,该模型包括
- 若干协作顺序进或线程,
- 这些进或线均异步执行且共享数据。
- 下用代表性的OS问题,即生产者–消费者问题,举例说明这个模型。
- 3.4.1中,用有限缓冲方案来处理进程共享内存的问题。
- 回到有限缓冲问题的共享内存解决方案。
- 该方案允许同时在缓冲区内最多只有 BUFFER_SIZE-1项。
- 假如要修改这一算法以弥补这个缺陷。
- 增加变量counter,初始为0。
- 向缓冲区增一项, counter增:
- 从缓冲区移走一项, counter减。
- 生产者和消费者程序各自都正确,但并发执行时它们可能不能正确运行。
- 设counter现为5,且生产者进程和消费者并发执行语句
- counter++”和“ counter–”。
- 根据这两条语句的执行,counter的值可能是4、5或6!
- 唯一正确的结果应是 counter=5:如果生产者和消费者独立执行,那么会有正确的结果
- 若按如下方式, counter的值就可能不正确。
- “ counter++”可按如下方式以机器语言(在典型的机器上)实现:
- “ counter–”可按如下方式实现:
- 虽然 register1和 register2可以为同一寄存器(如累加器)
- 但要记住,中断处理程序会保存和恢复该寄存器的值(见1.2.3)
- 并发执行“ counter++”和“ counter–”相当于按任意顺序来交替执行上面所表示的低级语句(每条高级语句内的顺序不能变)。
- 一种交又形式如下
- 现得到了表示有4个缓冲区满了的不正确的状态“ counter=4”,事实上有5个缓冲区满。
- 若交换T4和T5,则会得到不正确的状态“ counter=6”。
- 之所以得到了不正确状态,是因为允许两个进程并发操作变量 counter。
- 像这样的情况,即多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关,称为race condition。
- 为避免竞争条件,需确保一段时间内只有一个进程能操作变量counter。
- 为实现这种保证,要求进行一定形式的进程同步。
- 这种情况经常出现在OS中,因为系统的不同部分操作资源。
- 显然,需要这些变化不会互相影响。
- 由于同步的重要性,因此本章部分都是关于进程同步( process
synchronization)和协调( coordination)的。
6.2 临界区问题
- 某系统有n进程
- 每个进程有一个代码段critical section,该区中进程改变共同变量、更新一个表、写一个文件等。
- 有两个进程可同时在临界区内执行。
- critical-section problem是设计一个以便进程协作的协议。
- 每个进程必须请求允许进入其临界区。
- 实现这一请求的代码段称entry section,临界区之后可有退出区exit section,其他代码为remainder section。
- 一个进程的通用结构如图6.1。
- 进入段和退出段被框起来以突出这些代码段的重要性。