操作系统并发程序设计与进程通信实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<string.h>
#define MSGKEY 75
struct msgform {
long mtype;
char mtext[256];
}msg;
int msgqid;
main()
{
int i,pid,*pint;
extern cleanup();
for(i=0;i<20;i++)
实验二进程通信
1.目的
进程通信是多任务协作的基础,具有广泛的应用。熟悉Linux的基于消息队列的进程通信的系统调用,并实现一个简单的C/S结构的实例。
2.要求பைடு நூலகம்
Linux进程通信及C/S结构应用。
(1)熟悉教材中有关进程通信方式。
(2)熟悉Linux的使用(常用shell命令、VI、CC等)。
(3)熟悉Linux的消息结构定义,msgget()、msgrcv(msgqid,…)、msgsnd(msgqid,…)的系统使用,C/S结构的工作过程。
signal(i,cleanup);
msgqid = msgget(MSGKEY,0777|IPC_CREAT);
printf("server pid is ready ... \n");
//for(;;)
//{
msgrcv(msgqid,&msg,256,1,0);
printf("server has received \n");
{
if(msg.mtext[i]>msg.mtext[i+1])
{mid=msg.mtext[i];msg.mtext[i]=msg.mtext[i+1];
msg.mtext[i+1]=mid;}
}
}
cleanup()
{
msgctl(msgqid,IPC_RMID,0);
}
客户端:
#include<stdio.h>
top=top-1;
cout<<"free="<<free<<endl;
}
void release(int ad)
{
top=top+1;
stack[top]=ad;
}
main()
{
int i;
stack[0]=10;stack[1]=20;stack[2]=25;
stack[3]=30;stack[4]=40;
msg.mtype=2;
paixu();
msgsnd(msgqid,&msg,256,0);
//}
}
paixu()
{
int i,j,len;
char a[256],mid;
len=strlen(msg.mtext);
for(j=0;j<len-1;j++)
for(i=0;i<len-1-j;i++)
3.题目
堆栈内容为10 20 25 30 40,getspace为栈顶元素出栈,release(100)为100入栈。getspace()和release(100)各执行一次的结果(堆栈)
int stack[10];
4.代码
int top=4;
void getspace()
{
int free;
free=stack[top];
int msgqid,pid;
msgqid = msgget(MSGKEY,0777);
pid=getpid();
msg.mtype=1;
printf("write your message:\n");
fgets(msg.mtext,256,stdin);
msgsnd(msgqid,&msg,256,0);
2.要求
在BACI环境下,对程序并发执行的实验:(1)没有控制时正确的程序执行的结果不正确;(2)BACI中PV操作的并发控制的实现。
要求:
(1)熟悉教材中有关进程并发执行的内容。
(2)设计并实现:没有控制时正确的程序执行的结果不正确。
(3)BACI中PV操作的并发控制的实现。
(4)将课堂和习题中的同步、互斥的并发程序设计的习题的设计与实现。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MSGKEY 75
struct msgform {
long mtype;
char mtext[256];
};
main()
{
struct msgform msg;
(4)C/S结构的简单实例。
3.题目
client向server发送一个字符串,server将字符串按照从小到大排序后,返回给client。
4.代码
服务端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
cobegin{getspace();release(100);}
cout<<"top="<<top<<endl;
for(i=0;i<=top;i++)
cout<<"stack["<<i<<"]="<<stack[i]<<endl;
}
5.实验结果与分析
图1图2
图1为正确结果,图2是错误结果。图2中,因为先运行了release(100),即先往堆栈里面入栈100,然后getspace将100出栈。使得堆栈里面的元素没有发生改变。
msgrcv(msgqid,&msg,256,2,0);
printf("%s\n",msg.mtext);
}
5.结果
图1
图2
实验心得:
在做完操作系统这两个实验后,我懂得了如何在BACC环境下设计进程的并发执行,还学会了在linux终端中,通过使用消息队列进行进程间的通信。在实验过程中,很多东西都不懂,通过询问同学和上网查询资料,都一一解决了这些问题,最终顺利完成了实验。
《计算机操作系统》
实验报告
学号:姓名:
学院:专业:计算机
年级:班级:
实验时间:2011-2012学年第一学期
指导教师:
实验一并发程序设计
1.目的
在单处理器环境下,实现多任务的核心是并发程序设计,进程的并发执行提高了CPU的利用率,使得CPU与设备并行、设备与设备并行成为可能。但并发执行也存在许多单任务中所没有的问题,其中之一是互斥和同步的控制。
相关文档
最新文档