实验项目四 进程通信
实验项目四进程通信
一、实验目的
1.介绍什么就是消息,熟识消息传输原理。2.介绍和熟识共享资源存储机制。3.掌控消息的传送与发送的同时实现方法。
二、实验内容
1.根据消息传输机理,采用系统调用msgget(),msgsnd(),msgrev(),及msgctl()基本建设一长度为1k的消息传送和发送的程序,建议在程序中顺利完成10次消息的传送和发送,每次传送消息完结和发送消息完结都须要得出适当的屏幕提示,且每次传送的的内容不少于一个字符,时能在接收端输入。2.根据共享资源存储区原理,采用系统调用shmget(),shmat(),shmdt(),及shctl()编制程序,建议建立一个长度为1k的共享资源存储区,并顺利完成10次数据的传送和发送,每次发送数据完结和接收数据完结都须要得出适当的屏幕提示,且每次传送的的数据Montmirail在接收端输入。
三、源程序及运行结果
1.源程序:
#include//客户端程序#include#include#include
#definemsgkey75structmsgform{
longmtype;
charmtext[1024];}msg;
intmsgqid,i;voidclient(){
inti;
msgqid=msgget(msgkey,0777|ipc_creat);for(i=10;i>=1;i--){pe=i;
[i]='k'-i;printf(\msgsnd(msgqid,&msg,1024,0);}}
main(){
client();}
#include//服务器程序#include#include#include
#definemsgkey75structmsgform{
longmtype;
charmtext[1024];}msg;
intmsgqid,i;voidserver(){
msgqid=msgget(msgkey,0777|ipc_creat);do{
msgrcv(msgqid,&msg,1024,0,0);printf(\printf(\
}pe!=1);msgctl(msgqid,ipc_rmid,0);}
main()
{
server();}
运转结果:
2.源程序:
#include//客户端#include#include#include#include
#defineshmkey75intshmid,i;int*addr;voidclient(){inti,n=1;
shmid=shmget(shmkey,1024,0777);/*关上共享资源存储区*/addr=shmat(shmid,0,0);/*赢得共享资源存储区首地址*/for(i=0;i<10;i++){while(*addr!=-1);printf(\*addr=n++;
printf(\sleep(1);}
exit(0);
}
intmain(){client();}
#include//服务器程序#include#include#include#include
#defineshmkey75intshmid,i;int*addr;voidserver()
{shmid=shmget(shmkey,1024,0777|ipc_creat);/*创建共享存储区*/for(i=0;i<10;i++){
addr=shmat(shmid,0,0);/*以获取首地址*/*addr=-1;
while(*addr==-1);printf(\
printf(\(server)received\\n\sleep(1);}
shmctl(shmid,ipc_rmid,0);/*撤消共享存储区,归还资源*/exit(0);}
intmain(){server();}
运行结果:(截图)
四、实验分析与总结
对实验运行结果进行分析:试比较实验中两种方法实现进程通信的不同之处。分析:
(1)消息队列的创建比共享资源区的成立消耗的资源太少.前者只是一个软件上预设的问题,后者须要对硬件操作方式,同时实现内存的蓝光,当然掌控出来比前者繁杂.如果每次都再次展开队列或共享资源的创建,共享资源区的成立没什么优势。
(2)当消息队列和共享区建立好后,共享区的数据传输,受到了系统硬件的支持,不耗费多余的资源;而消息传递,由软件进行控制和实现,需要消耗一定的cpu资源.从这个意义上讲,共享区更适合频繁和大量的数据传输.
(3)消息的传达,自身就具有同步的掌控.当要到消息的时候,进程步入呼吸状态,不再消耗cpu资源.而共享资源队列如果不利用其他机制展开同步,拒绝接受数据的一方必须展开不断的查阅,白白浪费了大量的cpu
资源.可见消息方式的使用更加灵活.
总结:message的传输和掌控并不确保全然同步,当一个程序无此激活状态的时候,它全然可能将稳步呼吸,造成了上面的现象,在多次sendmessage后才recievemessage。这一点有利于认知消息传输的同时实现机理。对于共享资源存储区通信当client端的传送了数据后,
并没任何措施通告server端的数据已经收到,须要由client的查阅就可以认知。此时,client端的并没退出系统的控制权,仍然挤占cpu的时间片。只有当系统展开调度时,转换至了server进程,再展开接收者。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论