今有三个并发进程 R、M、P,它们共享了一个可循环使用的缓冲区 B,缓冲区 B 共有 N 个单元。进程 R 负责从输入设备读信息,每读一个字符后,把它存放在缓冲区 B 的一个单元中;进程 M 负责处理读入的字符,若发现读入的字符中有空格符,则把它改成“,”;进程 P 负责把处理后的字符取出并打印输出。当缓冲区单元中的字符被进程 P 取出后,则又可用来存放下一次读入的字符。请用 P、V 操作为同步机制写出它们能正确并发执行的程序。
本题和一个经典进程同步问题—— “生产者——消费者” 问题相似,“生产者——消费者” 描述了一组生产者向一组消费者提供产品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。以此基本问题为启发思路,对上面的并发进程 “R、M、P” 问题我想到了可以设置如下几个同步信号量。
在本题目中,有三个进程 R、M、P 在执行时都要对有界缓冲区进行操作,也就是说它们需要共享有界缓冲区,因此对有界缓冲区的使用必须互斥,为此还需要设置一个互斥信号量 mutex,其初值为 1。
该并发进程 “R、M、P” 问题的同步描述如下:
semaphore full=0; /* 满缓冲单元的数目 */ semaphore empty=N; /* 空缓冲单元的数目 */ semaphore undeal=0; /* 未处理的字符数目 */ semaphore dealed=0; /* 已处理的字符数目 */ semaphore mutex=1; /* 对有界缓冲区进行操作的互斥信号量 */ main() { cobegin R(); M(); P(); coend } R() { while (true) { 读一个字符; P(empty); P(mutex); 将一个字符送入缓冲区; V(mutex); V(undeal) V(full); } } M() { while (true) { P(undeal); P(mutex); 处理字符; V(mutex); V(dealed); } } P() { while (true) { P(full) P(dealed); P(mutex); 从缓冲区中取一个字符; V(mutex); V(empty); 打印一个字符; } }
欢迎大家评论留言讨论,若有不当和错误的地方也欢迎大家指出,共同进步!