- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统--实验二
《计算机操作系统》
实验二 进程通信
学号:030902136 姓名: 廖露露
学院: 数计学院 专业: 计算机类
年级: 09级 班级: 1班
指导教师:黄志华
【实验名称】:进程通信(实验2)
【实验目的】:掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法。
【实验原理】:邮箱机制类似于日常使用的信箱。对于用户而言使用起来比较方便,用户只需使用send()向对方邮箱发邮件 receive()从自己邮箱取邮件, send()和 receive()的内部操作用户无需关心。因为邮箱在内存中实现,其空间有大小限制。其实send()和 receive()的内部实现主要还是要解决生产者与消费者问题。
【实验内容】:进程通信的邮箱方式由操作系统提供形如send()和receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上。在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱需要有创建、发信、收信、撤销等函数,至少能够支持两个进程互相交换信息,比较自己实现的信箱与操作系统本身提供的信箱,分析两者之间存在的异同。
【实验要求】:每个同学必须独立完成本实验、提交实验报告、源程序和可执行程序。实验报告中必须包含背景知识介绍,设计方案,预计的实验结果,关键代码的分析,调试记录,实际的实验结果,实验结果分析等内容。
【背景知识介绍】:
实验所涉及的理论知识:
进程间通信:
1.邮箱通信的工作方式
2.信号量的使用
3.共享存储区
4.PV操作
【Linux中系统提供的进程通信方式】
Linux系统平台上用于进程通信的系统调用具体形式
用msgget、msgsnd、msgrcv、msgctl系统调用函数可以实现进程之间的通信。
while((p=fork())==-1);
if(p==0) {
sleep(1);
pid=msgget(key,IPC_CREAT|0600);
msgrcv(pid,mtext,buffersize,0,0);
printf(receive msg is:%s\n, mtext);
msgctl(pid,IPC_RMID,0);
} else {
pid=msgget(key,IPC_CREAT|0600);
strcpy(mtext,This is the message which the parent have sent!d);
while((msgsnd(pid,mtext,buffersize,0))==-1);
}
消息队列提供了一种由一个进程向另一个进程发送块数据的方法。另外,每一个数据块被看作有一个类型,而接收进程可以独立接收具有不同类型的数据块。消息队列的好处在于我们几乎可以完全避免同步问题,并且可以通过发送消息屏蔽有名管道的问题。更好的是,我们可以使用某些紧急方式发送消息。坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限制,同时在系统中所有消息队列上的块尺寸上也有一个最大尺寸限制_Receive()和 B_ Receive()分别接收 A_Send()和 B_Send()发出的信息,发送的信息和接受的信息应该一样。
【关键代码的分析】
信号量的使用
三个重要函数:
1.Semget();//函数创建一个新的信号量或是获得一个已存在的信号量键值
2.Semop();//用来改变信号量的值
3.Semctl();//允许信号量信息的直接控制
信号量的使用
semget
semget函数创建一个新的信号量或是获得一个已存在的信号量键值。
int semget(key_t key, int num_sems, int sem_flags);
第一个参数key是一个用来允许不相关的进程访问相同信号量的整数值。所有
的信号量是为不同的程序通过提供一个key来间接访问的,对于每一个信号量
系统生成一个信号量标识符。信号量键值只可以由semget获得,所有其他的信
号量函数所用的信号量标识符都是由semget所返回的。num_sems参数是所需
要的信号量数目。这个值通常总是1。sem_flags参数是一个标记集合,与open
函数的标记十分类似。低九位是信号的权限,其作用与文件权限类似。另外这
些标记可以与 IPC_CREAT进行或操作来创建新的信号量。设置IPC_CREAT
标记并且指定一个已经存在的信号量键值并不是一个错误。如果不需要,
IPC_CREAT标记
文档评论(0)