操作系统实验2进程管理报告

上传人:m**** 文档编号:160758679 上传时间:2022-10-11 格式:DOCX 页数:14 大小:45.88KB
收藏 版权申诉 举报 下载
操作系统实验2进程管理报告_第1页
第1页 / 共14页
操作系统实验2进程管理报告_第2页
第2页 / 共14页
操作系统实验2进程管理报告_第3页
第3页 / 共14页
资源描述:

《操作系统实验2进程管理报告》由会员分享,可在线阅读,更多相关《操作系统实验2进程管理报告(14页珍藏版)》请在装配图网上搜索。

1、实验一 进程管理一、实验目的:1.加深对进程概念的理解,明确进程和程序的区别;2.进一步认识并发执行的实质;3.分析进程争用资源的现象,学习解决进程互斥的方法;4.了解Linux系统中进程通信的基本原理;二、实验预备内容:1.阅读 Linux 的 sched.h 源码文件,加深对进程管理概念的理解;2.阅读Linux的fork()源码文件,分析进程的创建过程;三、实验环境说明:1.此实验采用的是 Win7(32bit)下虚拟机 VMware-workstation-10.0.4 build-2249910 ;2.ubuntu 版本 3.19.0;3.直接编写 c 文件在终端用命令行执行;4.虚

2、拟机分配8G内存中的1024M;5.虚拟机名称 knLinux;6.ubuntu用户名kn;四、实验内容:1.进程的创建:a) 题目要求:编写一段程序,使用系统调用 fork() 创建两个子进程。当此程序运行 时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显 示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。 试观察记录屏幕上的显示结果,并分析原因。b) 程序设计说明:一个父进程,两个子进程,分别输出显示a,b,c。c) 源代码:4 projl.cx1# Lnclud unistdhA2include 3include 4# Lnclui sys/wa it.

3、hA5# Include otdlibhA5# Lnclui 78int main ()910pid_t pidlr pid2;1112while (pidl = fork() = -1);13if (pidl = 0)1415putchar(b);16exit(0);17丨i 18else1920while (pid2 = fork() = -1):21if (pid2 = 0)2223putchar(c1);24exit(0);25 26else27j F |28putcharfa);29exit(0);303132return 0;33d) 运行结果:rootubuntu:/home/k

4、n# gcc Downtoads/projl*c -o pl rootubuntu:/hone/knff */plarootub-untu:/h-cme/kn# bcjplar ootubuntu arootubuntu arootubuntu arootgubuntu arootubuntu arootubuntu arootgubuntu arootgubuntu ar ootubuntu arootubuntu/hone/kn# /h&me/kn# /honie/k n# /hone/knff /hone/kn# /hone/kn# /home/knU /hone/knff /hone/

5、kn# /hone/knl?arootubuntu:/hone/kn# cb./p-l arootub-untu:fhOHe/knff cb./pl dbrootubuntu:/hone/knfl c./plcb./pi cb./pl be./pl zb”/pl cb./pl cb./pl cb./pl cbjpl cb./pl cb./plbe Jpl cb Jpl cb Jpl cb,/pl be Jpl cb /pl cb|be Jpl cb./pl cb./pl cb Jpl cb Jplabrootubuntu:/hone/kn# c./pl abrootubuntu皂/上口丼 c.

6、/pl bearootubuntu:JhoEE/kntf ,/pl arootgubuntu:/hone/knS cb./pl arootubuntu:/home/knS be./plaebrootubuntu:/hoE亡/knl? ,/pl arootubuntu:/hone/kn# ar ootgubuntu:/hone/kn# arootubuntu:/hone/kn# a rootub u ntu: /h-one/kntf arootubuntu:/hDne/kn1? arootubuntu:/home/kn# a rootub-u ntu: /h one/knffabcrootubu

7、ntu:JhoEE/kntf ,/pl arootgubuntu:/hone/knS arootgubuntu:/home/knS arootubuntu:/home/kn# arootubuntu:/home/knS arootgubuntu:/home/kn#e) 分析:由输出结果可知,运行结果不唯一,可以是 abc,acb,bca 等多种情况。 因为在程序中,并没有三个进程之间的同步措施,所以父进程和子进程的 输出顺序是随机的。在试验次数足够大的情况下,6 中顺序都有可能出现: abc, acb, bac, bca, cab, cba。2. 进程的控制:a) 修改已经编写的程序,将每个进

