方法 | 优点 | 缺点 | |
---|---|---|---|
中断屏蔽 | 利用“开/关中断指令”实现, | 简单,高效 | 1.不适用于多处理机的系统 2.只适用于内核进程,不适用于用户进程 |
TesstAndSet指令 (TS指令、TSL指令) |
TSL指令使用硬件实现的,在执行过程中不允许被中断,只能一气呵成 |
实现简单 无需检查逻辑漏洞 适用于多处理机 |
不满足 “让权等待” |
swap指令 | 同上 Swap(bool *a,bool *b){ bool temp; temp=*a; *a=*b; *b=temp; } bool old=true; while(old==true): Swal(&lock,&old) //临界区代码 lock=false; //剩余区代码 |
同上 | 同上 |
思想 | 缺点 | |
---|---|---|
单标志法 | 两个进程在访问完临界区后,会把使用临界区的权限交给另一个进程。每个进程进入临界区的权限只能被另一个进程赋予。 | 违背: 空闲让进、 让权等待 |
双标志先检查法 | 设置一个布尔型数组flag[],数组中各元素用来标记进程想进入临界区的意愿,true表示想要进入。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身的flag设为true,之后开始访问临界区。 | 违背: 忙则等待、 让权等待 |
双标志后检查法 | 双标识后检查法的改进版。前一个算法的问题是先检查后上锁,但是这两个操作无法一气呵成,因此导致了两个进程可能同时进入临界区。所以改进为先上锁后检查来避免上述问题。 | 违背: 空闲让进、 有限等待、 让权等待 |
Peterson算法 | 双标识后检查法中,两个进程都争着想要进入临界区,谁也不让谁,最后都无法进入临界区。Peterson算法使用了一种主动让对方先使用临界区的思想。 | 违背: 让权等待 |