操作系统-并发性:互斥与同步

知识结构体系

知识架构

操作系统设计中的核心问题是进程和线程的管理

那么关于进程和线程的管理涉及到的问题就包括:

  1. 多道程序设计技术:管理单处理器系统中的多个进程。
  2. 多处理器技术:管理多处理器系统中的多个进程。
  3. 分布式处理器技术:管理多台分布式计算机系统中多个进程的执行。最近迅猛发展的集群就是这类系统的典型例子。

要处理好上面所说的问题,就不得不提到并发,并发是所有问题的基础,也是操作系统设计的基础。并发包括很多设计问题,其中有进程间通信、资源共享与竞争(如内存、文件、I/O访问)、多个进程活动的同步以及给进程分配处理器时间等。我们将会看到这些问题不仅会出现在多处理器环境和分布式处理器环境中,也会出现在单处理器的多道程序设计系统中。

并发会在以下三种不同的上下文中出现:

  1. 多应用程序:多道程序设计技术允许在多个活动的应用程序间动态共享处理器时间。
  2. 结构化应用程序:作为模块化设计和结构化程序设计的扩展,一些应用程序可被有效地设计成一组并发进程。
  3. 操作系统结构:同样的结构化程序设计优点适用于系统程序,且我们已知操作系统自身常常作为一组进程或线程实现。

在接下来的描述中,你将会看到以下内容:

  1. 首先介绍并发的概念和多个并发进程执行的含义。我们发现,支持并发进程的基本需求是加强互斥的能力。也就是说,当一个进程被授予互斥能力时,那么在其活动期间,它具有排斥所有其他进程的能力。
  2. 接下来介绍支持互斥的硬件机制。
  3. 最后介绍一些不需要忙等待,由操作系统或语言编译器支持的互斥解决方案。这里将讨论三种方法:信号量、管程和消息传递。

同时,本章通过两个经典的并发问题(1. 生产者/消费者问题 2.读者/写者问题)来说明并发的概念,并对本书中使用的解决并发的各种方法进行比较。

在介绍并发之前,我们先来看看关于并发的关键术语。
并发关键术语

5.1 并发的原理

在单处理器多道程序设计系统中,进程会被交替地执行,因而表现出一种并发执行的外部特征。即使不能实现真正的并行处理,并且在进程间来回切换也需要一定的开销,交替执行在处理效率和程序结构上还是会带来很多好处。在多处理器系统中,不仅可以交替执行进程,而且可以重叠执行进程。

从表面上看,交替和重叠代表了完全不同的执行模式和不同的问题。实际上,这两种技术都可视为并发处理的一个实例,并且都代表了同样的问题。在单处理器情况下,问题源于多道程序设计系统的一个基本特性:进程的相对执行速度不可预测,它取决于其他进程的活动、操作系统处理中断的方式以及操作系统的调度策略。这就带来了下列困难:

  1. 全局资源的共享充满了危险。
  2. 操作系统很难对资源进行最优化分配。例如,进程A可能请求使用一个特定的I/O通道,并获得控制权,但它在使用这个通道前已被阻塞,而操作系统仍然锁定这个通道,以防止其他进程使用,这是难以令人满意的。事实上,这种情况有可能导致死锁,详见第6章。
  3. 定位程序设计错误非常困难。这是因为结果通常是不确定的和不可再现的。

上述所有困难在多处理器系统中都有具体的表现,因为在这样的系统中进程执行的相对速度也是不可预测的。多处理器系统还必须处理多个进程同时执行所引发的问题,从根本上说,这些问题和单处理器系统中的是相同的,随着讨论的深入,这些问题将逐渐明了。

5.1.1 竞争条件

竞争条件发生在多个进程或线程读写数据时,其最终结果取决于多个进程的指令执行顺序。考虑下面两个简单的例子。

在第一个例子中,假设两个进程P1和P2共享全局变量a。在Pl执行的某一时刻,它将a的值更新为1,在P2执行的某一时刻,它将a的值更新为2。因此,两个任务竞争更新变量a。在本例中,竞争的“失败者”(即最后更新全局变量a的进程)决定了变量a的最终值。

在第二个例子中,考虑两个进程P3和P4共享全局变量b和c,且初始值为b=1,c=2。在某一执行时刻,P3执行赋值语句b=b+c,在另一执行时刻,P4执行赋值语句c=b+c。两个进程更新不同的变量,但两个变量的最终值取决于两个进程执行赋值语句的顺序。若P3首先执行赋值语句,则最终值为b=3,c=5;若P4首先执行赋值语句,则最终值为b=4,c=3。

总结为一句话的话,就是上面关于并发的关键术语中所说的:多个线程或进程在读写一个共享数据时,结果依赖于它们执行的相对时间的情形

操作系统必须保证一个进程的功能和输出结果必须与执行速度无关(相对于其他并发进程的执行速度)。这是本章的主题。为理解如何解决与执行速度无关的问题,我们首先需要考虑进程间的交互方式。

5.1.2 进程的交互

