操作系统实验报告三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告
课程名称姓名实验名称实验目的及要求
实验3进程并发与同步
1、加深对进程概念的理解,区分进程并发执行与串行执行;
2、掌握进程并发执行的原理,理解进程并发执行的特点;
3、了解fork()系统调用的返回值,掌握用fork()创建进程的方法;熟悉wait、exit等系统调用;
4、能利用相应的系统调用实现进程树与进程间的同
步。
实
验操作系统:linux Un bu ntu 11.10
环
境实验工具:Vmware
实验内容
1、编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father ”,儿子进
程执行时屏幕显示“ I am son ",女儿进程执行时屏幕显示“ I am daughter ”。
要求多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。要求有运行结果截图与结果分析
2、连续4个fork()的进程家族树,family1-1.c 程序清单如下:
#in clude
main ()
{
fork();
fork();
fork();
fork();
printf( A\n ”);
}
请根据程序运行结果,画出进程家族树,并分析原
因。
3、 修改程序1,在父、子进程中分别使用
wait 、exit 等系统调用“实现”其同 步推进,父进程必须等待儿子进程与女儿进程结束,
才可以输出消息。 写出相应的同 步控制,并分析运行结果。 4、 创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知 该键盘命令的路径与文件名为: /bin/ls 。父进程创建子进程, 并加载./child2 程序。 写出相应的程序代码并分析程序运行结果。
1、编写一 C 语言程序,实现在程序运行时通过系统调用 fork()创建两个子进
程,使父、子三进程并发执行,父亲进程执行时屏幕显示“ I am father ”,
儿子进程执行时屏幕显示“ I am son ”,女儿进程执行时屏幕显示“ I am daughter "。并且反复的测试,观察每一次的执行的顺序有什么不同
2、修改程序1,在父、子进程中分别使用 wait 、exit 等系统调用“实现”其同
步推进,父进程必须等待儿子进程与女儿进程结束,才可以输出消息。
4、创建一个子进程,并给它加载程序,其功能是调用键盘命令“ ls -I ”,已知
该键盘命令的路径与文件名为:
/bin/ls 。父进程创建子进程, 并加载./child2 程序。
法 描 述 及 实 验 步 骤 调
试过
程及实
验结果
1、实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程总、并发执行,父亲进程执行时屏幕显示“ I amfather ”,儿子进程执行时屏幕显示“ I
am son”,女儿进程执行时屏幕显示“ I am daughter ”。这一点需要注意。返回结结士果时,由于每一次的不确定性,所以要想得到比较具有说服性的,就必须经过多次
结的测试。
2、连续4个fork()的进程家族树在进行实验的时候可能会出现进程输出信息一直一样的
情况,需要多次执行输出才有可能会看到输出结果不一样的情况
附
录Child.C
#i nclude
#i nclude
int mai n() {
prin tf("I am child!\n"); execl("/bi n/ls", "Is", "-I", NULL); return 0;
}
创建进程
#i nclude
int main()
{
fork();
fork();
fork();
fork();
prin tf("A\n");
return 0;
}
Father.c
#i nclude
#i nclude
#i nclude
#i nclude
mai n()
{
in t p;
while ((p=fork())==-1);
if (p==0)
execl("./child",0);
else
{
wait(O);
exit(0);
}
}
进程并发
#i nclude
int main()
J
in t p1,p2;
while ((p1=fork())==-1);
if (p仁=0)
prin tf("I am son.\n ”);
else
{ while ((p2=fork())==-1);
if (p2==0)
prin tf("I am daughter.' n"); else
printf("I am father.'n");
}
return 0;
}
进程同步
#i nclude
#i nclude
int main()
{
in t p1,p2;
while ((p1=fork())==-1);
if (p仁=0)
prin tf("I am son.\n ”);
else
{
while ((p2=fork())==-1);
if (p2==0)
{
prin tf("I am daughter.' n");
}
else
{
wait(0);
printf("I am father.'n"); exit(0);
}
}
return 0;
}