个人用书:操作系统教程 第五版 费翔林
学习视频: 王道计算机考研 操作系统.
目录
进程同步,进程互斥
进程同步
回顾:进程有异步性,每个进程会以独立的,不可预知的速度推进。
同步,也称直接制约关系,完了完成任务建立的两个或者多个进程,需要在某些位置上协调他们的工作次序而产生的制约关系。
进程互斥
互斥,并发的进程不可避免的需要使用临界资源(一个时间段只能一个进程使用)。
对临界资源的访问分为四个部分
do
{
entry section; //进入区,检查资源是否可以进入临界区,若可以进入,设置正在访问临界区资源标志。
critical section; //临界区,访问临界资源的代码。
exit section; //退出区,解除正在访问临界区标志。
remainder section; //剩余区,其他处理。
} while (1)
!!临界区是进程中访问临界资源的代码段,进入区和退出区是负责实现互斥的代码段。
原则:
- 空闲让进。临界区空闲时,可以允许一个请求进图临界区的进程进入。
- 忙则等待。已经有进程进入,其他进程等待。
- 有限等待。保证有限时间进程进入临界区(不会饥饿)。
- 让权等待。进程不能进入临界区,则应该释放处理机。
进程互斥的软件实现方法(这四个方法都不满足 让权等待)
单标志法
算法思想:两个进程在访问完临界区后把临界区的权限给另一个进程。每一个进程进入临界区的权限只能另一个进程赋予。
int turn = 0; //turn 表示当前允许进入临界区的进程号
P0: P1:
while (turn != 0) while(turn = 1)
critical section; critical section;
turn = 1; turn = 0;
remainder section; remainder section;
turn初始值0,表示只能进程0号进入。只有进程0访问完后,将turn改变,P1才能开始访问。(P0时间片用完之后会进入P1,但是因为while条件不满足,P1死循环会一直到时间片用完,P1时间片过程中,资源一直是空闲的)
主要问题:违反了 空闲让进 原则。
双标志先检查
算法思想:设置布尔数组flag[],用各个元素标记进程想进入临界区的意愿。
bool flag[2];
flag[0] = false;
flag[1] = false;
P0: P1:
while(flag[1]) while(flag[0]) //检查
flag[0] = true; flag[1] = true; //上锁
critical section; critical section;
flag[0] = false; flag[1] = false;
remainder section; remainder section;
当P0已经使用,那么P1需要循环等待。
如果进程是并发的,在P0没有设置flag的时候执行了P1的判断,则会同时进入临界区。
主要问题:违反了 忙则等待 原则。检查和上锁不能一气呵成。
双标志后检查
算法思想:将先检查的上锁放到检查前面。
bool flag[2];
flag[0] = false;
flag[1] = false;
flag[0] = true; flag[1] = true; //上锁
P0: P1:
while(flag[1]) while(flag[0]) //检查
critical section; critical section;
flag[0] = false; flag[1] = false;
remainder section; remainder section;
如果进程是并发的。
主要问题:违法了 空闲让进 和 有限等待 原则。
Peterson算法
算法思想:如果双方都想进入临界区,则产尝试谦让。
bool flag[2]; //初始值是false
int turn = 0;
P0:
flag[0] = ture;
turn = 1;
while(flag[1] && turn == 1); //注意这里的分号,满足条件的话,这是一个while死循环
critical section;
flag[0] = false;
remainder section;
P1:
flag[1] = ture;
turn = 0;
while(flag[0] && turn == 0);
critical section;
flag[0] = false;
remainder section;
最后谦让的让出资源。
进程互斥的硬件实现方法
中断屏蔽
利用“开/关中断指令”实现。(与第二章原语思想相同)
有点:简单,高效
缺点:不适用于多处理机。开关中断只能内核态进行&#