我们可以根据进程相互之间知道对方是否存在的程度,对进程间的交互方式进行分类。下表列出了三种可能的感知程度及每种感知程度的结果。

  • 进程之间相互不知道对方的存在:这是一些独立的进程,它们不会一起工作。关于这种情况的最好例子是多个独立进程的多道程序设计,可以是批处理作业,也可以是交互式会话,或者是两者的混合。尽管这些进程不会一起工作,但操作系统需要知道它们对资源的竞争情况。例如,两个无关的应用程序可能都想访问同一个磁盘、文件或打印机。操作系统必须控制对它们的访问。
  • 进程间接知道对方的存在:这些进程并不需要知道对方的进程ID,但它们共享某些对象,如一个I/0缓冲区。这类进程在共享同一个对象时会表现出合作行为(cooperation)。
  • 进程直接知道对方的存在:这些进程可通过进程ID互相通信,以合作完成某些活动。同样,这类进程表现出合作行为。
    进程的交互实际条件并不总是像表5.2中给出的那么清晰,例如几个进程可能既表现出竞争,又表现出合作。然而,对操作系统而言,分别检查表中的每一项并确定它们的本质是必要的。接下来,我们将对上面三项关系进行一一的阐述。

进程间的资源竞争:

当并发进程竞争使用同一资源时,它们之间会发生冲突。我们可以把这种情况简单描述如下:两个或更多的进程在它们的执行过程中需要访问一个资源,每个进程并不知道其他进程的存在,且每个进程也不受其他进程的影响。每个进程都不影响它所用资源的状态,这类资源包括IVO设备、存储器、处理器时间和时钟。

竞争进程间没有任何信息交换,但一个进程的执行可能会影响到竞争进程的行为。特别是当两个进程都期望访问同一个资源时,如果操作系统把这个资源分配给一个进程,那么另一个进程就必须等待。因此,被拒绝访问的进程的执行速度就会变慢。一种极端情况是,被阻塞的进程永远不能访问这个资源,因此该进程永远不能成功结束运行。

竞争进程面临三个控制问题。首先需要互斥(mutual exclusion)。假设两个或更多的进程需要访问一个不可共享的资源,如打印机。在执行过程中,每个进程都给该IVO设备发命令,接收状态信息,发送数据和接收数据。我们把这类资源称为临界资源(critical resource),使用临界资源的那部分程序称为程序的临界区(critical section)。一次只允许有一个程序在临界区中,这一点非常重要。由于不清楚详细要求,我们不能仅仅依靠操作系统来理解和增强这个限制。例如在打印机的例子中,我们希望任何一个进程在打印整个文件时都拥有打印机的控制权,否则在打印结果中就会穿插着来自竞争进程的打印内容。

实施互斥产生了两个额外的控制问题。

  1. 死锁(deadlock)。例如,考虑两个进程P1和P2,以及两个资源R1和R2,假设每个进程为执行部分功能都需要访问这两个资源,那么就有可能出现下列情况:操作系统把R1分配给P2,把R2分配给P1,每个进程都在等待另一个资源,且在获得其他资源并完成功能前,谁都不会释放自己已拥有的资源,此时这两个进程就会发生死锁。

  2. 饥饿(starvation)。假设有三个进程(P1、P2和P3),每个进程都周期性地访问资源R。考虑这种情况,即P1拥有资源,P2和P3都被延迟,等待这个资源。当P1退出其临界区时,P2和P3都允许访问R,假设操作系统把访问权授予P3,并在P3退出临界区之前P1又要访问该临界区,若在P3结束后操作系统又把访问权授予P1,且接下来把访问权轮流授予P1和P3,那么即使没有死锁,P2也可能被无限地拒绝访问资源。

由于操作系统负责分配资源,竞争的控制不可避免地涉及操作系统。此外,进程自身需要能够以某种方式表达互斥的需求,如在使用前对资源加锁,但任何一种解决方案都涉及操作系统的某些支持,如提供锁机制。

进程间通过共享合作

通过共享进行合作的情况,包括进程间在互相并不确切知道对方的情况下进行交互。例如,多个进程可能访问一个共享变量、共享文件或数据库,进程可能使用并修改共享变量而不涉及其他进程,但却知道其他进程也可能访问同一个数据。因此,这些进程必须合作,以确保它们共享的数据得到正确管理。控制机制必须确保共享数据的完整性。

由于数据保存在资源(设备或存储器)中,因此再次涉及有关互斥、死锁和饥饿等控制问题。唯一的区别是可以按两种不同的模式(读和写)访问数据项,并且只有写操作必须保证互斥。

但是,除这些问题之外还有一个新要求:数据一致性。举个简单的例子,考虑一个关于记账的应用程序,这个程序中可能会更新各个数据项。假设两个数据项a和b保持着相等关系a=b,也就是说,为保持这一关系,任何一个程序如果修改了其中一个变量,也必须修改另一个变量。现在来看下面两个进程:

P1:
	a=a+1;
	b=b+1;
P2:
	b=2*b;
	a=2*a;

如果最初状态是一致的,则单独执行每个进程会使共享数据仍然保持一致状态。现在考虑下面的并发执行,两个进程在每个数据项(a和b)上都考虑到了互斥(也就是修改a或者b变量的时候不会被打断):

	a=a+1;
	b=2*b;
	b=b+
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值