互斥——Peterson解法(个人见解)
2012-12-30 12:07
253 查看
//原版的Peterson互斥算法
#define TRUE 1
#define FALSE 0
#define N 2 /*进程的数量*/
int interested
= {0}; //所有值的初始化为0(FALSE)
int turn; //现在轮到谁?
void enter_region(int id) //进程是0或1
{
int other; //其他进程号
other=1-id; //另一进程
interested[id] = TRUE; //表明所感兴趣的
turn = id; //设置标志
while(turn == id && interested[other]==TRUE); //空语句
}
void leave_region(int id) //进程:谁离开?
{
interested[id] = FALSE; //表示离开临界区
}
//稍微修改后的Peterson互斥算法
#define N 32
int interested
= {0};
int turn;
void enter_region(int id)
{
interested[id] = 1;
turn = id;
while(turn == id && othersInterested(id));
}
void leave_region(int id)
{
interested[id] = 0;
}
int othersInterested(int id)
{
int result=0;
for(int i=0;i<N;i++)
{
if(i != id)
result = result || interested[i];
}
return result;
}
注:参照第二个稍微修改的Peterson算法比较好理解以下说明
此算法,用于两个互斥进程时,就能实现互斥,当一个进程进入临界区后,另一进程就只能等待;而当有三个以上的进程时,假设第一个进程,先进入临界区,接着到第二个进程尝试进入临界区,由于,前一进程已进入,即是相对于第二个进程之外的进程对临界区感兴趣(interested[other]==TRUE),(turn == id && interested[other]==TRUE)==TRUE所以第二个进程等待;在第一个进程没有离开临界区时,这时第三个进程对临界区感兴趣,也尝试时入,当然和进程二一样受到阻塞而等待,而全局变量ture值变为第三个进程的值(假设该值与第二个进程的ture值不同);此时,如果发生中断,调度回进程二,因为进程二阻塞在while(turn == id && interested[other]==TRUE)中,当进程二再次检测turn == id && interested[other]==TRUE时,发现turn==id为假,所以(turn == id && interested[other]==TRUE)为假,进程二不再受阻塞,从而在第一个进程没有离开临界区前第二个进程进入临界区,这样也就有危险。
这是我个人的见解,如果有误的或不明的地方希望大家指出,作点评论什么的
#define TRUE 1
#define FALSE 0
#define N 2 /*进程的数量*/
int interested
= {0}; //所有值的初始化为0(FALSE)
int turn; //现在轮到谁?
void enter_region(int id) //进程是0或1
{
int other; //其他进程号
other=1-id; //另一进程
interested[id] = TRUE; //表明所感兴趣的
turn = id; //设置标志
while(turn == id && interested[other]==TRUE); //空语句
}
void leave_region(int id) //进程:谁离开?
{
interested[id] = FALSE; //表示离开临界区
}
//稍微修改后的Peterson互斥算法
#define N 32
int interested
= {0};
int turn;
void enter_region(int id)
{
interested[id] = 1;
turn = id;
while(turn == id && othersInterested(id));
}
void leave_region(int id)
{
interested[id] = 0;
}
int othersInterested(int id)
{
int result=0;
for(int i=0;i<N;i++)
{
if(i != id)
result = result || interested[i];
}
return result;
}
注:参照第二个稍微修改的Peterson算法比较好理解以下说明
此算法,用于两个互斥进程时,就能实现互斥,当一个进程进入临界区后,另一进程就只能等待;而当有三个以上的进程时,假设第一个进程,先进入临界区,接着到第二个进程尝试进入临界区,由于,前一进程已进入,即是相对于第二个进程之外的进程对临界区感兴趣(interested[other]==TRUE),(turn == id && interested[other]==TRUE)==TRUE所以第二个进程等待;在第一个进程没有离开临界区时,这时第三个进程对临界区感兴趣,也尝试时入,当然和进程二一样受到阻塞而等待,而全局变量ture值变为第三个进程的值(假设该值与第二个进程的ture值不同);此时,如果发生中断,调度回进程二,因为进程二阻塞在while(turn == id && interested[other]==TRUE)中,当进程二再次检测turn == id && interested[other]==TRUE时,发现turn==id为假,所以(turn == id && interested[other]==TRUE)为假,进程二不再受阻塞,从而在第一个进程没有离开临界区前第二个进程进入临界区,这样也就有危险。
这是我个人的见解,如果有误的或不明的地方希望大家指出,作点评论什么的
相关文章推荐
- 2872的解法-个人见解
- Operating System-进程间互斥的方案-保证同一时间只有一个进程进入临界区(2)- Peterson解法
- 有关ucenter同步的原理(个人总结的一点浅薄见解)
- Spring bean自动装配的属性值注入的个人见解
- HUST——1103Party(拓扑排序+个人见解)
- 关于测试点和测试要点的一点个人见解
- The Letter Carrier's Rounds UVA - 814 个人见解
- 关于网页显示乱码问题的一些个人见解(PHP、JSP...)
- Java学习方法的一点个人见解-完整版
- Struts简介(个人见解)
- Oracle中串连接符||的使用心得(个人见解)
- 人脸识别方法个人见解
- ASP.NET 无级限分类-个人见解
- 使用Httpclient调用API的一些个人见解(返回的json)
- 《算法竞赛入门经典第二版》程序4-4的个人见解
- 关于自学的个人见解1
- 直接插入排序 -- 个人见解
- 关于Python IDE选择的一点个人见解
- 个人在原码,补码和反码三者之间的浅薄见解
- 资源分配争夺战--某案例的个人见解