2.3.2 进程互斥的软件实现方法
知识来源: B站王道考研
单标记法
算法思想:两个进程在访问完临界区后会把使用临界区的权限转变给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。
int turn = 0; // 表示当前允许进入临界区的进程号
/**P0进程*/
while(turn != 0); // 进入区
critical section; // 临界区
turn = 1; // 退出区
remainder section;// 剩余区
/**P1进程*/
while(turn != 1); // 进入区
critical section; // 临界区
turn = 0; // 退出区
remainder section;// 剩余区
turn 的初值为0,即刚开始只允许0号进程进入临界区。
该算法可以实现“同一时刻最多只允许一个进程访问临界区”
单标志法:违背了“空闲让进”
双标志先检查法
算法思想:设置一个布尔型数组flag[],数组中各个元素用来标志各进程想进入临界区的意愿,比如“flag[0] = true”意味着0号进程P0可以进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。
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将会同时访问临界区。
违背“忙则等待”原则。
进入区的“检查”和“上锁”两个处理不是一气呵成的、“检查”后,“上锁”前可能发生进程切换。
可能产生“饥饿”
Peteson算法
算法思想:双标志后检查法中,连个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。Peterson算法在双方都争着想进入临界区,那可以让进程尝试“孔融让梨”,主动让对方先使用临界区。
遵循了空闲让进、忙则等待、有限等待三个原则,未遵循让权等待。