进程同步
进程同步概念
在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。为了协调进程之间的相互制约关系,引入了进程同步的概念。
举个例子:例如让系统计算1+2*3,假设系统产生2个进程,1个是加法进程,1个是乘法进程。要让计算结果正确,必须先是计算乘法后计算加法,如果不加以制约那么加法的进程可能在乘法之前,那么结果就会出错。因此引入了同步机制。
同步概念
- 同步也叫
制约关系
,同步是指为了完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待
,传递信息所产生了制约关系。
临界资源概念
一个时间段内
只允许一个进程
使用的资源称为临界资源
例:物理设备(比如摄像头、打印机)都属于临界资源。此外还有许多变量、数据、内存缓冲区等都属于临界资源。
互斥概念
- 互斥,亦称间接制约关系。进程互斥指当
一个进程访问某临界资源时
,另一个想要访问该临界资源的进程必须等待
。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。 - 所以对
临界资源
的访问,必须互斥
地进行。
系统中的2中资源共享方式
- 互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但
一个时间段内只允许一个进程访问该资源
- 同步共享方式:系统中的某些资源,
允许一个时间段内由多个进程“同时”对它们进行访问
对临界资源的互斥访问
在逻辑上分为如下四个部分:
do
{
entry section; //进入区
critical section; //临界区
exit section; //退出区
remainder section; //剩余区
}while(true)
如下图:
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
1.空闲让进
: 临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
2. 忙则等待
: 当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
3. 有限等待
:对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
4. 让权等待
:当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
进程互斥的软件实现方法
如果没有进程互斥会发生什么呢?
那如何实现互斥呢?
单标志法
算法思想
- 两个进程在访问完
临界区后
会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予
举个例子:
只能按 P0 -> P1 -> P0 -> P1 ->……这样轮流访问。这种必须“轮流访问”带来的问题是,如果此时允许进入临界区的进程是 P0,而 P0 一直不访问临界区,那么虽然此时临界区空闲,但是并不允许 P1 访问.
单标志法存在的主要问题是:
违背“空闲让进”原则
。
双标志先检查
算法思想
- 设置一个布尔型数组 flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如 “flag[0] = ture”意味着 0 号进程 P0 现在想要进入临界区。每个进程在进入临界区之前先检查当前有 没有别的进程想进入临界区,如果没有,则把自身对应的标志 flag[i] 设为 true,之后开始访问临界区。
因为进入临界区的’‘检查’'和"上锁"不是原子操作,可能在上锁前发生进程切换。
- 双标志先检查的问题是:违反了
"忙则等待"
原则。
双标志后检查
后检查法是对先检查法的改进,先上锁,再检查
Peterson 算法
结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔 融让梨”(谦让)
例子:
1,2,3的步骤:
进入区: 1. 主动争取;2. 主动谦让;3. 检查对方是否也想使用,且最后一次是不是自己说了“客气话”
谁最后说了“客气话”,谁就失去了行动的优先权。
场景一:过年了,某