2.1 实验目的
1.加深对进程概念的理解,明确进程和程序的区别。
2.进一步认识并发执行的实质。
3.分析进程争用资源的现象,学习解决进程互斥的方法。
2.2 背景知识
1.阅读linux的sched.h源码文件,加深对进程管理概念的理解。
2.阅读linux的fork.c文件,分析进程的创建过程。
2.3实验内容
2.3.1进程创建
编写一段程序,利用系统调用fork( )创建两个进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
2.3.2进程控制
修改已经编好的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。
如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
2.3.3参考程序
参考程序1:
#include <stdio.h>
main()
{
int p1,p2;
while ((p1=fork())= =-1);
if (p1= =0)
putchar(‘b’);
else
{
while ((p2=fork()= =-1);
if (p2= =0)
putchar(‘c’);
else
putchar(‘a’);
}
}
回答问题: 从进程并发执行来看,输出bac,acb或bca都有可能,你的程序输出了什么结果?为什么有多种可能的输出?
参考程序2:进程控制源程序
#include <stdio.h>
main()
{
int p1,p2;
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);
}
}
回答问题:将程序执行多次,它们的输出结果分别是什么?分析程序结果存在多种可能的原因
参考程序3:
#include <stdio.h>
#include <unistd.h>
main()
{
int p1,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);
}
}
}
回答问题:改程序运行结果和参考程序2的运行结果有何不同,为什么?

