[操作系统]临界区访问与“先人后己”的过河精神

来源:互联网 发布:淘宝批量添加图片 编辑:程序博客网 时间:2024/05/16 11:52

Process  Synchronization

---critical section problem(solution for 2 processes)

临界区访问控制机制直观上要满足下面2个要求:
1、互斥,即如果Pi在临界区内执行时,该机制要保证同时没有另一个Pj在临界区内执行;
2、让进,即当临界区中没有进程在执行时,如果有进程希望进入临界区,那么该机制要提起决议选择一个准予进入临界区。

为此,共享临界区的进程Pi和Pj可以依赖于两个公共域变量实现互斥访问:
boolean  flag[2];
int             turn;

initial state:

flag[0] = flag[1] = false;
turn的值为1还是0对结果没有影响。

algorithms:

//the program of process[i]
do {
  
//entry section
  flag[i] = true;
  turn 
= j;
  
while( flag[j] && turn==j ) ;//wait

  
//critical section
  ...

  
//exit seciton
  flag[i] = false;

  
//remaider section
  ...
}
while1 );
可以证明该算法满足问题的两个要求。从理解上来说,turn是一个“封条”,相当于一个有记录功能的开关,也是一个“临界”量,是否允许进入取决于己方否是有这个意愿和是否有冲突。
生活中,有一个场景和这个问题很相似。在渡口只有一条小船,能够乘坐一个人;但是没有船桨,也没有船夫,河两岸渡口之间之间拉了一根绳索,可以把船拴在绳索上,然后拉动绳索,把船拉到对岸。拉绳只能一次拉到对岸,动作是不可中断的,这也是过河的唯一途径。
为了过河,河两岸的人都是如何考虑和行动的呢?尤其是当两边都有人要过河时?特别的当两岸同时都来了人要过河时?
其实,人是活的,这时候的人的行为是instant-reaction;假设这里是一个自动机器的世界,行为模式都是固定的,programmed,即两岸乘客都采用一些程式化的步骤进行决策和行动。
它们会先发出某种信号,表明自己要过河、要使用渡船的意愿;然后它们要把船拉到自己这一边来,准备上船;
如果这时候对岸有人发出信号表明自己也要过河,甚至又把船拉了过去,这都是允许,当然只允许一次。一个理性社会的规则最终是“先人后己”的:在上船之前,如果发现对岸有信号,它就会让给对岸的人先使用,让它把船又拉回去,然后等待它过来,两人见面,很是感动,下船的人立刻熄灭信号棒,让一直在等待的好人赶紧过河去……
如果不是“先人后己”的理性社会呢?
假设过河的人都以自己过河要紧,而不考虑别人的需要,只管拉了船来就上,那么两人拉起来就没完没了,谁也用不了船;
假设过河的人都没脑子,看见渡口停的船不见了,就以为有人要过来,就一直等,那也不是个办法。
原创粉丝点击