第二章 进程同步

基本概念

UHlPR1.png

实现临界区互斥的基本方法

软件方法

UHNoIf.png
  1. turn变量理解
  • 由于在自己进程内的执行时,turn的赋值始终为turn=别的进程号,因此可以理解为谦让给别人
  • 那么在单标志法中,检查的就是对面有没有谦让回给我,
    P0:
    while(turn!=0);//没有让给我,那就等着
    critical section;
    turn =1;//我用完了,谦让给你
  1. flag[ ]的理解
  • flag[]表示自己的意愿,flag[i]=true:i说我想要,flag[i]=false,i说我不想要
    • 双标志先检查法那就是在自己的进程里,先检查别人想不想,他想我就等着,他不想了,我就表示想,他就会检查到我想,然后等着,我用完了,就说不想了,他查到我不想了,就表示自己想,然后执行
    • 缺点就是我看他不想要,刚准备说想要,tmd那傻b又看到我是不想要,就想要了,然后我俩都想要,就一起用了...违背了忙则等待
    • 但是如果检查和表示自己想要可以一气呵成,那么就没有问题了
    • 双标志后检查法,就是在自己的进程里,先不管别人想不想要,直接表示自己想要,然后检查有没有人表示过想要,有就等着,没有就用,用完说自己不用了
    • 缺点是我说完老子想用,还没来得及检查,有人说想用了,然后我检查,发现有人想用,就等着,tmd别人检查发现我想用,就也等着,违背了有限等待,空闲让进
  1. peterson 算法
    我先表示我想用,然后谦让给你
    flag[i]=true;turn=j;
    然后检查你想不想用并且有没有让给我,如果你想用并且没让给我,我就等着
    while(flag[j]&&turn=j);
    如果你不想用或者让给我了,我就用了
    critical section;
    用完表示不想用了
    flag[i]=false;

硬件方法

  1. 中断屏蔽法
    UHRGoF.png
  2. 硬件指令法(都是硬件完成的,代码只是功能的描述)
    UHWklR.png
  • 解决了之前双标志先检查法的缺点,即检查和上锁可以一气呵成了
    UHW8Xt.png
  1. 总结
    UHWyn0.png

信号量

整形信号量

UjWVtx.png
  • 易考查不满足让权等待的问题,与记录型信号量的对比

记录型信号量(☆)

UvERk4.png

小结

UvV9nf.png

信号量的使用

总体

aA5FW6.png

互斥

aAIWDg.png

同步

aATZOU.png

前驱

aAOuTO.png

小结

aAOAp9.png

管程

概念

a8xWOs.png
  1. 组成其实就是一个类数据+方法
    • 因此只有局部于管程的过程(函数)才能访问局部于的数据
    • 也只有调用管程内的方法才能访问共享数据
  2. 每次仅允许一个进程在管程内执行某个内部过程==>保证了访问共享数据时的互斥性

应用

aGSMUx.png
  1. 实现互斥:由编译器负责实现各进程互斥地进入管程中的过程
    当两个进程并发执行,一次调用insert过程,如果第一个没执行完,发生调度,则第二个执行到insert时会阻塞,这是由编译器完成的
    **队列:insert->producer2
  2. 实现同步:管程中设置条件变量和等待/唤醒条件,以解决同步问题

小结

其实就是用了封装的思想,对外提供接口,方便使用
aGC82T.png

java中的类似管程的机制

aGCrRK.png

总结

aGC4it.png