一、硬件开关中断方式
这种实现进程同步互斥具有很高的效率但是会造成系统负担过大。
.....
关中断;
临界区;
开中断;
.....
二、单标志方法
该算法设置一个公用整型变量tum, 用于指示被允许进入临界区的进程编号,即若turn = 0, 则允许凡进程进入临界区。该算法可确保每次只允许一个进程进入临界区。缺点就是进程只能交替进入临界区
//P0进程
while(turn!=0){
临界区;
turn=1;
退出区;
}
//P1进程
while(turn!=1){
临界区;
turn=0;
退出区;
}
三、双标志先检查
该算法的基本思想是在每个进程访问临界区资源之前,先查看临界资源是否正被访问,若正被访问,该进程需等待;否则,进程才进入自己的临界区。为此,设置一个数据flag[i], 如第i个元素值为FALSE, 表示R进程未进入临界区的值true,则表示pj进入临界区。
//Pi进程
while(flag[j]);
flag[i]=true;
临界区;
flag[i]=false;
退出区;
//Pj进程
while(flag[i]);
flag[j]=true;
临界区;
flag[j]=false;
退出区;
四、双标志法后检查
先检测对方的进程状态标志, 再置自己的标志, 由于在检测和放置中可插入另一个进程到达时的检测操作, 会造成两个进程在分别检测后同时进入临界区。为此, 算法三先将自己的标志设置为TRUE, 再检测对方的状态标志,若对方标志为TRUE, 则进程等待; 否则进入临界区。
//P0 进程:
flag[0] = true;
while (flag[1]);
临界区;
flag[0] = false;
剩余区;
//P1 进程:
flag[1] = true;
while (flag[0]);
临界区;
flag[1] = false;
剩余区;
五、Peterson 算法
//P0 进程:
flag[0] = true;turn = 1;
while (flag[1] && turn == 1);
临界区;
flag[0] = false;
剩余区;
//P1 进程:
flag[1] = true;turn = 0;
while (flag[0] && turn == 0);
临界区;
flag[1] = false;
剩余区;