8、程输出一个字符改为每个进程输出一句话, 再观察程序执行时屏幕上出现的现象,并分析原因。i. 程序设计说明:将第一个程序中输出字符的语句改为输出 parent process 和 child process1&2 的语句。ii. 源代码:123456789101 1坨13141516171819202 12223242526272829303 1323334prQj2Lxtfincludc unistd.ho#Lnclusys/types# i. ck I# Lnc luc # Include cstdlib.ho#im Int mainC)pid_t pidl, pid2;while (pid

9、l = fork) = -1);ii (pidl = 0) puts(Child Progress l!n); exlt(0);elseKpid2=fork) = -1);i-(pid2 = 0) puts(Child Progress 2!n); exit(0);sleep(4);puts (Pa rent Progress !n*); exit(0); return 0;iii. 运行结果:rootgubuntu:/hone/knff gcc Downloads/proj21*c -o p21 rootubuntu:/home/kn#Child Progress 11Child Progr

10、ess 21Parent Progressrootgubuntu:/h&ne/kn# |rootgubuntu:/hone/kn# */p21 Child Progress 2!Child Progress 1!Parent Progress 1root|gutuntur/hone/kn# |iv. 分析: 发现在结果中,运行结果同第一个程序,但是在一个进程输出语句 的中途不会被打断,语句都是完整的。但是三条语句的先后顺序随机, 不能够确定。b)如果在程序中使用系统调用lockf ()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。i. 程序设计说明:在程序中加入lockf(

