好文档 - 专业文书写作范文服务资料分享网站

北邮操作系统进程管理实验报告及源代码

天下 分享 时间: 加入收藏 我要投稿 点赞

进程管理实验报告 1.实验目的:

(1)加深对进程概念的理解,明确进程和程序的区别; (2)进一步认识并发执行的实质;

(3)分析进程争用资源的现象,学习解决进程互斥的方法; (4)了解Linux系统中进程通信的基本原理。 2.实验预备内容

(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解; (2)阅读Linux的fork()源码文件,分析进程的创建过程。 3、环境说明

本次实验使用的是win7下的VMWare workstation虚拟机,安装了ubuntu系统 在ubuntu系统下使用code::blocks IDE编写代码并执行程序的 4、实验内容: 1、进程的创建:

(1)实验题目和要求:

编写一段程序,使用系统调用fork() 创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。 (2)程序设计说明:

参照书上的例子进行设计,详见源代码 (3)程序运行结果截图: (4)程序分析:

a,b,c随机出现,因为父进程与两个子进程之间并没有同步措施,所以a,b,c随机打印出来,也就是三个进程的活动次序是随机进行的,不同的系统可能有不同的进程调度方式。 (5)源程序: #include #include #include int main() {

pid_t pid1,pid2; if((pid1=fork())

printf(\exit(-1); }

else if((pid1=fork())==0) printf(\else{

if((pid2=fork())

printf(\exit(-1); }

else if((pid2=fork())==0) printf(\

else{

wait(NULL); printf(\exit(0); } }

return 0; }

2、进程的控制: 要求一:

(1)实验题目和要求:

修改已经编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。 (2)程序设计说明:

将第一个程序的输出进行修改,把输出一个字符改为一句话,其他不变 (3)程序运行结果截图: (4)程序分析:

和第一个程序的输出顺序,也就是三个进程活动的次序基本是一致的,同一个进程里输出的字符串不会被中断 (5)源程序: #include #include #include int main() {

pid_t pid1,pid2; if((pid1=fork())

printf(\exit(-1); }

else if((pid1=fork())==0)

printf(\else{

if((pid2=fork())

printf(\exit(-1); }

else if((pid2=fork())==0)

printf(\else{

wait(NULL);

printf(\exit(0); }

}

return 0; }

要求二:

(1)实验题目和要求:

如果在程序中使用系统调用lockf () 来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。 (2)程序设计说明:

在每个进程的每个条件语句中开头加入lockf(1,1,0),结尾处加入lockf(1,0,0),从而实现给每一个进程加锁并且实现进程之间的互斥 (3)程序运行结果截图:

(4)程序分析:根据输出情况可以看出,每个进程活动的次序都是随机的,但是加锁后进程执行完毕后才会让另一个进程执行而不会中途被打断,因此

lockf(1,1,0)的作用是锁定屏幕输出,不让其他进程可以输出到屏幕,lockf(1,0,0)则是解锁 (5)源程序: #include #include #include int main() {

pid_t pid1,pid2; inti;

if((pid1=fork())

printf(\exit(-1); }

else if((pid1=fork())==0){ lockf(1,1,0); for(i=0;i<=2;i++)

printf(\lockf(1,0,0); } else{

if((pid2=fork())

printf(\exit(-1); }

else if((pid2=fork())==0){ lockf(1,1,0); for(i=0;i<=2;i++)

printf(\lockf(1,0,0); } else{

lockf(1,1,0); for(i=0;i<=2;i++)

printf(\lockf(1,0,0); exit(0); } }

return 0; }

3、进程的软中断通信: (1)实验题目和要求:

编写一段程序,使其实现进程的软中断通信。

(a)要求:使用系统调用fork() 创建两个子进程,再用系统调用signal() 让父 进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill() 向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process 1 is killed by Parent! Child Process 2 is killed by Parent!

父进程等待两个子进程终止后,输出如下的信息后终止: Parent Process is killed! 源程序: #include #include #include #include #include int live;

void live_wait() {

while(live == 1); }

void be_killed() {

live = 0; }

int main() pid_t p1,p2;

while((p1=fork()) == -1); if(p1 == 0) {

live = 1;

signal(1,be_killed);

live_wait(); printf(\}

if(p2 == 0) { live = 1; else { while((p2=fork()) == -1);

signal(2,be_killed);

signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); live_wait(); printf(\Parent!\\n\live = 1;

live_wait(); kill(p1,1); kill(p2,2); wait(NULL); wait(NULL); printf(\Process is killed!\\n\}

return 0; }

(b)在上面的程序中增加语句signal(SIGINT, SIG-IGN) 和 signal(SIGQUIT, SIG-IGN),观察执行结果,并分析原因。 (2)程序设计说明:

signal(SIGTINT, SIG_IGN)从后台进程读中断信号,signal(SIGQUIT, SIG_IGN)程序终止信号 (3)程序运行结果截图: (4)程序分析:

用系统调用signal() 让父进程捕捉键盘上来的中断信号ctrl+c

(a)没有添加signal(SIGINT,SIG_IGN)时可以看出程序运行在子进程1中,当按下ctrl+c后子进程1被直接杀死,而不是由父进程的kill杀死, 没有打印

语句Child Process 1 is killed by Parent!。但是子进程2是被父进程杀死故打印语句:Child Process 2 is killed by Parent!。

(b)在两个子进程中添加了signal(SIGINT,SIG_IGN),这样使得两个子进程不被ctrl+c杀死而由父进程杀死。所以从实验截图中可以看出,两个子进程均被父进程杀死故打印语句Child Process 1 is killed by Parent!和Child Process 2 is killed by Parent! (5)源程序: #include #include

intwait_mark; void waiting() {

while(wait_mark==1); }

void stop() {

wait_mark=0; }

int main() {

int p1,p2;

while((p1=fork())==-1); if(p1==0) {

wait_mark=1;

signal(SIGINT,SIG_IGN);

北邮操作系统进程管理实验报告及源代码

进程管理实验报告1.实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。2.实验预备内容(1)阅读Linux的sched.h源码文件,加深对进程管理概念的理解;(2)阅读Linux的fork()源
推荐度:
点击下载文档文档为doc格式
0f3xo1qf4a7b8vc53zip
领取福利

微信扫码领取福利

微信扫码分享