ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:145.77KB ,
资源ID:1124916      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/1124916.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统上实验报告3汇总.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统上实验报告3汇总.docx

1、操作系统上实验报告3汇总操作系统实验三报告 实验题目:进程管理及进程通信实验环境:虚拟机Linux操作系统实验目的:1.利用Linux提供的系统调用设计程序,加深对进程概念的理解。2.体会系统进程调度的方法和效果。3.了解进程之间的通信方式以及各种通信方式的使用。 实验内容:例程1:利用fork()创建子进程#include #include#include main()int i;if (fork()i=wait(0);/*父进程执行的程序段*/* 等待子进程结束*/printf(It is parent process.n);printf(The child process,ID numb

2、er %d, is finished.n,i);elseprintf(It is child process.n);sleep(10);/*子进程执行的程序段*/exit(1);/*向父进程发出结束信号*/运行结果:思考:子进程是如何产生的? 又是如何结束的?子进程被创建后它的运行环境是怎样建立的?答:子进程是通过函数fork()创建的,通过exit()函数自我结束的,子进程被创建后核心将为其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据,由子进程继承父进程的所有文件。例程2:循环调用fork()创建多个子进程#include #include#includema

3、in() int i,j;printf(“My pid is %d, my fathers pid is %dn”,getpid(),getppid();for(i=0; i3; i+)if(fork()=0)printf(“%d pid=%d ppid=%dn”, i,getpid(),getppid();else j=wait(0);Printf(“ %d:The chile %d is finished.n” ,getpid(),j);运行结果:思考:画出进程的家族树。子进程的运行环境是怎样建立的?反复运行此程序看会有什么情况?解释一下。答:子进程的运行环境是由将其创建的父进程而建立的,

4、反复运行程序会发现每个进程标识号在不断改变,这是因为同一时间有许多进程在被创建。例程3:创建子进程并用execlp()系统调用执行程序的实验#include#includemain()int child_pid1,child_pid2,child_pid3;int pid,status;setbuf(stdout,NULL);child_pid1=fork(); /*创建子进程1*/if(child_pid1=0) execlp(echo,echo,child process 1,(char *)0); /*子进程1 启动其它程序*/perror(exec1 error.n );exit(1)

5、;child_pid2=fork(); /*创建子进程2*/if(child_pid2=0) execlp(date,date,(char *)0); /*子进程2 启动其它程序*/perror(exec2 error.n );exit(2);child_pid3=fork(); /*创建子进程3*/if(child_pid3=0) execlp(ls,ls,(char *)0); /*子进程3 启动其它程序*/perror(exec3 error.n );exit(3);puts(Parent process is waiting for chile process return!);whi

6、le(pid=wait(&status)!=-1) /*等待子进程结束*/ if(child_pid1=pid) /*若子进程1 结束*/printf(child process 1 terminated with status %dn,(status8);elseif(child_pid2=pid) /*若子进程2 结束*/printf(child process 2 terminated with status %dn,(status8);else if(child_pid3=pid) /*若子进程3 结束*/printf(child process 3 terminated with s

7、tatus %dn ,(status8);puts(All child processes terminated.);puts(Parent process terminated.);exit(0);运行结果:思考:子进程运行其他程序后,进程运行环境怎样变化的?反复运行此程序看会有什么情况?解释一下。答:子进程运行其他程序后,这个进程就完全被新程序代替。由于并没有产生新进程所以进程标识号不改变,除此之外旧进程的其它信息,代码段,数据段,栈段等均被新程序的信息所代替。新程序从自己的main()函数开始运行。反复运行此程序发现结束的先后次序是不可预知的,每次运行结果都不一样。原因是当每个子进程运行

8、其他程序时,他们的结束随着其他程序的结束而结束,所以结束的先后次序在改变。例程4:观察父、子进程对变量处理的影响#include#include#includeint globa=4;int main()pid_t pid;int vari=5;printf(before fork.n);if (pid=fork()0)printf(fork error.n);exit(0);elseif(pid=0)/*子进程执行*/globa+;vari-;printf(Child %d changed the vari and globa.n,getpid();else/*父进程执行*/wait(0);

9、printf(Parent %d did not changed the vari and globa.n,getpid();printf(pid=%d, globa=%d, vari=%dn,getpid(),globa,vari);/*都执行*/exit(0);运行结果:思考:子进程被创建后,对父进程的运行环境有影响吗?解释一下。答:子进程被创建后,对父进程的运行环境无影响,因为当子进程在运行时,它有自己的代码段和数据段,这些都可以作修改,但是父进程的代码段和数据段是不会随着子进程数据段和代码段的改变而改变的。例程5:管道通信的实验#include#includemain()int i,r

10、,j,k,l,p1,p2,fd2;char buf50,s50;pipe(fd);while(p1=fork()=-1);if(p1=0)lockf(fd1,1,0);/*子进程1 执行*/*管道写入端加锁*/sprintf(buf,Child process P1 is sending messages! n);printf(Child process P1! n);write(fd1,buf,50);lockf(fd1,0,0);/*信息写入管道*/*管道写入端解锁*/sleep(5);j=getpid();k=getppid();printf(P1 %d is weakup. My pa

11、rent process ID is %d.n,j,k);exit(0);else while(p2=fork()=-1);if(p2=0)lockf(fd1,1,0);/*创建子进程2*/*子进程2 执行*/*管道写入端加锁*/sprintf(buf,Child process P2 is sending messages! n);printf(Child process P2! n);write(fd1,buf,50);lockf(fd1,0,0);/*信息写入管道*/*管道写入端解锁*/sleep(5);j=getpid();k=getppid();printf(P2 %d is wea

12、kup. My parent process ID is %d.n,j,k);exit(0);else l=getpid();wait(0);if(r=read(fd0,s,50)=-1)printf(Cant read pipe. n);elseprintf(Parent %d: %s n,l,s);wait(0);if(r=read(fd0,s,50)=-1)printf(Cant read pipe. n);elseprintf(Parent %d: %s n,l,s);exit(0);运行结果:思考:(1)什么是管道?进程如何利用它进行通信的?解释一下实现方法。 (2)修改睡眠时机、睡

13、眠长度,看看会有什么变化。解释。 (3)加锁、解锁起什么作用?不用它行吗?答:(1)管道是指能够连接一个写进程和一个读进程、并允许他们以生产者消费者方式进行通信的一个共享文件,又称pipe文件。由写进程从管道的入端将数据写入管道,而读进程则从管道的出端读出数据来进行通信。 (2)修改睡眠时机和睡眠长度都会引起进程被唤醒的时间不一,因为睡眠时机决定进程在何时睡眠,睡眠长度决定进程何时被唤醒。 (3)加锁、解锁是为了解决临界资源的共享问题。不用它将会引起无法有效的管理数据,即数据会被修改导致读错了数据。例程7:软中断信号实验#include#includemain()int i,j,k;int func();signal(18,func();if(i=fork()j=kill(i,18);/*创建子进程*/*父进程执行*/*向子进程发送信号*/printf(Parent: signal 18 has been sent to child %d,returned %d.n,i,j);k=wait();/*父进程被唤醒*/printf(After wait %d,Parent %d: finished.n,k,getpid();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1