11、l,l,0)和lockf(l,0,0)语句用于加锁和去锁,实现 进程之间的互斥。在程序中加入sleep()函数让父进程休息,多循环进 行子进程的输出,可观察到加锁前后的差距。ii. 源代码:prqj22xI! aint ma in()910pid_t pidl, pid2;11int i;1213while (pidl = fork() = 7;14if (pidl = 0)1516lockf(l( lf 0);/lock17(1 = 0; i 4; 1 +)1819sleep(i);20puts(Child Progress l!n);2122lockf(l 0r 3);/unlock23e

12、xlt(0);2425else2627while (pid2 = fork() = -1J;28(pid2 = 0)2930lockf(1, 1 0);/lock31(i = 0; i p22 rootubuntu:/home/kn# ”/p22Parent Progress!Child Progress 21Chtld Progress 21Child Progress 21Chtld Progress 21Child Progress 11Chtld Progress 11Chtld Progress 1!Chtld Progress 1!Parent Progress!rootfflub

13、untu:/home/kn# I若去掉lockf(),结果如下:rootgubuntui/home/kn# gcc Downloads/pro22 *c -o p22 rootubuntu:/home/kn# ./p22Parent ProgressChild Progress 2!Child Progress 1!Child Progress 21Child Progress 1!Child Progress 2!Child Progress 1!Child Progress 1!Child Progress 21Parent Progressrootgubuntu:/home/kn# |i

14、v. 分析:通过上网查阅资料,了解到lockf(fileno(fp),F_LOCK,OL)函数中, fileno(fp)是要加锁的文件,其中1则为标准输出流;F_LOCK为1则 加锁,0则解锁;0L为文件长度,0则为整个文件。由输出结果观察 到,加锁的函数使得程序结果发生了变化。在加锁后,根据结果显示, 一个进程全部输出完毕后才交给另一个进程,表现为连续的1 和连续 的 2 ;而没有加锁的话,每一个进程输出完毕一次就随机选择一个进 程进行输入,直到全部输出完毕,导致每一次输出的进程都是随机的。 从而看出lockf()对两个进程的输出表现出互斥作用。进程互斥是指两个或两个以上的进程,不能同时进入

15、关于同一组共 享变量的临界区域,否则可能发生与时间有关的错误。而lockf()函数 作为监视锁,对锁定的进程控制访问。而在多次输出后,三个进程有 可能同时进入同一组共享变量的临界区域,所以结果发生改变。3. 进程的软中断:a) 编写一段程序,使其实现进程的软中断通信;i. 题目要求:使用系统调用 fork() 创建两个子进程,再用系统调用 signal() 让父 进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后, 父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号 后分别输出下列信息后终止:Child Process 1 is killed by Parent!

16、Child Process 2 is killed by Parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent Process is killedii. 程序设计说明:利用Del触发软中断SIGINT。要求在中断来临前,两个子进程都 处于等待状态,中断来临后立即响应。因此加入了my_wait ()和my_stop()两个函数,并通过flag来实现子进程对中断信号的屏蔽。 父进程在杀死子进程后自杀,则引入 SIGUSR1 和 SIGUSR2 两个信 号,分别让两个子进程监听这个信号,父进程收到中断信号后通过这 两个信号对子进程发出kill信号,再自杀。在程序的实现过程

17、中,我 们需要父进程等待子进程终止后再自杀,则需要子进程引入 signal 预置软中断处理函数,等待父进程向他发出软中断信号,而不是直接 从键盘上自行接受,再自行终止。而父进程使用 kill 向子进程发送软 中断信号,并且wait直到子进程处理中断,使用exit(O)终止执行并 且向父进程返回终止信息。父进程一旦收到子进程发送来的终止信息 则结束等待,终止自己的进程。iii. 源代码:123456789101112131415161718192021222324252627282930313233343536proj3.c# nclud # nclude # nelude # nclude #

18、 nclude # nclude # nclude int flag; pid_t pidl, pid2;void my_wait(int q) (flag); void my_stop(int q) flag = 0;int main() signal(SIGINTf my_stop):while (pidl = forkO) = -1); if (pidl = 0)flag = 1;/pl set waitingsignal(SIGUSRlr my_stop);/set SIGUSR1 to stop my_wait(0);/waitinglockf(lt 1, 0);/lockputs(

19、HnChild Process 1 is killed by Parent!); lockf(lf 0, 0);/unlocksleep(l);exit(0);37else3S39while (pldZ = fork) = -1);40(pid2 = 0)41+2flag = 1;p2 set waiting43signal(SIGUSR2, my_stop);/set SIGUSR2 to stop44my_wait(0);45lockf(1, lr 8);/lock46puts(nChild Process 2 is killed by Parent!);47lockf(1, r 0);/

20、unlock48sleep(i);49exlt(0);5051else52)=-1);/ycrearte child progress 119if (pidl = 0)2&21lockf(river1t 1,0); /lock22sprirrtf(wbt Child1 is sending a messagelXn);23write(river1r wbrRW_MAX);24lockf(river1, 0,0); /unlock25exlt(0);2627else2829while (pid2=fork(J= -1J;/create child progress 230if (pid2 = 0

21、)3132sleep(l);/wait pl33lockf(river r1, 0);/lock34sprintf(wb, Child 2 is sending a message!n);35write(river1twb” RW,MAX);36lockf(river rC, 0)iZ/inlock37exltO);3839else4041waitNULL;/wait pl42read(river0rrb# RW MAX);43printf(,(%snrrb);44wait(NULL;/wait p245read(river0rrb, RW MAX);46printf(,(%snrrb);47

22、exit(0);484950戸叩return 0;1亦4 TC广rdbnmn乓忘d) 运行结果:rootubuntu:/home/kn# g匚匚 Downlodds/proj4.c -o p4 rootgubuntu:/home/kn# Jp4Child 1 ts sending a message!Child 2 is sending a message 1rootubuntu:/home/kn# |e) 分析: 若是多次进行管道写入,并想保证一个进程完整运行,则必须加锁; 若单次,不一定需要lockf(),因为一个标准输出流一定会完整的写完不被 中断,然后再进行其他操作。在管道通信中,系统

23、调用pipe()函数初始化 一个二元组作为管道, 1 为出, 0 为进,以此来保证管道通信不发生冲突。五、 思考:1. 系统是怎样创建流程的?操作系统在创建流程时,首先申请空白的PCB (进程控制块),再为新进 程分派资源,然后初始化PCB,最终将新进程插入就绪队列中。而在我们编 程的过程中,系统通过调用fork()函数来创建进程。而当一个进程中调用了 fork()函数时,则系统会为这个进程创建一个子进程。这个子进程和父进程不 同的地方只有他的进程ID,其他部分都一样。也就是说新进程通过克隆老进 程或是当前进程来创建。其中系统调用fork()或 clone()函数可以创建新任务, 复制发生在核

24、心状态下地核心中。复制完成后, Linux 允许两个进程共享资源 而不是复制各自的拷贝(包括文件、信号处理过程和虚拟内存)。而在创建后,先执行父进程还是子进程则取决于内核的调度算法。子进程 被创建后,父子进程相互竞争系统的资源,并行执行。若想子进程先继续执行, 则需要父进程阻塞至子进程完成任务,即用wait()系统调用来完成。2. 可执行文件加载时进行了哪些处理?在编译执行源代码的过程中,由程序,到编译预处理,到编译,到优化程 序,到汇编程序,到链接程序,最后到可执行文件。在加载可执行文件时首先 操作系统应该判断该文件是否为一个合法的执行文件,若是则按照段表中的指 示为可执行文件分配地址空间。

25、在加载文件的过程中,主要是需要加载程序段 和数据段到内存,并且进行外部定义符号的重定位。任何一个可执行文件,启 动时都需要调用Ntdll.dll中的NtCreateProcess()函数。3. 当首次调用新创建进程时,其入口在哪里?在进程队列 ready 的状态下,由离自己最近的父进程执行 调度,即入口在最近的父进程处,是fork()之后的语句。4. 进程通信有什么特点?linux下进程间通信的几种主要方式:管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通 信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外, 它还允许无亲缘关系进程间的通信

26、;信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件 发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持 Unix早期信号语义函数sigal 外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对 外接口,用sigaction函数重新实现了 signal函数);报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消 息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读 权限的进程则可以读走队列中的消息。消息队列克

