惠州学院操作系统实验一

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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'); //子子进程创建完成后,父进程的处理过程}

}

修改后的运行结果如下:

相关文档
最新文档