所有学嵌入式Linux系统的看过来了,以下内容是每一位想学习Linux嵌入式系统想要了解的内容,真的很想要分享给大家!
本文分享的内容主要如下几个方面:
3.1 并发的原理
3.1.1 一个简单的例子
3.1.2 竞争条件
3.1.3 操作系统关注的问题
3.1.4 进程的交互
3.1.5 互斥的要求
3.2 信号量原理
3.2.1 互斥
3.3 生产者/消费者问题
3.4 读者-写者问题
3.3.1 读进程具有优先权
3.3.2 写进程具有优先权
本章首先介绍并发的概念和多个并发进程的执行。我们发现,支持并发进程的基本需求是加强互斥的能力。也就是说,当一个进程被授予互斥的能力时,那么在其活动期间,它具有排斥所有其他进程的能。
本章通过两个经典的并发问题来说明并发的概念,并对本书中使用的各种方法进行比较。在本章开始
将介绍一个可运行的例子——生产者/消费者问题,读者-写者问题。
3.1 并发的原理
在单处理器多道程序设计系统中,进程被交替执行,表现出一种并发执行的外部特征。即使不能实现真正的并行处理,并且即使在进程间来回切换需要一定的开销,交替执行在处理效率和程序构造上还是带来了重要的好处。
在单处理器的情况下,问题源于多道程序设计系统的一个基本特性:进程的相对执行速度不可预测,
它取决于其他进程的活动、操作系统处理中断的方式以及操作系统的调度策略。这就带来了下列困难:
全局资源的共享充满了危险。例如,如果两个进程都使用同一个全局变量,并且都对该变量执行读
写操作,那么不同的读写执行顺序是非常关键的。关于这个问题的例子将在下一小节中给出。
操作系统很难对分配资源进行最优化的管理。例如,进程 A 可能请求使用一个特定的 I/O 通道,并
获得控制权,但它在使用这个通道前被挂起了,操作系统仍然锁定这个通道,以防止其他进程使用,
这是难以令人满意的。此外,这还会导致死锁。
定位程序设计错误是非常困难的。这是因为结果通常是不确定的和不可再现的。
上述所有困难在多处理器系统中都有具体的表现,因为在这样的系统中进程执行的相对速度也是不可
预测的。一个多处理器系统还必须处理多个进程同时执行所引发的问题,从根本上来说,这些问题和单处
理器系统中的是相同的。这些问题随着讨论的深入将逐渐明了。
3.1.1 一个简单的例子
考虑下面的过程:
为理解如何解决与执行速度无关的问题,我们首先需要考虑进程间的交互方式。
3.1.4 进程的交互.
1 、进程中的资源争用
当并发进程竞争使用同一个资源时,它们互相之间会发生冲突。我们可以把这种情况简单描述如下:
两个或更多的进程在它们的执行过程中需要访问一个资源,每个进程并不知道其他进程的存在,并且每个进程也不受其他进程的执行的影响。每个进程都不影响它所使用的资源的状态,这类资源包括 I/O 设备、存储器、处理器时间和时钟。
竞争进程间没有任何信息交换,但是一个进程的执行可能会影响到竞争进程的行为。特别是如果两个进程都期望访问同一个资源,操作系统把这个资源分配给一个进程,另一个就必须等待。因此,被拒绝访
问的进程速度就会变慢。一种极端情况是,被阻塞的进程永远不能访问这个资源,因此一直不能成功地终止。
竞争进程面临三个控制问题。首先是互斥的要求。假设两个或更多的进程需要访问一个不可共享的资
源,如打印机。在执行过程中,每个进程都给该 I/O 设备发命令,接收状态信息,发送数据和接收数据。
我们把这类资源称为临界资源,使用临界资源的那一部分代码称为程序的临界区。一次只允许有一个程序在临界区中,这一点是非常重要的。由于不清楚详细要求,我们不能仅仅依靠操作系统来理解和增强这个限制。例如在打印机的例子中,我们希望任何一个进程在打印整个文件时都拥有打印机的控制权,否则在打印结果中就会穿插着来自竞争资源的打印内容。
实施互斥产生了两个额外的控制问题。一个是 死锁。例如,考虑两个进程 Pl 和 P2,以及两个资源 Rl
和 R2,假设每个进程为执行部分功能都需要访问这两个资源,那么就有可能出现下列情况:操作系统把 Rl分配给 P2,把 R2 分配给 Pl,每个进程都在等待另一个资源,并且在获得其他资源并完成需要这两个资源的功能之前,谁都不会释放自己已经拥有的资源。这样,这两个进程就发生了死锁。
另一个控制问题是 饥饿。假设有三个进程(P1、P2 和 P3),每个进程都周期性地访问资源 R。考虑这种情况,Pl 拥有资源,P2 和 P3 都被延迟,等待这个资源。当 Pl 退出临界区时,P2 和 P3 都允许访问 R。假设操作系统把访问权授予 P3,并且在 P3 完成临界区之前 PI 又需要访问该临界区,如果在 P3 结束后操作系统又把访问权授予 Pl,并且接下来把访问权轮流授予 Pl 和 P3,那么即使没有死锁,P2 也可能无限期地被拒绝访问资源。
由于操作系统负责分配资源,竞争的控制不可避免地涉及到操作系统。此外,进程自身需要能够以某
种方式表达互斥的要求,如在使用资源前锁定资源,但任何一种解决方案都涉及到操作系统的某些支持,如提供锁机制。图 3.2 用抽象术语给出了互斥机制。假设有 n 个进程并发执行,每个进程包括(1)在某些资源 Ra 上操作的临界区,(2)不涉及访问资源 Ra 的额外代码。因为所有的进程都需要访问同一资源 Ra,因此保证在同一时刻只有一个进程在临界区是很重要的。为实现互斥,需要两个函数:entercritical 和exitcritical。每个函数的参数都是竞争使用的资源名,如果另外一个进程在临界区中,那么任何试图进入关于同一个资源的临界区的讲程都必须等待。
本章总结
现代操作系统的中心方案是多道程序设计、多处理和分布式处理,这些方案的基础以及操作系统设计
技术的基础是并发。当多个进程并发执行时,不论是在多处理器系统的情况下,还是在单处理器多道程序系统中,都会产生解决冲突和合作的问题。
并发进程可以按多种方式进行交互。互相之间不知道对方的进程可能需要竞争使用资源,如处理器时
间或对 I/O 设备的访问。进程间由于共享访问一个公共对象,如主存中的一块空间或一个文件,可能间接知道对方,这类交互中产生的重要问题是互斥和死锁。
互斥是指,对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能。互
斥技术可以用于解决诸如资源争用之类的冲突,还可以用于进程间的同步,使得它们可以合作。后一种情况的一个例子是生产者/消费者模型,一个进程往缓冲区中放数据,另一个或更多的进程从缓冲区中取数据。
支持互斥的第二种方法涉及到使用专门的机器指令,这种方法减少了开销;但由于使用了忙等待,因
而仍然是低效的。
支持互斥的另一种方法是在操作系统中提供功能,其中最常见的两种技术是信号量和消息机制。信号
量用于在进程间发信号,并可以很容易地用于实施一个互斥规定。消息对实施互斥是很有用的,它还为进程间的通信提供了一种有效的方法。
死锁是指一组争用系统资源或互相通信的进程被阻塞的现象。阻塞是永久的,除非操作系统采取某些
非常的行动,如杀死一个或多个进程,或者强迫一个或多个进程沿原路返回。死锁可能涉及到可重用资源或可消费资源。可重用资源是指不会因为使用而被耗尽或毁灭的资源,如 I/O 通道或存储器区域。可消费资源是指当被一个进程获得时就毁灭了的资源,这类资源的例子有消息和 I/O 缓冲区中的信息。
处理死锁通常有三种方法:预防、检测和避免。死锁预防通过确保死锁的一个必要条件不会满足,保
证不会发生死锁。本章没有对检测和避免进行深入讨论。
,