首页 > 代码库 > Operation System - Peterson's Solution算法 解决多线程冲突

Operation System - Peterson's Solution算法 解决多线程冲突

Person‘s solution 是用来一种基于软件的解决关键区域问题的算法(critical-section).

它并不是完美的,有可能不对地工作。并且是限制解决两个进程同步的问题。

可是它非常easy,非常原始,学习起来也是非常轻松的。

代码例如以下:

do {
     flag[i] = true;
     turn = j;
     while (flag[j] && turn == j);
     critical section
     flag[i] = false;
     remainder section
} while (true);

flag[]事实上是一个2个变量的数组。这里的i标志一个进程,而j标志还有一个进程。

critical section代表是须要相互排斥进入的一个区间,比方须要改动一些关键的共享数据,这个时候不能让两个进程同一时候改动,否则就会出现不可预知的结果了。记得好像见过阿里巴巴笔试有这种题目。

有remainder section并不是关键区域,所做的操作是能够并行操作的,结果互不影响。

这里基本的目的就是两个进程相互排斥地进入critical section。

那么为什么这个算法是可行的呢?

这种算法可行,须要满足三个条件:

1 Mutual exclusion: 相互排斥进入

2 Progress : 在非remaider section的进程能在一定时间内进入critical section

3 Bounded waiting: 保证一个进程的等待时间不会过长


分析:

如果1 : 两个进程P1, P2同一时候运行了do语句:语句运行为:P1 flag[i] = true; P2 flag[j] = true; P1 turn = j; P2 turn = i; P1 while(flag[j] && turn == j) ;

这个时候因为P2已经运行了turn = i语句,所以turn == i,那么P1的语句while(flag[j] && turn == j)的turn ==j就为假了,所以这个时候退出循环,P1进入critical section。

然后P2 while (flag[i] && turn == i);由于这个时候flag[i] 和turn ==i都为真,那么P2就处于等待状态。由于P1和P2是等同的,所以这个情况下,仅仅能有一个进程能够进入critical section的。条件1成立。

假设继续运行,那么就能够分析条件2也是成立的:由于P1进入了critical section之后运行完成,退出来,那么flag[i] = false,这个语句运行之后,P2 while(flag[i] && turn == i)的flag[i]就为假了。之歌时候P2就能够进入critical section了。

那么继续分析条件3,能够知道P2的等待时间仅仅是P1运行critical section的时间。这个等待时间一般不会过长。

其它情况就更加不会冲突了,能够列举全部语句运行的顺序知道,不管两个进程的语句怎样运行,这个算法都是成立的。


--參考资料:Operating System Concepts