进程管理
进程同步,进程互斥问题
概念
异步性:各并发执行的进程以各自独立的,不可预知的速度向前推进。
同步性:进程同步指直接制约关系,有确定的次序。
进程互斥:一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待,只有当访问临界资源的进程结束时,释放资源后,另一个进程才能去访问临界资源。
互斥访问遵循的四个原则
- 空闲让进:临界区空闲,允许一个请求进入临界区的进程了立即进入临界区
- 忙则等待:当已有进程进入临界区,其他试图进入临界区的进程必须等待
- 有限等待:对请求访问的进程,应保证能在有限的时间内进入临界区(不会饥饿)
- 让权等待:当进程不能进入临界区时,应该立即释放处理机,防止进程忙等,
进程互斥的软件实现方法
单标志检查法
设置一个变量,表示谦让。不上锁。不遵循空闲让进的原则。
流程设置标志变量,标志变量的值就是对应的进程号(不一定是进程号),如果标志变量不对,则死等,进入临界区后,把标志变量更改为另一个进程号。
缺点:只能轮流访问,若允许进入临界区的进程时p0,而p0一直不访问临界区,那么虽然会导致临界区空闲,但是p1也不能访问。
双标志先检查法
先检查,后上锁
-
检查有没有人使用资源
-
表示意愿,上锁
-
使用临界资源
-
使用完解锁
缺点:并发运行时,1,5,6,7,2,3,情况要考虑。
-
初始时flag[0],flag[1]都为false;
-
假设p0先上处理机,则走step1,此时flag[1]为false,跳过while循环,但此时产生进程调度,p1进程走step5,此时flag[0]为false,就会导致跳过5的while循环,然后走step6,把flag[1]赋值为true,然后step7。然后进入临界区
-
这时候又发生进程调度,回到p0进程,p0进程走step2,让flag[0]为true,然后进入临界区。
-
此时就违反了忙则等待。
原因在于检查和上锁不能一气呵成。
-
双标志后检查法
先上锁,后检查
-
表示意愿,上锁,
-
检查,有没有人使用
-
无人使用,俺就使用临界资源
-
使用完解锁
问题:1526
- 初始Flag[0] flag[1]都为false;
- 假设p0进程先上处理机,让flag[0]=true,这时候发生进程调度,执行step5
- p1进程让flag[1]=true,然后又切换到P0进程
- 此时p0会陷入while循环,然后又发生进程调度,p1进程也会陷入while循环。
缺点:解决了忙则等待的问题,但违背了空闲让进和有限等待的原则,会无限等待,导致饥饿状态
Peterson算法。
bool flag[2];
int turn = 0;
//p0进程
flag[0] = true; ①
turn = 1; ②
while(flag[1]&&turn==1); ③
critical section; ④
flag[0] = false; ⑤
remainder section;
//p1进程
flag[1] = true; ⑥
turn = 0; ⑦
while(flag[0]&&turn==0); ⑧
critical section; ⑨
flag[1] = false; ⑩
remainder section;
分析16278
- 开始flag初始值都为false,turn=0;
- 执行step1,flag[0]=true,然后进程调度,step6执行 flag[1]=true;
- step2此时turn=1,step7执行然后turn=0;所以最后turn=0并且flag[0]=true,然后执行step8,p1陷入while循环。
- 所以最后时p0进程进入临界区。
分析123678
- 开始flag初始值都为false,turn=0;
- p0进程将flag[0]=true,之后turn=1,然后因为flag[1]为false跳出循环,此时发生进程调度
- p1进程将flag[1]=true,之后turn=0;此时flag[0]为false,并且turn=0,满足循环条件,死等。
参考:王道考研视频