27、服了信号承载信息量少,管道 只能承载无格式字节流以及缓冲区大小受限等缺点。共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。 是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结 合使用,来达到进程间的同步及互斥。信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程 间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其 它类Unix系统上:Linux和System V的变种都支持套接字总的来说,进程间的通信根据通信内容可以划分为控制

28、信息的传送(低级通信) 和大批数据的传送(高级通信)。在消息队列中信息的复制需要额外消耗CPU时 间,不适宜于信息量大或操作频繁的场合;共享内存针对消息缓冲的缺点改而利 用内存缓冲区直接交换信息,无需复制,快捷、信息量大就是又是。但是不同的 进程通信方式有不同的优缺点,因此对于不同应用问题,需要根据问题本身情况 来选择进程间的通信方式。六、 总结:本次实验中我遇到了很多大大小小的问题,首先就是linux虚拟机安装的问题。 先是下载了 virtualbox 软件但却因为版本问题一直不能安装 linux 系统成功。于是 转而用VMware软件。安装上后,仍须安装gcc、g+等编译工具,于是上网搜索

29、 命令行安装的方法。利用 apt-get update、apt-get upgrade、apt-get install gcc 语句安 装成功,但g+编译器一直提示:rhe following packages have unmet dependencies:g+ : Depends; g+-4,84,Sh2-5-) but It Is not Zng to be installedE: Unable to correct problens you have held broken packages.这次的实验通过进程创建、进程互斥、进程软中断、管道进程四个小程序让我 们对进程管理这一章有了更深的理解。在听课时,由于没有将书本跟实际动手操作 联系在一起,对知识的印象不是很深,但这次为了编程,将书本上的内容完完整整 过了好几遍,对进程中fork()、kill()、signal。、lockf()、pipe()等函数有了更深的了 解。因为管道进程在书上并没有怎么涉及,知识在ppt上有补充,因此通过上网查 阅了许多资料才了解如何进行操作。总体来说,这一次的实验,我们真正通过程序,了解到了进程管理、进程间通 信的过程,加深了印象,也学习到了很多书本上没有的知识,还学会了 linux环境 下的编程、调试,受益匪浅。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!