- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验三使用Linux高级IPC
陈毅东
梢补般氖棱镍刺兵烫泵甭玻蓝讲嘿舔肛工览锭逢五酵篱犀凸侧净楼殃纠缝linux高级IPClinux高级IPC
提纲
结束
进程间通信概述
目标问题——哲学家进餐问题
问题描述
错误与不好的解法
并行度较高的解法
Linux高级IPC机制
概述
System V信号灯
System V共享内存区
实现的其他问题
实习题
砂瓣鹃获衫香枚姐奎舞党埔怀惠阔溶侄秩胃步火桐澄谨魂命纶撬刃茂密烈linux高级IPClinux高级IPC
进程间通信概述(1):引子
#include unistd.h#include sys/types.hint result;main(){ pid_t pid; result=0; pid=fork(); if(pid0) exit(-1);
if(pid){ pid=fork(); if(pid0) exit(-1); if(pid==0){ sleep(3); result=result+20; exit(0); }}
else{ sleep(3); result=result+10; exit(0); } while(wait((int*)0)!=-1); printf(%d\n, result); exit(0);}
输出结果是什么?
贪凸忽债运录撂另颐拒奢仿上泻昔羞赖盔唯赡依猖导爱尺滑喉缨茁汝尺荆linux高级IPClinux高级IPC
进程间通信概述(2)
进程是相互独立的,进程间的通信需要专门的机制。
进程之间的通信可以经由文件系统,但实际使用较为复杂(例如,需要锁机制)。
UNIX IPC (InterProcess Communication)机制是各种进程通信方式的统称。
Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。
宗桃庚拿见豆抢塌兄慨沂杏果颇妹笋鳃外昔旗让蜘莫谁爵猪栅照巡桓拉淫linux高级IPClinux高级IPC
进程间通信概述(3)
对于UNIX的发展,贝尔实验室和BSD在进程间通信方面的侧重点有所不同:
贝尔实验室对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;
BSD则主要考虑跨计算机的进程间通信,形成了基于套接口(socket)的进程间通信机制。
痪瘦驱拂柏畔娩杯皇摆矿灾氨艺蔷课蘑谐沥拍甩辛盟超栋铸锤牌卡缮弟解linux高级IPClinux高级IPC
进程间通信概述(4)
返回
最初的Unix IPC:信号、管道、FIFO;
System V IPC:消息队列、信号量、共享内存区;
POSIX IPC:消息队列、信号量、共享内存区。
甫资燥烁榆粤匙持冲可狡靖萌新阔亥瞳凳纶缚落惩匠柬哀脚辊巾绥滋崩央linux高级IPClinux高级IPC
哲学家进餐问题的描述
五个哲学家围坐在一张圆桌周围,每个哲学家面前都有一碗米饭,相邻的两碗之间有一支筷子(如图)。
哲学家的生活包含两种活动:即吃饭和思考。当一个哲学家觉得饿时,他就试图分两次去取他左边和右边的筷子,每次拿起一支,但不分次序。如果成功地获得了一双筷子,他就开始吃饭,吃完以后放下筷子继续思考。这样,问题就是,为每个哲学家写一段程序来描述其行为,要求不死锁。
返回
特街阳浙熔莫滑棋循赴企题绕袁一蚌对剖乎赘咀橡慰始滩丈掳伙逸稚阻蚜linux高级IPClinux高级IPC
错误与不好的解法(1)
解法一:可能进入“死锁”状态
#define N 5
void philosopher(int i)
{
while(TRUE){
think();
take-chopstick(i);
take-chopstick((i+1)%N);
eat();
put-chopstick(i);
put-chopstick((i+1)%N);
}
}
秦真片鸣碟旋丑栈哇泪截漫哄勤照徽褪拱亏拓烃恍窘妄酸寺腊啊爹蔑膨柏linux高级IPClinux高级IPC
错误与不好的解法(2)
#define N 5
void philosopher(int i)
{
while(TRUE){
think();
do{
take-chopstick(i);
if(can-take-chopstick((i+1)%N)) break;
else put-chopstick(i);
}whi
文档评论(0)