并发性:互斥和同步
5.1 并发的原理principles of concurrency
0. 一些术语
- 临界区:
critical section
一段代码,在这段代码中 进程将共享资源,当另外一个进程已在这段代码中运行时,这个进程就不可在这段代码中执行。同时只允许一个进程访问临界区
-
死锁:
deadlock
两个或以上的进程 因每个进程都在等待其他进程做完某事而不能继续执行。
竞争、协作导致的都不能向后执行,若无外力干预,则都面临饿死。 -
活锁
livelock
两个或两个以上的进程为响应其他进程中的变化而持续改变自己的状态但不做有用的工作情形
- 互斥:
mutual exclusion
当一个进程在临界区访问共享资源时,其他进程不能进入临界区访问共享资源的情形
- 竞争条件:
race condition
多个线程或进程在读写一个共享数据时,结果依赖于他们执行的相对时间情形
- 饥饿
starvation
一个可运行的进程尽管能继续执行,但被调度程序无限期的忽视,而不能被调度执行的情形。
1. 例子
echo 共享过程
- 全局共享资源危险
- 难以对资源做到全局优化分配
- 难以定位程序错误,错误的产生可能是由于代码出错,也可能是由于进程与其余进程 协作出错,资源分配出错
2. 竞争条件
race condition
竞争条件发生在多个进程 或 线程对共享数据进行读写操作,因此数据的最终值取决于 进程指令 对共享数据的操作顺序
3. 操作系统关心的
4.进程的交互
5. 互斥的要求
- 强制互斥:一次只允许一个进程进入临界区
- 一个在非临界区停止的进程不能干涉其他进程
- 不会出现死锁或饥饿
- 当前临界区为空,无论进程的优先级高低,必须能够立即进入
- 对相关进程的执行速度和处理器的数量没有任何要求和限制
- 一个进程驻留在临界区的时间必须是有限的
5.2 互斥:硬件的支持Mutual Exclusion:Hardware Support
1. 中断禁止 interrupt Disabling
单处理机器中,并发不能重叠,只能交替
- 一个进程将一直执行直到 系统服务 或被中断
- 中断提供了交互
- 只需要保证一个进程不被中断即可
缺点:
4. 代价很高
5. 不适合多核,只适合单核
2. 专属机器指令
- 原子性要求:指令周期内,特殊机器指令不会被中断
- 实现过程中:若有进程在访问指令的内存单元,其他进程不能访问该指令所在的内存单元
- 通过机器硬件进行设置
i初始化为0,第一个调用testset的进程将i置为1,并返回true,随后进程调用将返回false,直到第一个进程执行结束,将i重置为0
5.3 信号量 Semaphores
1. Overview
信号量是一种数据结构
包含 一个整数 和一个阻塞队列
2. 互斥 mutual exclusion
3. 生产者/消费者问题 The Producer/Consumer Problem
- 有一个或多个生产者 生产某种类型的数据(记录、字符)并放到缓冲区中
- 有一个消费者从缓冲区中取数据,每次取一项
- 只有一个主体可以访问缓冲区
生产者——in指针向存储单元存放数据,一次存放一条,in指针向后移一个位置
消费者——out指针 从缓冲区逐条取走数据
谁跑得快?
5.4 管程 Monitors
5.5 消息传递 Message Passing
5.6 读者/写者问题 Readers/Writers Problem
名词解释
并行
在同一时间内,有多个进程执行
并发
在同一时刻,有多个进程执行
交替执行
在单处理器系统中,采用多个进程并行时,采用的时交替执行
重叠执行
在多处理器系统中,当多个进程并发时,采用的是重叠执行
互斥
当一个进程在临界区 访问共享资源时,不允许其他进程进入临界区访问共享资源
同步
多个进程的执行顺序有严格的限制,
A通过但缓冲区向buffer中存放数据
B从buffer中读取数据
当buffer中没有数据时,B被阻塞
当A向buffer放数据后,唤醒B进程
临界区
一段代码
在这段代码中 进程将访问共享资源
当一个进程已经执行这段代码时,另一个进程不能执行这段代码
临界资源
1个 或多个进程需要进行访问的一个不可共享的资源
条件竞争
多个线程 或 进程 对一个共享数据进行操作时
最终结果取决于 最后执行的那个进程
原子操作
由 一个或多个 指令组成的一个函数或动作,对外是不可见的
其他进程不知道其中见执行的结果,也不能中断他执行
信号量
用于传递进程间 信号的一个整数值
只有初始化
增加
递减
三个操作