实验三:进程的控制
内容:在进程的创建实验的基础上,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。
如果在程序中使用系统调用Lockf( )来给每一个进程加销,可以实现进程之间的互斥,观察并分析出现的现象。
要求:理解加控的控制前后,输出不同结果的原因。
示例:
# include
# include
# include
main()
{
int p1,p2,i;
while((p1=fork())==-1);
if(p1==0)
{
for(i=0;i<500;i++)
printf("child %d\n",i);
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
for(i=0;i<500;i++)
printf("son%d\n",i);
}
else
{
for(i=0;i<500;i++)
printf("daughter%d\n",i);
}
}
}
<运行结果>
SON…
CHILD…
DAUGHTER…
<分析:>由于函数PRINTF()输出的字符串之间不会被中断,因此,字符内部的字符顺序输出时不变。但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字答的结果相同。
<程序3>
#include
#include
#include
#include
main()
{
int p1,p2;
int i;
while ((p1=fork())==-1);
if(p1==0)
{
lockf(1,1,0);
for(i=0;i<500;i++)
printf("child%d\n",i);
lockf(1,1,0);
}
else
{
while ((p2=fork())==-1)
if(p2==0)
{
lockf(1,1,0);
for(i=0;i<500;i++)
printf("son%d\n",i);
lockf(1,0,0);
}
else
{
lockf(1,1,0);
for(i=0;i<500;i++)
printf("daughter%d\n",i);
lockf(1,0,0);
}
}
}
<运行结果>大致与未上锁的输出结果相同,也是随着执行时间不同,输出结果表明的顺序有所不同。
<分析:>因为上述执行时,不同进程之间不存在共享临界资源(其中打印机的互斥性已由操作系统保证)问题所以,加锁与不加锁效果相同。
本文来源:https://www.2haoxitong.net/k/doc/68ebf0d484254b35eefd34ef.html
文档为doc格式