基本概念
实现临界区互斥的基本方法
软件方法
- turn变量理解
- 由于在自己进程内的执行时,turn的赋值始终为turn=别的进程号,因此可以理解为谦让给别人
- 那么在单标志法中,检查的就是对面有没有谦让回给我,
P0:
while(turn!=0);//没有让给我,那就等着
critical section;
turn =1;//我用完了,谦让给你
- flag[ ]的理解
- flag[]表示自己的意愿,flag[i]=true:i说我想要,flag[i]=false,i说我不想要
- 双标志先检查法那就是在自己的进程里,先检查别人想不想,他想我就等着,他不想了,我就表示想,他就会检查到我想,然后等着,我用完了,就说不想了,他查到我不想了,就表示自己想,然后执行
- 缺点就是我看他不想要,刚准备说想要,tmd那傻b又看到我是不想要,就想要了,然后我俩都想要,就一起用了...违背了忙则等待
- 但是如果检查和表示自己想要可以一气呵成,那么就没有问题了
- 双标志后检查法,就是在自己的进程里,先不管别人想不想要,直接表示自己想要,然后检查有没有人表示过想要,有就等着,没有就用,用完说自己不用了
- 缺点是我说完老子想用,还没来得及检查,有人说想用了,然后我检查,发现有人想用,就等着,tmd别人检查发现我想用,就也等着,违背了有限等待,空闲让进
- peterson 算法
我先表示我想用,然后谦让给你
flag[i]=true;turn=j;
然后检查你想不想用并且有没有让给我,如果你想用并且没让给我,我就等着
while(flag[j]&&turn=j);
如果你不想用或者让给我了,我就用了
critical section;
用完表示不想用了
flag[i]=false;
硬件方法
- 中断屏蔽法
- 硬件指令法(都是硬件完成的,代码只是功能的描述)
- 解决了之前双标志先检查法的缺点,即检查和上锁可以一气呵成了
- 总结
信号量
整形信号量
- 易考查不满足让权等待的问题,与记录型信号量的对比
记录型信号量(☆)
小结
信号量的使用
总体
互斥
同步
前驱
小结
管程
概念
- 组成其实就是一个类数据+方法
- 因此只有局部于管程的过程(函数)才能访问局部于的数据
- 也只有调用管程内的方法才能访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程==>保证了访问共享数据时的互斥性
应用
- 实现互斥:由编译器负责实现各进程互斥地进入管程中的过程
当两个进程并发执行,一次调用insert过程,如果第一个没执行完,发生调度,则第二个执行到insert时会阻塞,这是由编译器完成的
**队列:insert->producer2 - 实现同步:管程中设置条件变量和等待/唤醒条件,以解决同步问题
小结
其实就是用了封装的思想,对外提供接口,方便使用