操作系统原理实验报告 2010-2011学年 第2学期
四、程序说明和程序流程图
1. 消息队列
“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。 消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。 2. 共享内存
共享内存指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存 (shared memory)是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。
第 10 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
五、程序代码
1.
#include
{ struct msgform msg;
int msgqid,pid,*pint; /* 文件主 同组用户 其他用户 rwxrwxrwx */ msgqid=msgget(MSGKEY,0777); /* rw-rw-rw- */ pid=getpid();
pint=(int*)msg.mtext; *pint=pid; msg.mtype=1;
msgsnd(msgqid,&msg,sizeof(int),0); msgrcv(msgqid,&msg,256,pid,0);
printf(\
第 11 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
}
#include
char mtext[256];}msg; int msgqid; main()
{ int i,pid,*pint; extern cleanup(); for (i=0;i<20;i++) signal(i,cleanup);
msgqid=msgget(MSGKEY, 0777|IPC_CREAT); for (;;)
{ msgrcv(msgqid,&msg,256,1,0); pint=(int*)msg.mtext; pid=*pint;
printf(\pid %d\\n\ msg.mtype=pid;
第 12 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
*pint=getpid(); msgsnd(msgqid,&msg, sizeof(int),0);} } cleanup()
{ msgctl(msgqid,IPC_RMID,0); exit();}
2. #include
#include
{ int i, *pint; char *addr;
extern clearup(); for (i=1; i<20; i++)
signal(i, clearup);
shmid=shmget(SHMKEY, 16*K, 0777|IPC_CREAT); addr=shmat(shmid, 0, 0); printf(\ pint=(int*)addr;
for (i=0; i<256; i++) *pint++=i; pint=(int*)addr; *pint=256; pause();} clearup()
{ shmctl(shmid, IPC_RMID, 0); exit(0); }
#include
第 13 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
#define SHMKEY 75 #define K 1024 int shmid; main()
{ int i, *pint; char *addr;
shmid=shmget(SHMKEY, 8*K, 0777); addr=shmat(shmid, 0, 0); pint=(int*)addr; while (*pint==0); for (i=0; i<256; i++)
printf(“%d\\n“, *pint++);}
第 14 页 共 16 页
操作系统原理实验报告 2010-2011学年 第2学期
六、程序运行结果及分析
1.
2.
实验2的时候,可能会出现段错误。可以尝试重启计算机来重新运行程序。
第 15 页 共 16 页