1. 推广例子中的消息缓冲问题。 消息缓冲区为k个,有1个发送进程, n个接收进程,每个接收进程对发送来的消息都必须取一次 若有m个发送进程呢?
Send: SB=k; //信号量,标记当前空余缓冲区资源。 i = 0; //标记存放消息的缓冲区位置while (true) { P(SB); 往Buffer [i]放消息; V(SM); i = (i+1) % k; };
Receive: j = 0; //标记取产品的缓存区位置 SM=0;//信号量,标记初始没有消息 ReadCount=0;//读进程计数器 Mutex =1; //读进程互斥信号量 SW=0; //信号量,读进程在此信号量等待 while (true) { P(SM); 从Buffer[j]取消息; ReadCount++ If(ReadCountn){ V(SM); P(SW) }else{ V(SB); j = (j+1) % k; for(int g=1; g ReadCount;g++) V(SW); ReadCount=0; } };
2.第二类读者写者问题: 写者优先 条件: 1)多个读者可以同时进行读 2)写者必须互斥(只允许一个写者写,也不能读者写者???时进行) 3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
rc=0, //正在读者计数器 wc, //写计数器 rw, //读等计数器 R //等待读信号量 W //等待写信号量
读者: while (true) { P(mutex); if (wc 0){ rw++ P (R); } rc++; If(rw0wc=0){ V(R) rw-- } V(mutex); 读 P(mutex); rc --; if (rc==0){ If(wc0) V(w) } V(mutex); };
写者: while (true) { P(mutex); wc ++; if((wc 1)||(rc0)){ P(W) } V(mutex); 写 P(mutex); Wc --; if(wc0) V(W); Else if(rw0) V(R) rw-- V(mutex); };
3.理发师睡觉问题 理发店里有一位理发师,一把理发椅和N把供等候理发的顾客坐的椅子 如果没有顾客,则理发师便在理发椅上睡觉。当一个顾客到来时,他必须先唤醒理发师 如果顾客到来时理发师正在理发,则如果有空椅子,可坐下来等;否则离开 Wait =0; 表示等待顾客资源; Barber=1;表示可以理发 custNum 关键资源,表示当前顾客数量 顾客进程:
Coming//顾客来到 P(mutex) If(custNum0){ If(custNum=N){ V(mutex) P(wait); }else{ V(mutex) 离开; } }else{ V(mutex) V(Barber); 理发; 离开; P(mutex) custNum--; V(mutex) V(wait) } 理发师进程: While{ P(mutex) If(custNum ==0){ V(mutex) P (Barber) }else{ V(mutex) 理发 } }
到此这篇 操作系统例题(操作系统经典例题)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/59003.html