操作系统实验报告Linux进程创建与通信Word格式.docx
- 文档编号:19835818
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:21
- 大小:107.61KB
操作系统实验报告Linux进程创建与通信Word格式.docx
《操作系统实验报告Linux进程创建与通信Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告Linux进程创建与通信Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
Iamparent.\n"
);
sleep
(1);
}
else
Iamchild.\n"
}
运行结果:
Theparentprocess.
Thechildprocess.
2.父子进程同步
修改上题程序,使用exit()和wait()实现父子进程同步,其同步方式为父进程等待子进程的同步,即:
子进程循环输出5次,然后父进程再循环输出5次。
{
wait(0);
exit(0);
}
Iamparent.
Iamparent.
Iamchild.
Iamchild.
3.Linux管道通信
编写一个程序,实现以下功能。
(1)父进程使用系统调用pipe()创建一个无名管道;
(2)创建两个子进程,分别向管道发送一条信息后结束;
子进程1发送:
Child1issendingamessagetoparent!
子进程2发送:
Child2issendingamessagetoparent!
(3)父进程从管道中分别接收两个子进程发来的消息并显示在屏幕上,父进程结束。
两个子进程发送信息没有先后顺序要求。
源程序代码:
#include<
stdio.h>
unistd.h>
signal.h>
intp1,p2,fd[2];
charoutpipe[50];
charinpipe1[50]="
Child1issendingamessagetoparent!
"
;
charinpipe2[50]="
Child2issendingamessegetoparent!
pipe(fd);
while((p1=fork())==-1);
if(p1==0)
lockf(fd[1],1,0);
write(fd[1],inpipe1,50);
exit(0);
else
while((p2=fork())==-1);
if(p2==0)
write(fd[1],inpipe2,50);
wait(0);
read(fd[0],outpipe,50);
lockf(fd[1],0,0);
printf("
Parenthasreceivedfirstmessage:
\n"
%s\n"
outpipe);
Parenthasreceivedsecondmessage:
4.Linux消息缓冲通信
(1)父进程创建一个消息队列和一个子进程,由子进程发送消息,父进程等待子进程结束后接收子进程发来的消息,并显示消息内容。
以“end”作为结束消息。
父进程:
stdlib.h>
string.h>
sys/types.h>
sys/ipc.h>
sys/msg.h>
#defineMAX_TEXT512
structmy_msg
longintmy_msg_type;
charsome_text[MAX_TEXT];
}msg;
intp1,msgid,running=1;
charbuffer[BUFSIZ];
longintmsg_to_receive=0;
char*path="
./msgchld.exe"
char*argv[3]={"
msgchld.exe"
NULL};
msgid=msgget(1234,0666|IPC_CREAT);
if(p1==0)
execv(path,argv);
while(running)
msgrcv(msgid,&
msg,BUFSIZ,msg_to_receive,0);
Youwrote:
%s"
msg.some_text);
if(strncmp(msg.some_text,"
end"
3)==0)
running=0;
msgctl(msgid,IPC_RMID,0);
子进程:
intmsgid,running=1;
while(running)
puts("
Entersometext:
fgets(buffer,BUFSIZ,stdin);
msg.my_msg_type=1;
strcpy(msg.some_text,buffer);
msgsnd(msgid,&
msg,MAX_TEXT,0);
if(strncmp(msg.some_text,"
running=0;
子进程运行,显示:
“Entersometext:
”;
输入内容后,运行父进程,显示“Youwrote:
”和刚输入的内容。
(2)分别编写发送进程和接收进程,由发送进程发送消息,接收进程接收消息。
采用先执行发送进程后执行接收进程的方式同步。
发送方:
接收方:
printf("
msgctl(msgid,IPC_RMID,0);
与上个实验类似。
(3)模拟C/S通信,要求如下。
(选做)
①模拟客户端(client端)程序client,其功能如下。
a)显示下列服务功能菜单:
Enteryourchoice:
1.Savemoney
2.Takemoney
b)接收用户键入的功能号进行选择;
c)将用户键入的功能号作为一条信息发送至消息队列,然后结束。
②模拟服务器端(Server端)程序server,其功能如下。
a)从消息队列接收Client端发来的一条消息;
b)根据消息作如下处理。
若消息为“1”,则创建子进程1,由子进程1加载服务模块save,该模块的作用为显示以下信息:
Yourmoneywassaved!
若消息为“2”,则创建子进程2,由子进程2加载服务模块take,该模块的作用为显示以下信息:
Pleasetakeyourmoney!
c)等待子进程终止后,Server进程删除消息队列,然后结束。
【实验提示】
1.C编译器gcc的使用
GCC(GNUCompilerCollection)是目前Linux下最常用的C语言编译器,能够编译用C\C++等语言编写的程序。
通过GCC源码文件生成可执行文件的过程要经过4个阶段,分别是预处理、编译、汇编和链接。
格式:
gcc【选项】【目标文件】源文件
如不使用任何参数将生成一个名为a.out的文件,执行时输入./a.out(./表示在当前路径下)。
2.进程控制的系统调用
fork系统调用创建新的子进程
pid=intfork()
fork调用返回时,系统中已有两个用户级环境完全相同的进程存在,这两个进程从fork调用中得到的返回值不同,其中子进程得到的返回值为零,父进程得到的返回值是新创建子进程的进程标识号。
3.进程通信的系统调用
✓pipe系统调用
intpipe(filedes)
intfiledes[2];
✓消息机制
•Msgid=msgget(key,msgflg)
key_tkey;
intmsgflg;
•Msgctl(msgid,cmd,buf)
intmsgid,cmd;
msgqid_ds#buf;
•msgsnd(msgid,msgp,msgsz,msgflg)
intmsgid;
structmsgbuf*msgp;
intmsgsz,msgflg;
•msgrcv(msgid,msgp,msgsz,msgtyp,msgflg);
intmsgsz;
longmsgtyp;
注:
系统调用详细说明和使用示例可参考ppt资料。
【实验要求】
1.观察实验结果,分析结果产生原因。
2.实验结束一周后需提交实验报告和源程序文件。
【实验思考】
1.实验中如何实现的父子进程的同步?
答:
通过系统调用wait()和exit(),实现父子进程同步。
2.管道通信的读写进程之间必须满足什么关系?
写进程负责将数据从管道写入端写入管道,读进程负责将数据从读出端读出管道。
3.在使用消息缓冲通信进行通信时,发送和接收者之间的同步机制由谁提供?
操作系统根据用户进程提供的key值,在msgque中查找该key值的ipc_perm结构以及与该key值对应的消息队列头q_messages,该队列上挂的是一系列msg_msg数据结构,每个msg_msg数据结构指向一个消息缓冲区msgbuf,而该缓冲区msgbuf中存放的就是需要传递的消息正文。
操作系统通过对消息队列链表结构msgque中三个队列的管理来实现消息的发送、接收以及发送与接收进程之间的同步和互斥。
4.消息缓冲通信与管道通信有何不同?
当两个独立进程之间需传递大量信息时,应该使用哪一种通信方式?
无名管道简单方便,但工作在单向通信方式,且只能在创建它的进程及其子孙进程之间共享;
消息缓冲可以在任意进程之间通信,而且自带同步工具,使用方便,但是信息复制消耗CPU的时间,不适宜于信息量大或操作频繁的场合。
当两个独立进程之间需传递大量信息时,应该使用管道通信。
【参考资料】
【1】《操作系统教程与实验》,胡明庆等编著,清华大学出版社。
【2】《计算机操作系统教程--核心与设计原理》,范策等编著,清华大学出版社。
学习网站:
红帽中国门户网站:
Fedora门户网站:
http:
//fedoraproject.org;
中国Linux公社:
//www.linuxfans.org/cms/index.php;
Linux伊甸园:
//www.L;
Linux联盟:
//www.xxL
Linux红联:
//www.L
实验三银行家算法模拟
【开发语言及实现平台或实验环境】
C++/C#
MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003
(1)进一步理解利用银行家算法避免死锁的问题;
(2)在了解和掌握银行家算法的基础上,编制银行家算法通用程序,将调试结果显示在计算机屏幕上,再检测和笔算的一致性。
(3)理解和掌握安全序列、安全性算法
(1)了解和理解死锁;
(2)理解利用银行家算法避免死锁的原理;
(3)会使用某种编程语言。
【实验原理】
一、安全状态
指系统能按照某种顺序如<
P1,P2,…,Pn>
(称为<
序列为安全序列),为每个进程分配所需的资源,直至最大需求,使得每个进程都能顺利完成。
二、银行家算法
假设在进程并发执行时进程i提出请求j类资源k个后,表示为Requesti[j]=k。
系统按下述步骤进行安全检查:
(1)如果Requesti≤Needi则继续以下检查,否则显示需求申请超出最大需求值的错误。
(2)如果Requesti≤Available则继续以下检查,否则显示系统无足够资源,Pi阻塞等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]∶=Available[j]-Requesti[j];
Allocation[i,j]∶=Allocation[i,j]+Requesti[j];
Need[i,j]∶=Need[i,j]-Requesti[j];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;
否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
三、安全性算法
(1)设置两个向量:
①工作向量Work:
它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work∶=Available;
②Finish:
它表示系统是否有足够的资源分配给进程,使之运行完成。
开始时先做Finish[i]∶=false;
当有足够资源分配给进程时,再令Finish[i]∶=true。
(2)从进程集合中找到一个能满足下述条件的进程:
①Finish[i]=false;
②Need[i,j]≤Work[j];
若找到,执行步骤(3),否则,执行步骤(4)。
(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Ø
Work[j]∶=Work[i]+Allocation[i,j];
Finish[i]∶=true;
gotostep2;
(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;
否则,系统处于不安全状态。
【实验步骤】
参考实验步骤如下:
(1)参考图1-1所示流程图编写安全性算法。
(2)编写统一的输出格式。
每次提出申请之后输出申请成功与否的结果。
如果成功还需要输出变化前后的各种数据,并且输出安全序列。
(3)参考图1-2所示流程图编写银行家算法。
(4)编写主函数来循环调用银行家算法。
【思考题】
(1)在编程中遇到了哪些问题?
你是如何解决的?
答:
安全序列不唯一的问题
(2)在安全性算法中,为什么不用变量Available,而又定义一个临时变量work?
在安全性算法中,用一个临时变量是为了防止在该时刻不安全的情况下破坏数据的原值,如果不用临时变量work,而是直接用Available变量,那么如果该状态是不安全的,那么进行安全性算法的时候,会对Available进行修改的,破坏了原来的数值。
如果该状态是安全的话,直接用Available也没有问题,用work临时变量让程序更全面,更符合算法的要求。
【参考代码】
部分参考代码如下:
#include<
iostream.h>
#defineM3//资源的种类数
#defineN5//进程的个数
voidoutput(intiMax[N][M],intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);
//统一的输出格式
boolsafety(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);
boolbanker(intiAllocation[N][M],intiNeed[N][M],intiAvailable[M],charcName[N]);
voidmain()
inti,j;
//当前可用每类资源的资源数
intiAvailable[M]={3,3,2};
//系统中N个进程中的每一个进程对M类资源的最大需求
intiMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
//iNeed[N][M]每一个进程尚需的各类资源数
//iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数
intiNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
//进程名
charcName[N]={'
a'
'
b'
c'
d'
e'
};
boolbExitFlag=true;
//退出标记
charch;
//接收选择是否继续提出申请时传进来的值
boolbSafe;
//存放安全与否的标志
//计算iNeed[N][M]的值
fo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 Linux 进程 创建 通信