互斥是由程序共享资源所引起的,某一个资源不允许同时多个程序访问,那么解决方法是要么访问其他空闲的同种资源,要么等待这一资源。等待这一资源就要在操作系统实现互斥:当一个进程正在使用资源的时候,其他希望使用该资源的程序必须等待,当该进程使用完并释放资源后,才允许其他进程去访问此资源,我们称这种进程之间的互相制约关系叫做互斥。
互斥的实现方法
软件方法
算法一:
保证互斥访问临界资源,问题在于强制两个进程交替进入临界区,造成资源利用率低,p0退出后,P1未进入,P0不能进入
int turn =
0;
P0: {
do {
while(turn ==
0)
P0的临界区代码CS0;
turn =
1;
进程的其他代码codesegment1;
}
while(ture);
}
P1: {
do {
while(turn ==
1)
P1的临界区代码CS1;
turn =
0;
进程的其他代码codesegment2;
}
while(
true);
}
12345678910111213141516171819
算法二:
解决了空闲让进的问题,但是当两个进程都未进入临界区,而又同时想进入临界区,双方都认为对方不在临界区,同时进入临界区,违背了忙则等待
//枚举类型
enum boolean {
true,
false};
boolean flag[
2] = {
false,
false};
P0 {
do {
while flag[
1];
flag[
0] =
true;
CS0;
flag[
0] =
false;
codesegment1;
}
while(
true);
}
P1: {
do {
while flag[
0];
flag[
1] =
true;
CS1;
flag[
1] =
false;
codesegment2;
}
while(
true);
}
1234567891011121314151617181920212223
算法三:
算法防止了两个进程同时进入临界区,但存在两个都进不了临界区的问题,违背了有限等待
enum boolean{
false,
true};
boolean flag[
2] = {
false,
false};
P0 {
do {
flag[
0] =
true;
while flag[
1];
CS0;
flag[
0] =
false;
codesegment1;
}
while(
true);
}
P1: {
do {
flag[
1] =
true;
while flag[
0];
CS1;
flag[
1] =
false;
codesegment2;
}
while(
true);
}
12345678910111213141516171819202122
算法四:
flag解决临界区访问,turn解决饥饿现象
enum boolean{
false,
true}; boolean flag[
2] = {
false,
false};
int turn; P0 {
do { flag[
0] =
true; turn =
1;
while flag[
1] && turn ==
1; CS0; flag[
0] =
false; codesegment1; }
while(
true); } P1: {
do { flag[
1] =
true; turn =
0;
while flag[
0] && turn ==
0; CS1; flag[
1] =
false; codesegment2; }
while(
true); }