二、读者写者问题
—个数据文件或记录可被多个进程共享,我们把只要求读该文件的进程称为“Reader 进程”,其他进程则称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操 作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或Writer进程同时访 问共享对象。因为这种访问将会引起混乱。所谓“读者-写者(Reader-WriterProblem)问题” 是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题,读者-写者问题 常被用来测试新同步原语。
int sw=1,rc=0,sr=1; void reader(){ p(sr); if(rc==0) p(sw); rc++; v(sr); read; p(sr); rc--; if(rc==0) v(sw); v(sr); } void writer(){ p(sw); write; v(sw); }
三、哲学家就餐问题
该问题是描述有五个皙学家共用一张圆桌,分别坐在周围的五张椅子上.在圆 桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐;平时,一个哲学家 进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他令到两只筷子时才能进餐。 进餐毕,放下筷子继续思考。
P(Si); P(S(i+1)%5); eat; V(Si); V(S(i+1)%5);
解决方案
(1) 至多只允许有四位哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能 够进餐,并在用毕时能释放出他用过的两只筷子,从而使史多的哲学家能够进餐。
(2) 仅当哲学家的左、右两只筷子均可用时,才允许他拿起筷子进餐。
P(Si,S(i+1)%5); eat; V(Si,S(i+1)%5);
(3) 规定奇数号哲学家先拿他左边的筷T,然后再去拿右边的筷子:而偶数号哲学家 则相反。按此规定,将是1、2号哲学家竞争1号筷户:3、4号哲学家竞争3号筷子。即 五位哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家 能获得两只筷子而进餐。
if(i%2==1){ P(Si); P(S(i+1)%5); } else{ P(S(i+1)%5); P(Si); } eat; V(Si); V(S(i+1)%5);
9.4 进程通信
低级通信:信号量,PV操作
高级通信:信箱
一、进程通信的类型
- 共享存储器系统
(1) 基于共享数据结构的通信方式。在这种通信方式中,要求诸进程公用某些数据结构,借以实现诸进程间的信息交换,如在生产者-消费者问题中的有界缓冲区。操作系统仅 提供共享存储器,由程序员负责对公用数据结构的设背及对进程间同步的处理。这种通信 方式仪适于传递相对少最的数据,通信效率低下,属于低级通信。
(2) 基于共享存储区的通信方式。为了传输大量数据,在内存中划出了一块共享存储 区域,诸进程可通过对该共享区的读或写交换信息,实现通信,数据的形式和位置甚至访问控制都是由进程负责,而不是os。这种通信方式属于高级通信。
- 管道通信系统
所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享 文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(即写进程)以字符流形式将大量的数据送入管道:而接受管道输出的接收进程(即读进程)则从管道中接收(读)数据。由于 发送进程和接收进程是利用管道进行通信的,故又称为管道通信。这种方式首创于 UNIX 系统,由于它能有效地传送大量数据,因而又被引入到许多其它操作系统中。
- 消息传递系统
(1)直接通信方式,是指发送进程利用OS所提供的发送原语,直接把消息发送给目标进程:
(2)间接通信方式,是指发送和接收进程,都通过共享中间实体(称为邮箱)的方式进行消息的发送和接收,完成进程间的通信。