资源描述:
《北邮操作系统进程管理实验报告及源代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、进程管理实验报告1.实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。2.实验预备内容(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解;(2)阅读Linux的fork()源码文件,分析进程的创建过程。3、环境说明本次实验使用的是win7下的VMWareworkstation虚拟机,安装了ubuntu系统在ubuntu系统下使用code::blocks
2、IDE编写代码并执行程序的4、实验内容:1、进程的创建:(1)实验题目和要求:编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。(2)程序设计说明:参照书上的例子进行设计,详见源代码(3)程序运行结果截图:(4)程序分析:a,b,c随机出现,因为父进程与两个子进程之间并没有同步措施,所以a,b,c随机打印出来,也就是三个进程的
3、活动次序是随机进行的,不同的系统可能有不同的进程调度方式。(5)源程序:#include#include#includeintmain(){pid_tpid1,pid2;if((pid1=fork())<0){printf("ForkFailed.");exit(-1);}elseif((pid1=fork())==0)printf("b");else{if((pid2=fork())<0){printf("ForkFailed.");
4、exit(-1);}elseif((pid2=fork())==0)printf("c");else{wait(NULL);printf("a");exit(0);}}return0;}2、进程的控制:要求一:(1)实验题目和要求:修改已经编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。(2)程序设计说明:将第一个程序的输出进行修改,把输出一个字符改为一句话,其他不变(3)程序运行结果截图:(4)程序分析:和第一个程序的输出顺序,也就是三个进程活动
5、的次序基本是一致的,同一个进程里输出的字符串不会被中断(5)源程序:#include#include#includeintmain(){pid_tpid1,pid2;if((pid1=fork())<0){printf("ForkFailed.");exit(-1);}elseif((pid1=fork())==0)printf("Childprocess1iscreated!");else{if((pid2=fork())<0){prin
6、tf("ForkFailed.");exit(-1);}elseif((pid2=fork())==0)printf("Childprocess2iscreated!");else{wait(NULL);printf("Theparentprocessiscreated!");exit(0);}}return0;}要求二:(1)实验题目和要求:如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。(2)程序设计说明:在每个进程的每个条件语句中开头加入
7、lockf(1,1,0),结尾处加入lockf(1,0,0),从而实现给每一个进程加锁并且实现进程之间的互斥(3)程序运行结果截图:(4)程序分析:根据输出情况可以看出,每个进程活动的次序都是随机的,但是加锁后进程执行完毕后才会让另一个进程执行而不会中途被打断,因此lockf(1,1,0)的作用是锁定屏幕输出,不让其他进程可以输出到屏幕,lockf(1,0,0)则是解锁(5)源程序:#include#include#includeintmain()
8、{pid_tpid1,pid2;inti;if((pid1=fork())<0){printf("ForkFailed.");exit(-1);}elseif((pid1=fork())==0){lockf(1,1,0);for(i=0;i<=2;i++)printf("processA:%d",i);lockf(1,0,0);}else{if((pid2=fork())<0)