操作系统进程管理课程设计.docx
- 文档编号:16878684
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:15
- 大小:128KB
操作系统进程管理课程设计.docx
《操作系统进程管理课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统进程管理课程设计.docx(15页珍藏版)》请在冰点文库上搜索。
操作系统进程管理课程设计
内蒙古工业大学信息工程学院
实验报告
课程名称:
操作系统
实验名称:
进程管理
实验类型:
验证性□综合性□设计性□
实验室名称:
班级:
学号:
姓名:
组别:
同组人:
成绩:
实验日期:
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()
{
intp1,p2;
while((p1=fork())==-1);/*创建子进程p1,失败时循环*/
if(p1==0)/*子进程p1创建成功*/
putchar(‘b’);
else/*父进程返回*/
{
while((p2=fork())==-1);/*创建另一个子进程p2,失败时循环*/
if(p2==0)/*子进程p2创建成功*/
putchar(‘c’);
else
putchar(‘a’);/*父进程执行*/
}
}
【执行结果】
2.进程的控制
【任务】
修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。
如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
【程序1】
#include
main()
{
intp1,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);
}
}
【执行结果】
【程序2】
#include
#include
main()
{
intp1,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);
}
}
}
【执行结果】
3.软中断通信
【任务1】
编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:
childprocess1iskilledbyparent!
childprocess2iskilledbyparent!
父进程等待两个子进程终止后,输出以下信息后终止:
parentprocessiskilled!
【程序】
#include
#include
#include
#include
voidwaiting(),stop();
intwait_mark;
main()
{
intp1,p2;
while((p1=fork())==-1);/*创建进程p1*/
if(p1>0)
{
while((p2=fork())==-1);/*创建进程p2*/
if(p2>0)
{
Printf(“parentrun!
\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(“parentprocessiskilled!
\n”);
lockf(stdout,0,0);/*标准输出解锁*/
exit(0);/*父进程终止*/
}
else
{
printf(“p2run!
\n”);
wait_mark=1;
signal(17,stop);/*接收父进程发来的软中断信号17,并转stop*/
waiting();
lockf(stdout,1,0);/*标准输出加锁*/
printf(“childprocess2iskilledbyparent!
\n”);
lockf(stdout,0,0);/*标准输出解锁*/
exit(0);/*子进程p2终止*/
}
}
else
{
printf(“p1run!
\n”);
wait_mark=1;
signal(16,stop);/*接收父进程发来的软中断信号16,并转stop*/
waiting();
lockf(stdout,1,0);/*标准输出加锁*/
printf(“childprocess1iskilledbyparent!
\n”);
lockf(stdout,0,0);/*标准输出解锁*/
exit(0);/*子进程p1终止*/
}
}
voidwaiting()
{
printf(“waitingbegin!
\n”);
while(wait_mark!
=0);
printf(“waitingend!
\n”);
}
voidstop()
{
wait_mark=0;
printf(“signalstop!
”);
}
【执行结果】
【任务2】
在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。
这里signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略“Ctrl+c”键信号以及忽略中断信号。
【程序】
#include
#include
#include
#include
intpid1,pid2;
intendflag=0,pf1=0,pf2=0;
voidintdelete()
{
kill(pid1,16);
kill(pid2,17);
endflag=1;
}
voidint1()
{
printf(“childprocess1iskilledbyparent!
”);
exit(0);
}
voidint2()
{
printf(“childprocess2iskilledbyparent!
”);
exit(0);
}
main()
{
intexitpid;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
while((pid1=fork())==-1);
if(pid1==0)
{
printf(“process1run!
\n”);
signal(SIGUSR1,int1);
signal(16,SIG_IGN);
pause();
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
printf(“process2run!
\n”);
signal(SIGUSR2,int2);
signal(17,SIG_IGN);
pause();
exit(0);
}
else
{
printf(“parentrun!
\n”);
signal(SIGINT,intdelete);
waitpid(-1,&exitpid,0);
printf(“parentprocessiskilled!
\n”);
exit(0);
}
}
}
【执行结果】
4.进程的管道通信
【任务】
编制一段程序,实现进程的管道通信。
使用系统调用pipe()建立一条管道线。
两个子进程p1和p2分别向管道各写一句话:
child1issendingamessage!
child2issendingamessage!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
【程序】
#include
#include
#include
intpid1,pid2;
main()
{
intfd[3];
charoutpipe[100],inpipe[100];
pipe(fd);
while((pid1=fork())==-1);
if(pid1==0)
{
printf(“p1run!
\n”);
lockf(fd[1],1,0);
sprintf(outpipe,”child1processissendingamessage!
”);
write(fd[1],outpipe,50);
sleep
(1);
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
printf(“p2run!
\n”);
lockf(fd[1],1,0);
sprintf(outpipe,”child2processissendingamessage!
”);
write(fd[1],outpipe,50);
sleep
(1);
lockf(fd[1],0,0);
exit(0);
}
else
{
printf(“parentrun!
\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);
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 管理 课程设计