操作系统——进程同步

临界区问题的解决方案:

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

Peterson方法

操作系统——进程同步_第1张图片
这个方法靠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)

硬件同步

操作系统——进程同步_第2张图片
操作系统——进程同步_第3张图片
多CPU不可用,因为在一个处理机上关中断并不能防止进程在其他处理机上执行相同的临界段代码。

操作系统——进程同步_第4张图片
即使用test-and-set指令以及Swap指令实现进程互斥

信号量机制

记录型信号量(Pascal中结构体称为记录)也即结构体型信号量
操作系统——进程同步_第5张图片

操作系统——进程同步_第6张图片

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

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

如果这样写signal语句,或许对整体理解s.value更容易。
s.value=0 表示当前无资源可用,并且没有其他进程被阻塞,即资源刚好被完全利用,不多不少的情况。

你可能感兴趣的:(操作系统)