操作系统——进程同步

Posted ^_^|

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统——进程同步相关的知识,希望对你有一定的参考价值。

临界区问题的解决方案:

  1. Peterson方法
  2. 硬件同步
  3. 信号量

Peterson方法

在这里插入图片描述
这个方法靠turn=i/j控制会有一个进程阻塞在while(死循环),靠flag[i/j]=false解除死循环

首先,如果是进程i第一次开始执行,那它可以顺利进入临界区,因为flag[j]=FALSE,进程j还不想进入临界区!
而如果进程P0和P1并发,那么两者中必然会有一个会被while堵塞住(因为flag[0和1]均等于true)因为turn要么i要么j,而turn为j则process_i死循环,反之,process_j死循环。而另一个会完成自己的任务并置对方的flag位为false,这时while的条件不再满足,即可执行自己的程序,实现了互斥。

优点:
当CPU严格顺序执行指令时,正确(这种CPU不多了)
不需要特殊硬件指令的支持
可用于内核或者用户进程

缺点:
证明正确性较复杂
如果CPU跳着执行指令会有问题(?)
当一个进程在临界区内时,另一个进程不断测试,消耗CPU,这称为忙等(busy waiting)

硬件同步

在这里插入图片描述
在这里插入图片描述
多CPU不可用,因为在一个处理机上关中断并不能防止进程在其他处理机上执行相同的临界段代码。

在这里插入图片描述
即使用test-and-set指令以及Swap指令实现进程互斥

信号量机制

记录型信号量(Pascal中结构体称为记录)也即结构体型信号量
在这里插入图片描述

利用信号量实现互斥访问

在这里插入图片描述

我们对这一幅图作如下说明:

  1. 当p1占用临界资源而p2进行P操作而阻塞后,PC指向的是 MOV AX,[C] 语句
  2. S.val在第11条语句进行s->val++之前,我们对S.val有如下理解
    在这里插入图片描述
void signal(semaphore *s){
  if(s->value<0){
    remove p from s->list;
    wakeup(p);
  }
  s->value++;}

如果这样写signal语句,或许对整体理解s.value更容易。
s.value=0 表示当前无资源可用,并且没有其他进程被阻塞,即资源刚好被完全利用,不多不少的情况。
其实在10~15步的signal()操作内没有一定要讨论s.value的必要,因为其本身是一个原子操作,应当整体去体会。

利用信号量实现前趋关系

设有两个并发执行的进程P1和P2。有前趋关系S1 -> S2,

											P(S)
S1											S2
V(S)

两个进程进行计算、打印操作的同步问题

信号量 E = 1(缓冲区空闲资源个数), F = 0(缓冲区存在资源数)

P1:                                   P2:  
      while(true) {							while(true){
        P(E);									P(F);
        compute next number;					take from buffer;
        add to buffer;							V(E);
        V(F);									print();
     }              

以上是关于操作系统——进程同步的主要内容,如果未能解决你的问题,请参考以下文章

互斥与同步

多线程编程

进程线程同步异步

进程同步

LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段

java基础入门-多线程同步浅析-以银行转账为样例