并发出现的上下文
- 多个应用程序:多道程序设计技术允许在多个活动的应用程序间动态的共享处理器时间。
- 结构化应用程序:作为模块化设计和结构化设计的扩展,应用程序可以有效的设计成一组并发执行的进程。
- 操作系统结构:操作系统本身也是由一组并发的进程或线程组成。
支持并发进程的基本要求是加强互斥能力,当一个进程被赋予互斥能力时,那么在其活动期间,它具有排斥其他所有进程的能力。这里主要介绍三种实现互斥方法:信号量、管程和消息传递。
和并发相关的关键术语
术语 | 说明 |
---|---|
原子操作 | 一个或多个指令的序列,对外是不可分割的,即没有其他进程可以看到中间状态或中断此操作 |
临界区 | 是一段代码,在这段代码中进程将访问共享资源,当另外一个进程已经在这段代码中运行时,这个进程就不能在这段代码中执行 |
互斥 | 当一个进程在临界区访问共享资源时,其他进程不能进入临界区访问任何共享资源,这种情形叫互斥 |
竞争条件 | 多个进程或线程在读写一个共享数据时,结果依赖于他们执行的相对时间,这种情形叫竞争 |
死锁 | 两个或以上的进程因其中每个进程都在等待其他进程做完某件事情而不能继续执行,这样的情形叫死锁 |
活锁 | 两个或以上的进程为了响应其他进程中的变化而持续改变自己的状态而不做有用的工作,这样的情形叫活锁 |
饥饿 | 一个可运行的进程虽然能继续执行,但被调度器无限期的忽视,而不能调度执行的情况 |
多道程序设计系统的基本特征
进程的相对执行速度不可预测,它取决于其他进程的活动、操作系统处理中断的方式以及操作系统的调度策略,带来了下列困难:
- 全局共享资源充满了危险
- 操作系统很难对资源最优化分配
- 定位程序设计错误是非常困难
互斥的要求
为了提供对互斥的支持,必须满足以下要求:
1. 必须强制实施互斥:在与相同资源或共享对象的临界区有关的所有的进程中,一次只允许一个进程进入临界区。
2. 一个在非临界区停止的进程不其干涉其他进程。
3. 决不允许出现需要访问临界区的进程被无限延迟的情况,即不会产生死锁和饥饿。
4. 当没有进程在临界区时,任何需要进入临界区的进程必须能够立即进入。
5. 对相关进程的执行速度和处理器数目没有任何要求和限制。
6. 一个进程驻留在临界区的时间必须是有限的。
常用并发机制
并发机制 | 说明 |
---|---|
信号量 | 用于进程间传递信号的一个整数值。在信号量上面只有三种操作可以执行,初始化、递减和增加,这三种操作都是原子操作。递减操作用于阻塞一个进程,增加操作可以用于解除阻塞一个进程。也称为计数信号量或一般信号量 |
二元信号量 | 只取0值和1值的信号量 |
互斥量 | 类似于二元信号量。关键区别在于为其加锁的进程和为其解锁的进程必须为同一进程 |
条件变量 | 一种数据结构,用于阻塞进程或者线程,直到特定条件为真 |
管程 | 一种编程语言结构,在一个抽象数据结构中封装了变量、访问过程和初始化代码。管程的变量只能由管程自己的访问过程来访问,每次只能有一个进程在其中执行。访问过程即临界区。管程可以有一个等待进程的队列 |
自旋锁 | 一种互斥机制,进程在一个无条件循环中执行,等待锁变量的值变为可用 |
信箱/消息 | 两个进程交换信息的一种方法,也可以用于同步 |