煨姜
年味越来越淡竞争条件(racecondition)糖枫树
在⼀些中,协作的进程可能共享⼀些彼此都能读写的公⽤存储区。这个公⽤存储区可能在内存中(可能是在内核中),也可能是⼀个共享⽂件。这⾥共享存储区的位置并不影响通信的本质及其带来的问题。为了理解实际中进程间通信如何⼯作,我们考虑⼀个简单但很普遍的例⼦:⼀个假脱机打印程序。当⼀个进程需要打印⼀个⽂件时,它将⽂件名放在⼀个特殊的假脱机⽬录(spooler directory)下。另⼀个进程(打印机守护进程)则周期性地检查是否有⽂件需要打印,若有就打印并将该⽂件名从⽬录下删掉。
刘涛的图片
适合女生的名字设想假脱机⽬录中有许多槽位,编号依次为0,1,2,…,每个槽位存放⼀个⽂件名。同时假设有两个共享变量:out,指向下⼀个要打印的⽂件;in,指向⽬录中下⼀个空闲槽位。可以把这两个变量保存在⼀个所有进程都能访问的⽂件中,该⽂件的长度为两个字。在某⼀时刻,0号⾄3号槽位空(其中的⽂件已经打印完毕),4号⾄6号槽位被占⽤(其中存有排好队列的要打印的⽂件名)。⼏乎在同⼀时刻,进程A和进程B都决定将⼀个⽂件排队打印,这种情况如图2-21所⽰。
在Murphy法则(任何可能出错的地⽅终将出错)⽣效时,可能发⽣以下的情况。进程A读到in的值为7,将7存在⼀个局部变量next_free_slot中。此时发⽣⼀次时钟中断,CPU认为进程A已运⾏了⾜够长的时间,决定切换到进程B。进程B也读取in,同样得到值为7,于是将7存在B的局部变量next_free_slot中。在这⼀时刻两个进程都认为下⼀个可⽤槽位是7。
伽利略的故事
进程B现在继续运⾏,它将其⽂件名存在槽位7中并将in的值更新为8。然后它离开,继续执⾏其他操作。
路由器型号
最后进程A接着从上次中断的地⽅再次运⾏。它检查变量next_free_slot,发现其值为7,于是将打印⽂件名存⼊7号槽位,这样就把进程B存在那⾥的⽂件名覆盖掉。然后它将next_free_slot加1,得到值为8,就将8存到in中。此时,假脱机⽬录内部是⼀致的,所以打印机守护进程发现不了任何错误,但进程B却永远得不到任何打印输出。类似这样的情况,即两个或多个进程读写某些共享数据,⽽最后的结果取决于进程运⾏的精确时序,称为竞争条件(race condition)
教师职称申请书