惠州学院操作系统实验一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一进程的创建与并发执行
一、实验目的
(1) 熟悉Linux工作环境和GCC工具
(2) 加深对进程概念的理解,明确进程和程序的区别
(3) 进一步认识并发进程的实质和特征
二、实验器材
微型计算机、Ubuntu版本的Linux系统
三、实验内容
任务1:进程创建
编写一段程序,让父进程产生两个子进程,父进程显示字符“a”、两个子进程,分别显示字符“b”、“c”。运行程序,观察并分析运行结果。
程序源代码如下:
#include
main()
{
int p1, p2;
while((p1=fork())==-1); //父进程创建第一个进程,直到成功
if(p1==0) //0返回给子进程1
putchar('b'); //P1的处理进程
else //正数返回给父进程(子进程号)
{
while((p2=fork())==-1); //父进程创建第二个进程,直到成功
if(p2==0) //0返回给子进程2
putchar('c'); //P2的处理过程
else
putchar('a'); //P2创建完成后,父进程的处理过程}
}
程序运行截图如下:
程序运行结果分析:首先进程main作为父进程创建第一个进程p1,此时存在p1和main两个进程,分别为父进程和子进程,所以它们的p1分别为大于0和等于0。这两个进程分别执行下面的if函数体。当子进程执行时,打印出50000次childA;当父进程执行时,又创建了一个新的子进程p2,接下去的执行和原先的p1和main进程相同。所以最终系统中存在了4个进程,其中一个进程为终端,另外3个进程分别打印属于自己的内容。
任务2:
将上述的输出字符改为输出较长的字符串,观察进程并发执行,分析执行结果。
程序源代码如下:
#include
main()
{
int p1, p2, i;
while ((p1=fork())==-1); //父进程创建第一个进程,直到成功
if (p1==0)
for (i=0;i<50000;i++)
printf("childA%d\n",i);
else
{
while ((p2=fork())==-1); //父进程创建第二个进程,直到成功
if (p2==0)
for (i=0;i<50000;i++)
printf("childB%d\n",i);
else //P2创建完成后,父进程的处理过程for (i=0;i<50000;i++)
printf("parent%d\n",i);
}
}
程序运行结果截图如下:
运行结果分析:首先进程main作为父进程创建第一个进程p1,此时存在p1和main 两个进程,分别为父进程和子进程,所以它们的p1分别为大于0和等于0。这两个进程分别执行下面的if函数体。当子进程执行时,打印出50000次childA;当父进程执行时,又创建了一个新的子进程p2,接下去的执行和原先的p1和main进程相同。所以最终系统中存在了4个进程,其中一个进程为终端,另外3个进程分别打印属于自己的内容。
四、思考题解答(包括需要改写的程序的源码及适当注释)
1.当新创建进程开始执行时,指令指针的起始位置在哪里?
答:创建新进程之后,此时有main和p1两个进程,它们分别根据他们是子进程
还是父进程执行不同的if函数体,所以指令指针的起始位置在“if(p1==0)”这一句。
2.如果将任务1改为:编写一段程序,让父进程创建一个子进程,然后父进程显示
字符“a”;子进程创建一个子子进程,然后显示字符“b”;子子进程显示字符“c”。
如何改写源程序?(实验报告上给出完整的源码,并在机器上运行。)
答:修改后的源代码如下:
#include
main()
{
int p1, p2;
while((p1=fork())==-1); //父进程创建一个子进程,直到成功
if(p1==0) //0返回给子进程
{ //P1的处理过程
while((p2=fork())==-1); //子进程创建子子进程,直到成功
if(p2==0)
putchar('c'); //子子进程P2的处理过程
else
putchar('b');
}
else
{
putchar('a'); //子子进程创建完成后,父进程的处理过程}
}
修改后的运行结果如下: