操作系统——实现多个进程之间同步(Peterson改进以及面包店算法)

Posted ^_^|

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统——实现多个进程之间同步(Peterson改进以及面包店算法)相关的知识,希望对你有一定的参考价值。

(1)改进Peterson算法
存在三个进程时,当三个进程都在执行,那么像之前所讲的Peterson仅仅将自己阻塞的方式就不太好使,起码要阻塞两个,所以单单使用turn那样非此即彼的方式难以实现。为此,我们尝试如下的实现方式。

Filter算法
// initialization
waiting[N-1] = { -1 }; // the waiting process of each level 0...N-2
level[N] = { -1 };     // current level of processes 0...N-1

// code for process #i
for(l = 0; l < N-1; ++l) {
    level[i] = l;
    waiting[l] = i;
    while(waiting[l] == i &&
          (there exists k ≠ i, such that level[k] ≥ l)) {
        // busy wait
    }
}

// critical section

level[i] = -1; // exit section

算法说明:
其中waiting数组类似于一个等待的房间,所有的线程想要进入critical section,就必须从小到大经过所有的房间,最坏的情况是N的线程有N-1个呆在房间里面等待,只有一个线程进入critical section。
对于level数组,表示的是每一个线程在第几个房间等待。例如 level[i] = j; 表示第 i 个线程在房间 j 等待。另外 -1 表示没有进入critical section的请求。
我们可以看出代码最核心的一段while判断,如果某个房间是的等待着是当前的线程,并且已经有别的线程在序号更大的房间了,那么就继续等待。由此可见,有两种方式能够让当前线程向前进:
前方没有别的线程在更大的房间里面等待,则可以向前推进。
有别的后来者线程也想进入我当前的房间,并且把waiting号给改了,这样当前线程就被动地被推进到下一级的房间。
由filter算法去反思Peterson算法,可见其中的flags数组表示两个进程的等待级别,而turn变量则是阻塞(忙等待)的线程队列,这个队列只需要容纳一个元素。

(2)面包店算法

process(i) {
   while (true) {
Enter [i] = 1;
Number[i] = 1 + max(Number[1], ,Number[N]);
Enter [i] = 0;
    for (j=1; j<=N; ++j) {
while (Enter[j] != 0) {}  //如果procee(j)在获取编号,则等待process(j)获得他的编号      
while ((Number[j]!=0)&& ((Number[j],j) < (Number[i],i))) {} //如果j取过号也在竞争临界区,则编号越小,优先级越大;优先级相同,则比编号
}
critical section
    Number[i] = 0;
non-critical section
}
}

算法说明:
该方式同样可以实现多个进程之间实现进程同步,让我们以三个为例说明。
假设当前只有process(i)需要使用资源,那么它将顺利进入临界区,满足了空闲让进的要求。
当i, j, k三个进程同时需要进入时,假设他们的先后顺序为I, j, k。那么在i进程中,如果j或者k在取号,则先等他们取完,等待取完后,i将跟他们比较优先级,此时i先来,所以优先级更高,进入临界区。
相应的在j和k中跟i的步骤差不多,不过当比较优先级时,他们会发现i的优先级更高,于是阻塞忙等。
当i进程用完临界区后,将number[i]置0,此时再到j/k进程,此时将跳过i,再进行j和k的优先级比较,从而获取临界区的访问权限。

以上是关于操作系统——实现多个进程之间同步(Peterson改进以及面包店算法)的主要内容,如果未能解决你的问题,请参考以下文章

操作系统--进程同步(仅仅是轮廓--具体要根据实际项目再深入)

操作系统——进程同步

王道操作系统笔记———— 进程同步与互斥

王道操作系统笔记———— 进程同步与互斥

操作系统概念笔记——第六章:进程同步

王道操作系统OS进程管理