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

操作系统进程管理课程设计

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

内蒙古工业大学信息工程学院

实 验 报 告

课程名称: 操作系统 实验名称: 进程管理 实验类型: 验证性□ 综合性□ 设计性□ 实验室名称: 班级: 学号:

姓名: 组别:

同组人: 成绩: 实验日期: 2011年12月

实验一 进程管理

一、实验目的

1.学会在Linux中利用系统调用fork()创建进程。 2.加深对进程概念的理解,明确进程和程序的区别。 3.进一步认识在系统内进程并发执行的实质。

4.分析进程竞争资源的现象,学习解决进程互斥的方法。 5.掌握Linux中进程通信的基本原理。

二、实验类型

验证性实验。

三、实验预备知识

1.阅读Linux的sched.h源码文件,加深对进程管理概念的理解。 2.阅读Linux的fork.c源码文件,分析进程的创建过程。

四、实验内容

1.进程的创建 【任务】

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

【程序】 #include main() {

int p1,p2;

while((p1=fork())= =-1); /*创建子进程p1,失败时循环*/ if(p1= =0) /*子进程p1创建成功*/ putchar(?b?);

else /*父进程返回*/ {

- 1 -

while((p2=fork())= =-1); /*创建另一个子进程p2,失败时循环*/ if(p2= =0) /*子进程p2创建成功*/ putchar(?c?); else

putchar(?a?); /*父进程执行*/ } }

【执行结果】

2.进程的控制 【任务】

修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

【程序1】 #include main() {

- 2 -

int p1,p2,i;

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

for(i=0;i<50;i++) printf(“child %d\\n”,i); else

{

while((p2=fork())= =-1) if(p2= =0)

for(i=0;i<50;i++) printf(“son %d\\n”,i); else

for(i=0;i<50;i++)

printf(“daughter %d\\n”,i); } }

【执行结果】

- 3 -

【程序2】 #include #include main() {

int p1,p2,i;

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

lockf(1,1,0); /*加锁*/ for(i=0;i<50;i++) printf(“child %d\\n”,i); lockf(1,0,0); /*解锁*/ } else

{

while((p2=fork())= =-1) if(p2= =0) {

lockf(1,1,0); for(i=0;i<50;i++) printf(“son %d\\n”,i); lockf(1,0,0); } else {

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

printf(“daughter %d\\n”,i); lockf(1,0,0); }

- 4 -

} }

【执行结果】

3.软中断通信 【任务1】

编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止: child process 1 is killed by parent! child process 2 is killed by parent!

父进程等待两个子进程终止后,输出以下信息后终止: parent process is killed! 【程序】

#include #include #include #include

- 5 -

void waiting(),stop(); int wait_mark; main() {

int p1,p2;

while((p1=fork())= =-1); /*创建进程p1*/ if(p1>0) {

while((p2=fork())= =-1); /*创建进程p2*/ if(p2>0)

{

Printf(“parent run!\\n”); Printf(“p1=%d\\n”,p1); Printf(“p2=%d\\n”,p2); wait_mark=1;

getchar();

kill(p1,16); /*向p1发软中断信号16*/ kill(p1,17); /*向p2发软中断信号17*/ sleep(5); /*父进程睡眠5秒*/ wait(0); /*等待子进程结束,同步*/ wait(0); /*等待另一子进程结束,同步*/ lockf(stdout,1,0); /*标准输出加锁*/ printf(“parent process is killed!\\n”);

lockf(stdout,0,0); /*标准输出解锁*/ exit(0); /*父进程终止*/ }

else {

printf(“p2 run!\\n”);

- 6 -

wait_mark=1;

signal(17,stop); /*接收父进程发来的软中断信号17,并转stop*/ waiting();

lockf(stdout,1,0); /*标准输出加锁*/ printf(“child process 2 is killed by parent!\\n”); lockf(stdout,0,0); /*标准输出解锁*/ exit(0); /*子进程p2终止*/

} } else {

printf(“p1 run!\\n”);

wait_mark=1;

signal(16,stop); /*接收父进程发来的软中断信号16,并转stop*/ waiting();

lockf(stdout,1,0); /*标准输出加锁*/ printf(“child process 1 is killed by parent!\\n”); lockf(stdout,0,0); /*标准输出解锁*/ exit(0); /*子进程p1终止*/

} }

void waiting() {

printf(“waiting begin!\\n”); while(wait_mark!=0); printf(“waiting end!\\n”); } void stop() {

wait_mark=0; printf(“signal stop!”);

- 7 -

}

【执行结果】

【任务2】

在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略“Ctrl+c”键信号以及忽略中断信号。 【程序】

#include #include #include #include

int pid1,pid2;

int endflag=0,pf1=0,pf2=0;

void intdelete() {

- 8 -

kill(pid1,16); kill(pid2,17); endflag=1; } void int1() {

printf(“child process 1 is killed by parent!”); exit(0); } void int2() {

printf(“child process 2 is killed by parent!”); exit(0); }

main() {

int exitpid;

signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); while((pid1=fork())= =-1); if(pid1= =0) {

printf(“process 1 run!\\n”); signal(SIGUSR1,int1); signal(16, SIG_IGN); pause(); exit(0); } else {

- 9 -

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

printf(“process 2 run!\\n”); signal(SIGUSR2,int2); signal(17, SIG_IGN); pause(); exit(0); } else {

printf(“parent run!\\n”); signal(SIGINT,intdelete); waitpid(-1,&exitpid,0);

printf(“parent process is killed!\\n”); exit(0); } } }

【执行结果】

4.进程的管道通信 【任务】

编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进

- 10 -

程p1和p2分别向管道各写一句话: child 1 is sending a message! child 2 is sending a message!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 【程序】

#include #include #include

int pid1,pid2; main() {

int fd[3];

char outpipe[100],inpipe[100]; pipe(fd);

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

printf(“p1 run!\\n”); lockf(fd[1],1,0);

sprintf(outpipe,”child 1 process is sending a message!”); write(fd[1],outpipe,50); sleep(1); lockf(fd[1],0,0); exit(0); } else

{

while((pid2=fork())= =-1); if(pid2= =0)

- 11 -

{

printf(“p2 run!\\n”); lockf(fd[1],1,0);

sprintf(outpipe,”child 2 process is sending a message!”); write(fd[1],outpipe,50); sleep(1); lockf(fd[1],0,0); exit(0);

} else {

printf(“parent run!\\n”); wait(0);

read(fd[0],inpipe,50); printf(“%s\\n”,inpipe); wait(0);

read(fd[0],inpipe,50); printf(“%s\\n”,inpipe); exit(0); } } }

- 12 -

操作系统进程管理课程设计

内蒙古工业大学信息工程学院实验报告课程名称:操作系统实验名称:进程管理实验类型:验证性□综合性□设计性□实验室名称:
推荐度:
点击下载文档文档为doc格式
1zwaj4tznw8iiwn479cy
领取福利

微信扫码领取福利

微信扫码分享