并发的原理
在单处理多道程序设计系统中,进程交替执行,表现出一种同时执行的外部特征。在多处理器系统中,不仅可以交替执行进程,而且可以重叠执行进程。
进程间的资源竞争
程序的资源临界区,使用一个不可共享的资源的程序。
互斥的要求,资源分配一给一个进程,其他进程不能获取。
死锁,两个进程相互等待对方拥有的资源,造成无限等待。
饥饿,一个进程无限期被拒绝访问资源。
进程间通过共享合作
进程间通过通信合作
通信提供了同步和协调各种活动的方法。
不需要互斥。
互斥的要求
- 必须强制实施互斥,在与相同资源或共享对象的临界区有关的所有进程中,一次只允许一个进程进入临界区。
- 在非临界区停止的进程不能干涉其他进程。
- 不允许需要访问临界区的经常被无限延迟。
- 没有进程在临界区时,任何需要进入的进程可以立即进入。
互斥:硬件的支持
中断禁用
临界区不能被中断,所以可以保证互斥。但是会降低程序的执行效率。在多处理器系统中,禁用中断是不能保证互斥的。
专用机器指令
提出机器指令,保证两个动作的原子性。
信号量
定义:用于进程间传递信号的一个整数值。只有三种操作:初始化、递减和增加。都是原子操作。递减用于阻塞进程,增加用于接触阻塞。
基本原理:两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。
- 信号量初始化为非负数;
- semWait操作使信号减一,如果变成负数,则执行semWait的进程被阻塞,否则进程继续执行;
- semSignal操作使信号量加一,如果值大于等于零,则被semWait操作阻塞的进程被解除阻塞。
负值等于正在解除阻塞的进程数量。
互斥
通过信号量来解决互斥问题的方法。每个进程中进入临界区前执行semWait如果s为负数,则进程被挂起,如果值为1,则s被减为0,进程立即进入临界区,由于s不再为正,其他进程都无法进入临界区。
生产者消费者问题
管程
管程是一个而程序设计语言结构,它提供了与信号量同样的功能,但更易于控制。
管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块,特点:
- 局部变量只能被管程访问,任何外部过程都不能访问。
- 一个进程通过调用管程的一个过程进入管程。
- 只能由一个进程进入管程中执行,其他调用管程的进程都被阻塞。
消息传递
进程交互必须满足同步和通信。为了实施互斥,进程必须同步。为了合作,进程必须进程交换数据。