进程互斥的软硬件实现方法

软件

一、单标志法

算法思想:

两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程讲入临界区的权限只能被另一个进程赋予。

特点:每次只允许一个进程进入临界区

用turn用于指示被允许进入临界区进程编号,turn=0此时就是P0进入临界区,假设先设置初值为0,让P1先上处理机,那么P1满足while(turn!=1),就会进入循环,直到时间片用完发生调度,换P0上处理机,P0进入临界区,到turn=1这行之后如果要让P1上处理机,P1就可以进入临界区

缺点:

如果此时允许进入临界区的进程是P0,而P0一直不访问临界区,那么虽然此时临界区空闲,但是P1并不能访问。因此,单标志法存在的主要问题是:违背“空闲让进”原则。

二、双标志先检查

算法思想:

设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0] = ture”意味着0号进程P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。(P1要上处理机时先问P0想不想,P0如果想,flag[0]=true,那么第5句代码进入循环,P1就一直等待)

考虑这种情况:

比如此时P0先上处理机,它先问P1想不想上,P1如果不想,那么P0执行第1句代码,但是假设在此时第1句刚执行完的时候发生了调度,flag[0]还没有切换成true,那么P1上了处理机,P1执行第5句被跳出循环,执行第6句,然后顺利进入临界区,此时又发生切换,那么P0接着执行第2句,然后P0也进入临界区

所以,若按照①⑤②⑥③⑦...的顺序执行,P0和P1将会同时访问临界区。因此,双标志先检查法的主要问题是:违反“忙则等待”原则。 原因在于,进入区的“检查”和“上锁”两个处理不是一气呵成的。“检查”后,“上锁”前可能发生进程切换,基于这个问题,引出下一种

三、双标志后检查

算法思想: 双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题。因此,人们又想到先“上锁”后“检查”的方法,来避免上述问题。

区别在于:先上锁了,再问对方的意愿

但还是有缺陷,若按照①⑤②⑥....的顺序执行,P0和P1将都无法进入临界区 因此,双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待”原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象。两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。

四、Peterson方法

算法思想:

结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”(谦让)。做一个有礼貌的进程。

自己的进程意愿设为true,还要表示谦让把trun设为对方的值

Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则,会发生忙等,因为如果他自己进不去临界区,就会一直卡在while循环,而他依旧是在处理机上的,在占着资源。

硬件

一、中断屏蔽方法

二、TestAndSet (TS指令/TSL指令)

该方法中检查和上锁是一气呵成的

三、Swap指令(XCHG指令)

经验分享 程序员 微信小程序 职场和发展