计算机操作系统进程同步练习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int stack[10];
int top;
void getspace()
{
int free;
free=stack[top];
top--;
cout<<" free="< } void release(int free) { top++; stack[top]=free; } main() { for(top=0;top<10;top++) stack[top]=-1; stack[0]=288; stack[1]=121; stack[2]=85; stack[3]=32; stack[4]=6; top=4; cobegin { release(100); getspace(); } cout<<" top="< for(;top>=0;top--) cout<<" stack["< } 进程同步练习题 1. 第二类读者写者问题,信号量解决方法 答:为了使写者优先,可在原来的读优先算法的基础上增加一个互斥信号量s,初值为1,使得当至少有一个写者准备访问共享对象时,它可以使后续的读者进程等待完成; 整型变量writecount,初值为0,用来对写者进行计数; 互斥信号量mutex,初值为1,用来实现多个读者对写者writecount进行互斥访问。 Process reader() { while(1) {wait(s); wait(rmutex); if(readcount==0)wait(wmutex); readcount++; signal(rmutex); signal(s); perform read operation; wait(rmutex); readcount--; if(readcount==0)signal(wmutex); signal(rmutex); } } Process writer() { while(1) {wait(mutex); if(writecount==0)wait(s); writecount++; signal(mutex); wait(wmutex); perform write operation; signal(wmutex); wait(mutex); writecount--; if(writecount==0)signal(s); signal(mutex); } } Main( ) {cobegin { reader(); writer(); } } 2. 复印室里有一个操作员为顾客复印资料,有5把椅子供顾客休息等待复印。如果没有顾客,则操作员休息。当顾客来到复印室时,如果有空椅子则坐下来,并唤醒复印操作员;如果没有空椅子则必须离开复印室。 答: 信号量: customers表示正在等待复印的顾客数量(不包括正在复印的顾客) operator记录正在等候顾客的操作员数,只有1和0 mutex用于对waiting的访问; 变量: waiting表示等待的顾客数量。它实际上是customers的一个副本。之所以使用waiting是因为无法读取信号量的当前值。 semaphore customers=0,operator=0,mutex=1; waiting=0; process operator( )//操作员进程 { while(1) { wait(customers); //等待顾客到来 复印; signal(operator); //通知顾客已经完成复印} } process cusotmeri( )//顾客进程i { wait(mutex); if(waiting<5) {waiting++; signal(customers); signal(mutex); wait(operator); wait(mutex); waiting--; signal(mutex);} else {signal(mutex); 离开复印室;} } main( ) {cobegin { operator( ); customeri( ); } } 3、如果有三个进程R、W1、W2共享一个缓冲器B,而B中每次只能存放一个数。当缓冲器中无数时,进程R可以将从输入设备上读入的数存放到缓冲器中。若存放到缓冲器中的是奇数,则允许进程W1将其取出打印;若存放到缓冲器中的是偶数,则允许进程W2将其取出打印。同时规定:进程R必须等缓冲区中的数被取出打印后才能再存放一个数;进程W1或W2对每次存入缓冲器的数只能打印一次;W1和W2都不能从空缓冲中取数。写出这三个并发进程能正确工作的程序。 答:S为互斥信号量,用来对缓冲器的互斥使用; SO和SE为资源信号量,SO表示是否允许进程W1打印;SE表示是否允许进程W2打印。 semaphore S=1,SO=SE=0; buffer B; process R() { int x; while(1) {从输入设备上读一个数; x=接收的数; wait(S); B=x; if B=奇数then signal(SO); else signal(SE); } } process W1()