题目
有3个进程P1、P2和P3协作解决文件打印问题。P1将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;P2将缓冲区1中的内容复制到缓冲区2中,每执行一次复制一个记录;P3将缓冲区2中的内容打印出来,每执行一次打印一个记录。缓冲区的大小与记录大小一样。请用信号量[1]来保证文件的正确打印。
有3个进程P1、P2和P3协作解决文件打印问题。P1将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;P2将缓冲区1中的内容复制到缓冲区2中,每执行一次复制一个记录;P3将缓冲区2中的内容打印出来,每执行一次打印一个记录。缓冲区的大小与记录大小一样。请用信号量[1]来保证文件的正确打印。
题目解答
答案
P1(){ while(1){ 从磁盘读一个记录; P(empty1); 将记录存放到缓冲区1中; V(full1); } } P2(){ while(1){ P(full1); P(empty2); 从缓冲区1中取出一个记录; 将记录复制到缓冲区2中; V(empty1); V(full2); } } P3(){ while(1){ P(full2); 从缓冲区2中取出一个记录; V(empty2); 将取出的记录打印出来; } } main(){ cobegin P1(); P2(); P3(); coend }
解析
步骤 1:定义信号量
定义信号量empty1、full1、empty2和full2,分别用于控制缓冲区1和缓冲区2的空闲和已满状态。初始值分别为1和0,表示缓冲区1和缓冲区2初始为空。
步骤 2:进程P1的实现
进程P1从磁盘读取记录,然后将记录存入缓冲区1。在存入记录之前,需要确保缓冲区1有空闲空间,即执行P(empty1)操作。存入记录后,表示缓冲区1已满,执行V(full1)操作。
步骤 3:进程P2的实现
进程P2从缓冲区1中取出记录,然后将记录复制到缓冲区2。在取出记录之前,需要确保缓冲区1中有记录,即执行P(full1)操作。在复制记录之前,需要确保缓冲区2有空闲空间,即执行P(empty2)操作。复制记录后,表示缓冲区1空闲,执行V(empty1)操作,同时表示缓冲区2已满,执行V(full2)操作。
步骤 4:进程P3的实现
进程P3从缓冲区2中取出记录,然后将记录打印出来。在取出记录之前,需要确保缓冲区2中有记录,即执行P(full2)操作。取出记录后,表示缓冲区2空闲,执行V(empty2)操作。
步骤 5:主函数的实现
主函数中使用cobegin和coend关键字创建进程P1、P2和P3,并并发执行。
定义信号量empty1、full1、empty2和full2,分别用于控制缓冲区1和缓冲区2的空闲和已满状态。初始值分别为1和0,表示缓冲区1和缓冲区2初始为空。
步骤 2:进程P1的实现
进程P1从磁盘读取记录,然后将记录存入缓冲区1。在存入记录之前,需要确保缓冲区1有空闲空间,即执行P(empty1)操作。存入记录后,表示缓冲区1已满,执行V(full1)操作。
步骤 3:进程P2的实现
进程P2从缓冲区1中取出记录,然后将记录复制到缓冲区2。在取出记录之前,需要确保缓冲区1中有记录,即执行P(full1)操作。在复制记录之前,需要确保缓冲区2有空闲空间,即执行P(empty2)操作。复制记录后,表示缓冲区1空闲,执行V(empty1)操作,同时表示缓冲区2已满,执行V(full2)操作。
步骤 4:进程P3的实现
进程P3从缓冲区2中取出记录,然后将记录打印出来。在取出记录之前,需要确保缓冲区2中有记录,即执行P(full2)操作。取出记录后,表示缓冲区2空闲,执行V(empty2)操作。
步骤 5:主函数的实现
主函数中使用cobegin和coend关键字创建进程P1、P2和P3,并并发执行。