1、1、理发店理有一位理发师、一把理发椅和n 把供等候理发的顾客坐的椅子,如果没有顾客,理发师便在理发椅上睡觉。一个顾客到来时,它必须叫醒理发师。如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。2、苹果桔子问题桌上有一只盘子,每次只能放入一只水果;爸爸专向盘子中放苹果(apple) ,妈妈专向盘子中放桔于(orange),一个儿子专等吃盘子中的桔子,一个女儿专等吃盘子里的苹果。使用记录型信号量解决苹果桔子问题。3、一座山有一个隧道,规定每次允许一列火车过隧道,现在南方北方都有车要过隧道。如果把每个过隧道火车都看作一个进程,为保证安全,请用 wait 和 signal
2、 原语操作实现正确管理。var waiting : integer; /*等候理发的顾客数*/ CHAIRS:integer; /*为顾客准备的椅子数*/customers, barbers,mutex : semaphore;customers := 0; barbers := 0; waiting := 0; mutex := 1;Procedure barber;beginwhile(TRUE); /*理完一人,还有顾客吗 ?*/P(cutomers); /*若无顾客,理发师睡眠*/P(mutex); /*进程互斥*/waiting := waiting 1; /* */V(barber
3、s); /*理发师去为一个顾客理发*等候顾客数少一个/V(mutex); /*开放临界区*/cut-hair( ); /*正在理发*/end;procedure customerbeginP(mutex); /*进程互斥*/if waitingCHAIRS begin /*看看有没有空椅子*/waiting := waiting+1; /* 等候顾客数加 1*/V(customers); /*必要的话唤醒理发师 */V(mutex); /*开放临界区*/P(barbers); /*无理发师 , 顾客坐着养神 */get-haircut( ); /*一个顾客坐下等理发*/endV(mutex);
4、 /*人满了,走吧!*/end;varplate : integer;sp:semaphore; /* 盘子里可以放几个水果 */sg1:semaphore; /* 盘子里有桔子 */sg2:semaphore; /* 盘子里有苹果 */sp := 1; /* 盘子里允许放一个水果*/Sg1, := 0; /* 盘子里没有桔子 */sg2 := 0; /* 盘子里没有苹果*/cobeginprocess father beginL1:削一个苹果;P(sp);把苹果放入 plate;V(sg2);goto L1;end;process mother beginL2:剥一个桔子;P(sp);把桔子
5、放入 plate;V(sg1);goto L2;end;process son beginL3: P(sg1);从 plate 中取桔子;V(sp);吃桔子;goto L3;end;process daughter beginL4: P(sg2);从 plate 中取苹果;V(sp);吃苹果;goto L4;end;coend设信号量 s 表示隧道的互斥信号量,初始值为 1。则第 I 列从南向北过隧道火车为进程 p_s_to_n( I) ;第 I 列从北向南过隧道的火车为进程 p_n_to_s(I) ;可得以下管理程序:p_s_to_n(I) p_n_to_s(I)begin beginP(s) ; P(s) ;过隧道; 过隧道;V(s) ; V(s) ;End; End;