操作系统实验报告实验3-1 下载本文

内容发布更新时间 : 2024/4/28 3:43:53星期一 下面是文章的全部内容请认真阅读。

操作系统实验报告

实验3-1: Linux进程的创建与父子进程同步

1. 实验目的

(1)熟悉在C语言源程序中使用Linux所提供的系统调用界面的方法; (2)掌握Linux中进程的创建方法以及调度执行情况,理解进程与程序的区别; (3)使用系统调用wait()和exit(),实现父子进程同步; (4)了解Linux提供的C编译器gcc的调用; (5)进一步掌握vi的使用。

2. 实验内容

(1)父进程创建子进程,返回后父子进程都分别循环输出字符串“I am parent.”或“I am child.”5次,每输出一次后使用sleep(1)延时1秒,然后再进入下一次循环,如下所示。将该源程序链接后执行,观察并分析运行结果。 父进程返回后执行:

for(i=0;i<5;i++) { printf(“I am parent.\\n”); sleep(1); } 子进程返回后执行:

for(i=0;i<5;i++) { printf(“I am child.\\n”); sleep(1); }

(2)进程家族树

在源程序中连续使用4个fork(),而不是用if()进行返回值的判段,在4个fork()语言后面输出字符“A”。观察并分析该程序编译连接执行后的输出结果。 (3)父子同步进程

修改第(1)题的程序,使用exit()和wait()实现父子进程同步,其同步方式为父进程等待子进程的同步,即:子进程先循环输出5次,然后父进程再循环输出5次.观察是否有不同的结果出现。

3. 实验思考

(1) 观察运行结果,分析结果产生的原因。

答:当一个新的进程创建后,系统就会增加一个进程参与竞争CPU,并随时可能被操作系统调度执行

(2) 当程序中创建了子进程后,该程序的执行有什么特点?为什么?

答:条件分支的结构清晰,实现父子进程的程序分离及父子进程双方感觉不到对方的行为;因为子进程创建后复制了父进程的堆栈和数据空间,并继承了父进程的资源权限,及父进程和子进程在各自的空间中运行同一内容的程序,所以程序会运行两次。

(3) 如果连续创建多个子进程而不使用条件进行各自空间的分隔,会出现什么情况?请

画出第(2)题实验的进程家族树。

Fork()

Fork() Fork()

Fork() Fork() Fork() Fork()

Fork() Fork() Fork() Fork() Fork() Fork() Fork() Fork() 如上图所示一共出现了16个A

(4)

间的父进程等待子进程的同步?

答:使用信号量P、V操作来实现子进程与父进程的同步,子进程终止时执行exit()向父进程发终止信号,父进程使用wait()等待子进程的终止。

如何实现父子进程之

4. 实验代码

①3-1-1: main() {

int p1,i;

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

for (i=0;i<5;i++) { printf(\ sleep(1); } else

for (i=0;i<5;i++) { printf(\

sleep(1); } }

②3-1-2:

#include main() {

fork(); fork(); fork(); fork();

putchar('A'); //每个进程都要输出‘A’ }

③3-1-3: main() {

int p1,i;

while ((p1=fork())==-1); if (p1>0) { wait(0); for (i=0;i<5;i++) { printf(\ sleep(1); } } else { for (i=0;i<5;i++) { printf(\ sleep(1); } exit(0); } }

5. 程序运行结果

①3-1-1: