最新IPC经典问题.doc

上传人:1595****071 文档编号:33808486 上传时间:2022-08-12 格式:DOC 页数:15 大小:416KB
返回 下载 相关 举报
最新IPC经典问题.doc_第1页
第1页 / 共15页
最新IPC经典问题.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《最新IPC经典问题.doc》由会员分享,可在线阅读,更多相关《最新IPC经典问题.doc(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精品资料IPC经典问题.IPC经典问题读者写者问题读者优先:semaphore mutex=1;/控制对rc的访问semaphore db=1;/控制对数据库的访问int rc=1;/正在读或想要读的进程数void reader(void) while(1) down(&mutex); rc+; if(rc=1) down(&db); up(&mutex); read_database(); down(&mutex); rc-; if(rc=0) up(&db); up(&mutex); use_data_read(); void writer(void) while(1) think_up_

2、data(); down(&db); write_database(); up(&db); 写者优先,条件为:(1)多个读者可以同时进行读;(2)写者必须互斥(只允许一个写者写,同时也不能读者、写者同时进行);(3)写者优先于读者(一旦有写者来,则后续读者必须等待,唤醒时优先考虑写者)。注意唤醒时优先考虑写者这个条件semaphore read=1;/用于阻塞读者semaphore rmutex=1,wmutex=1;/用于控制对rcount和wcount的访问semaphore db=1;/控制对数据库的访问int rcount=wcount=0;void reader(void) p(re

3、ad); /只要有写者等待,读者就会阻塞 p(rmutex); rcount+; if(rcount=1) p(db); v(rmutex); v(read);/及时释放,多个读者可以同时读 read_database(); p(rmutex); rcount-; if(rcount=0) v(db); v(rmutex);void writer(void) p(wmutex); wcount+; if(wcount=1) p(read); v(wmutex); p(db); write_database(); v(db); p(wmutex); wcount-; if(wcount=0) v

4、(read); v(wmutex);如果唤醒时读写队列平等的话semaphore write=1;/用于阻塞写者semaphore mutex=1;/用于控制对rc的访问semaphore db=1;/控制对数据库的访问int rc=0;void reader(void) p(db); p(mutex); rc+; if(rc=1) p(write); /有读者进入,互斥写操作 v(mutex); v(db); / 及时释放读写互斥信号量,允许其它读、写进程申请资源 read_database(); p(mutex); rc-; if(rc=0) v(write); /所有读者退出,允许写操作

5、 v(mutex);void writer(void) p(db);/ 互斥后续其它读者、写者 p(write);/如有读者正在读,等待所有读者读完 write_database(); v(write);/允许后续新的第一个读者进入后互斥写操作 v(db);/允许后续新读者及其它写者 哲学家就餐问题思路:如果一个哲学家旁边两个都不在进餐时拿起叉子是安全的。注意状态的变化应该处于临界区,如果一个哲学家不能拿起叉子时应阻塞,同时加入一个状态表明他饥饿,旁边的哲学家就餐完毕会通知他#define N 5#define LEFT (i-1)%N#define RIGHT (i+1)%N#define

6、THINKING 0#define HUNGRY 1#define EATING 2int stateN;/记录每个人状态的数组semaphore mutex=1;/临界区互斥semaphore sN=0;/每个哲学家一个信号量,表示能否得到两只叉子void philosopher(int i) while(1) think(); take_forks(i); eat(); put_forks(i); void take_forks(int i) donw(&mutex); statei=HUNGRY; test(i);/试图得到两只叉子 up(&mutex); down(&si);/如果得不

7、到叉子就阻塞void put_forks(int i) down(&mutex); statai=THINKING; test(LEFT);/看下左邻居现在是否能进餐 test(RIGHT);/看下右邻居现在是否能进餐 up(&mutex);void test(int i) if(statei=HUNGRY & stateLEFT!=EATING & stateRIGHT!=EATING) statei=EATING; up(&si); 红黑客过河有红客和黑客两组人员需要过河。河上有船,但是每次只能乘坐4人,且每次乘客满员时才能开船,到河对岸后空船返回。但船上乘客不能同时有3个红客 、1个黑客

8、 或者 1个红客 、 3个黑客的组合。(其他组合安全)。请编写程序,用PV操作解决红客、黑客过河的问题。对同步与互斥的分析:同步关系:1. 满员才能开船;2. 红黑客满足一定的组合规则,才能有四人上船互斥关系:红黑客对请求上船的控制显然,此题难点在对同步关系的解决。下面给出所写程序的算法思想: Red():每个红客到来请求上船时执行该程序: 1.请求进入临界区; 2.首先检查本人的到来是否满足上船的组合(即4个红客或2个红客与2个黑客); 3.如果满足2个红客和2和黑客的组合,则看是否有船可上,有的话该红客上船并通知另外1个红客和2个黑客上船,然后通知船满员,并退出临界区; 4.如果满足4个红

9、客的组合,则看是否有船可上,有的话该红客上船并通知另外3个红客上船,然后通知船满员,并退出临界区; 5.不符合上船的组合,则先退出临界区,然后在信号量S_red上等待,直到当条件满足时,有人通知其上船。 6.完毕。 Black():每个黑客到来请求上船时执行该程序,其算法与Red()完全一致; Boat():河上的船执行该程序:1.等待满员后开船过河; 2.空船返回,通知可以上船了,转而执行1。 / semapore boats=1; /河上船只的数量 semapore full=0; /船的满员状态 semapore S_red=0; /控制红客上船 semapore S_black=0;

10、/控制黑客上船 semapore mutex=1; /由于互斥 int reds=0; /等待上船的红客数 int blacks=0; /等待上船的黑客数 Red() P(mutex);/进入临界区 reds+; /等待上船的红客数加1 if(reds =2 & blacks =2) /2个红客和黑客的组合 P(boats); /准备上船,无船则等待 take_boat();/该红客上船 reds=reds-2;/等待上船的红客数减2 V(S_red); /通知另一个红客上船 blacks=blacks-2;/等待上船的黑客数减2 /通知其他两黑客上船 V(S_black); V(S_blac

11、k); V(full);/通知船满员 V(mutex);/退出临界区 else if(reds=4) /4个红客的组合 P(boats); /准备上船,无船则等待 take_boat(); /该红客上船 /递减等待上船的红客数,通知其他3个红客上船 while(-reds) V(S_red); V(full);/通知船满员 V(mutex);/退出临界区 else V(mutex);/退出临界区,此步必在P(S_red)之前,不然会产生死锁 /该红客等待直至条件满足时上船 P(S_red); take_boat(); Black() P(mutex); blacks+; if(blacks =

12、2 & reds =2) P(boats); take_boat(); blacks=blacks-2; V(S_black); reds=reds-2; V(S_red); V(S_red); V(full); V(mutex); else if(blacks=4) P(boats); take_boat(); while(-blacks) V(S_black); V(full); V(mutex); else V(mutex); P(S_black); take_boat(); Boat() while(TRUE) P(full); /等待满员 shove_off(); /开船过河 boat_return();/空船返回 V(boats); /通知可以上船了 该算法存在一个问题是如果2红1黑时接下来来的都是红客时,会造成饥饿现象。改进:利用5人中必有4人满足开船条件,每5个人检查一下让其中4个人过河,红黑客算法也不用分开写了。转载于:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com