- 如何传递信息?
- 如何确保多个进程在关键活动中不会出现交叉?
- 如何保证正确的顺序?
竞态条件
定义:两个或多个进程同时读写某些共享数据,最后的结果依赖于进程运行的精准时序
如何避免竞态条件?
关键在于进程同时读写共享数据,所以需要 “互斥”
临界区
定义:对共享内存进行访问的程序片段
实现互斥的方案
屏蔽中断
理由:CPU只有在发生时钟中断或其他中断时才会进行进程切换,屏蔽中断后CPU将不会切换到其他进程
缺点:把屏蔽中断的权利交给用户进程时不明智的。如果系统是多处理器,则屏蔽中断仅仅对执行disable指令的那个CPU有效,其他CPU仍然继续运行,并且可以访问共享内存锁变量
Pass,跟共享内存一样的问题,会出现竞态条件严格轮转法
忙等待:连续测试一个变量直到某个值出现为止(循环)。这种方式浪费CPU时间,应该避免。只有在有理由认为等待时间非常短的情况下,才使用忙等待。用于忙等待的锁称为自旋锁。Peterson解法
看不懂(P69)TSL指令(Test and Set Lock)
硬件支持,形式:TSL PX,LOCK,它将一个内存字LOCK读到寄存器RX中,然后在该内存地址上存一个非零值。读字和写字保证是不可分割的,即在该指令结束之前其他处理器均不允许访问该内存字。执行TSL指令的CPU将锁住内存总线,可以禁止其他CPU在本指令结束之前访问内存
总结:严格轮转法,Peterson解法和TSL解法都是正确的,但他们都有忙等待的缺点,忙等待浪费CPU时间。