操作系统——进程通信

学生实验报告
实验课名称: 计算机操作系统
实验项目名称: 进程间通信实验
专业名称: 计算机科学与技术

一.实验目的:
Linux系统的进程通信机构(IPC)允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉Linux支持的消息通信机制、共享存储区机制及信息量机制。
二.实验要求:
阅读Linux系统的msg.c、sem.c和shm.c等源码文件,熟悉Linux的三种机制。
三.实验内容:
(1)消息的创建,发送和接收。
①使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1K的消息的发送和接收程序。
②观察上面程序,说明控制消息队列系统调用msgctl()在此起什么作用?
(2)共享存储区的创建、附接和断接。
使用系统调用shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序。
(3)比较上述(1),(2)两种消息通信机制中数据传输的时间。
四.算法描述:
1.server建立一个 Key 为75的消息队列,等待其它进程发来的消息。当遇到类型为 1的消息,则作为结束信号,取消该队列,并退出server。server每接收到一个消息后显示一句“(server)received。” client使用 key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后一个消息,即是 server端需要的结束信号。client 每发送一条消息后显示一句“(client)sent”。
2.为了便于操作 和观察结果,用一个 程序为“引子”,先后fork( )两个子进程,SERVER和 CLIENT,进行通信。 SERVER端建立一个KEY为75的共享区,并将第一个字节置为-1.作为数据空的标志.等待其他进程发来的消息.当该字节的值发生变化时,表示收到了该消息,进行处理.然后再次把它的值设为-1,如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。SERVER每接收一次数据后显示“(server)received”。CLIENT端建立一个KEY为75的共享区,当共享取得第一个字节为-1时,SERVER端空闲,可发送请求。CLIENT随即填入10到1。期间等待SERVER端再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发送一次数据后显示“(client)sent”。
五.运行结果与分析:

<结果>
运行的结果和预想的完全一样。但在运行的过程中, 发现每当client 发送一次数据后,server 要等大约0.1 秒才有响应。同样,之后client 又需要等待大约0.1 秒才发送下一个
数据。
<分析>
出现上述的应答延迟的现象是程序设计的问题。当client 端发送了数据后,并没有任何措施通知server 端数据已经发出,需要由client 的查询才能感知。此时,client 端并有放弃系统的控制权, 仍然占用CPU的时间片。只有当系统进行调度时, 切换到了server进程,再进行应答。这个问题,也同样存在于server 端到client 的应答过程之中。
3 比较两种消息通信机制中的数据传输的时间
由于两种机制实现的机理和用处都不一样, 难以直接进行时间上的比较。如果比较其性能,应更加全面的分析。
(1) 消息队列的建立比共享区的设立消耗的资源少. 前者只是一个软件上设定的问题, 后者需要对硬件操作, 实现内存的映像, 当然控制起来比前者复杂. 如果每次都重新进行队列或共享的建立, 共享区的设立没有什么优势。
(2) 当消息队列和共享区建立好后, 共享区的数据传输, 受到了系统硬件的支持, 不耗费多余的资源; 而消息传递, 由软件进行控制和实现, 需要消耗一定的CPU资源. 从这个意义上讲, 共享区更适合频繁和大量的数据传输
(3) 消息的传递, 自身就带有同步的控制. 当等到消息的时候, 进程进入睡眠状态, 不再消耗CPU资源. 而共享队列如果不借助其他机制进行同步, 接受数据的一方必须进行不断的查询, 白白浪费了大量的CPU资源. 可见消息方式的使用更加灵活
六.源程序:
1.消息的创建、发送和接收
#include<stdio.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include<unistd.h>
#include<sys/wait.h>

#define MSGKEY 75
struct msgform
{
long mtype;
char mtrex[1030];
}msg;
int msgqid,i;
void CLIENT()
{
int i;
msgqid=msgget(MSGKEY,0777);
for(i=10;i>=1;i–)
{
msg.mtype=i;
printf("(client)sent\n");
msgsnd(msgqid,&msg,1024,0);
}
}
void SERVER()
{
msgqid=msgget(MSGKEY,0777|IPC_CREAT);
do
{
msgrcv(msgqid,&msg,1030,0,0);
printf("(server)received\n");
}while(msg.mtype!=1); www.docin.com msgctl(msgqid,IPC_RMID,0);
}
void main()
{
while((i=fork())-1);
if(!i) SERVER();
while((i=fork())
-1);
if(!i) CLIENT();
wait(0);
wait(0);
}
2.共享存储区的创建、附接和断接
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/mhm.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/wait.h>
#define SHMKEY 75

int shmid,i;
int *addr;

void CLIENT()
{
int i;
shmid=shmget(SHMKEY,1024,0777);
addr=shmat(shmid,0,0);
for(i=10;i>=1;i–)
{
while(*addr!=-1);
printf("(client)sent\n");
*addr=i;
}
}
void SERVER()
{
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);
addr=shmat(shmid,0,0);
do
{
*addr=-1;
while(*addr==-1);
printf("(server)received\n");
}while(*addr);
shmctl(shmid,IPC_RMID,0);
}
void main()
{
while((i=fork())-1);
if(!i) SERVER();
while((i=fork())
-1);
if(!i) CLIENT();
wait(0);
wait(0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值