同步与互斥实例

《同步与互斥实例》由会员分享,可在线阅读,更多相关《同步与互斥实例(25页珍藏版)》请在文档大全上搜索。
1、进程同步与互斥实例进程同步与互斥实例同步实例同步实例1.1.经典的生产者经典的生产者消费者问题消费者问题消费者消费者生产者生产者1.1.经典的生产者经典的生产者消费者问题消费者问题lvar B : integer;l empty:semaphore; /* 可以使用的空缓冲区数可以使用的空缓冲区数 */l full:semaphore; /* 缓冲区内可以使用的产品数缓冲区内可以使用的产品数 */l empty := 1; /* 缓冲区内允许放入一件产品缓冲区内允许放入一件产品 */l full := 0; /* 缓冲区内没有产品缓冲区内没有产品 */lcobegin /*多个子进程并发执行函
2、数多个子进程并发执行函数*/ lProcess producer process consumer lbegin beginl L1: L2:lProduce a product; P(full);lP(empty); 取产品取产品l 直到取为空直到取为空l放产品;放产品;l 直到为满;直到为满; V(empty);lV(full); Consume a product;lGoto L1; Goto L2;l end; end;l coendl2.2.实例实例l设某台机挂有两个I/O通道:分别挂一台输入机和一台打印机。卡片机上有一叠数据卡片,现在要把这些数据逐一输入到缓冲区B1,然后再复制到缓
3、冲区B2,并在打印机上打印出来。l问问:系统可设哪些进程来完成这个任务?用P-V原语写这些进程的同步算法。 解:由上图可见,系统可设3个进程:输入进程、复制进程、打印进程;分别用进程R、进程C、进程P来表示。 这些进程之间的相互制约关系: R受C的约束;C受R、P的约束;P受C的约束。 设4个信号量:S1=1,S2=0,S3=1,S4=0 同步算法如下:3.理发师问题理发师问题l理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子l如果没有顾客,理发师便在理发椅上睡觉l一个顾客到来时,它必须叫醒理发师l如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开记录
4、型信号量解决理发师问题 var waiting : integer; var waiting : integer; / /* *等候理发的顾客数等候理发的顾客数* */ / CHAIRS:integer; / CHAIRS:integer; /* *为顾客准备的椅子数为顾客准备的椅子数* */ / customers, barbers customers, barbers,mutex : semaphore;mutex : semaphore; customers := 0; barbers := 0; waiting := 0; mutex := 1; customers := 0; bar
5、bers := 0; waiting := 0; mutex := 1;Process barber;Process barber;beginbeginwhile(TRUE); while(TRUE); / /* *理完一人理完一人, ,还有顾客吗还有顾客吗? ?* */ / P(cutomers); / P(cutomers); /* *若无顾客若无顾客, ,理发师睡眠理发师睡眠* */ / P(mutex); / P(mutex); /* *进程互斥进程互斥* */ / waiting := waiting 1; / waiting := waiting 1; /* *等候顾客数少一个等候
6、顾客数少一个* */ / V(barbers); / V(barbers); /* *理发师去为一个顾客理发理发师去为一个顾客理发* */ / V(mutex); / V(mutex); /* *开放临界区开放临界区* */ / cut-hair( ); / cut-hair( ); /* *正在理发正在理发* */ /end;end;process customerprocess customerbeginbegin P(mutex); / P(mutex); /* *进程互斥进程互斥* */ / if waitingCHAIRS begin / if waitingCHAIRS begin
7、 /* *看看有没有空椅子看看有没有空椅子* */ / waiting := waiting+1; / waiting := waiting+1; /* * 等候顾客数加等候顾客数加1 1* */ / V(customers); / V(customers); /* *必要的话唤醒理发师必要的话唤醒理发师* */ / V(mutex); / V(mutex); /* *开放临界区开放临界区* */ / P(barbers); / P(barbers); /* *无理发师无理发师, , 顾客坐着养神顾客坐着养神* */ / get-haircut( ); / get-haircut( ); /*
8、 *一个顾客坐下等理发一个顾客坐下等理发* */ / end end V(mutex); / V(mutex); /* *人满了人满了, ,走吧走吧! !* */ /end;end;互斥实例互斥实例有三个用户进程A、B和C,在运行过程中都要使用系统中的一台打印机输出计算结果。 试说明A、B、C进程之间存在什么样的制约关系? 为保证这三个进程能正确地打印出各自的结果,请用信号量和P、V操作写出各自的有关申请、使用打印机的代码。要求给出信号量的含义和初值。l (1) A、B、C三个进程之间存在互斥的制约关系。因为打印机属于临界资源,必须一个进程使用完之后另一个进程才能使用。l(2)mutex:用于