fork函数的简单记录
【摘要】
操作系统进程创建是理解并发的基础,fork 函数的执行顺序在不同系统上表现不一。本文记录 fork 在父进程与子进程并行执行下的输出差异。采用 C 语言编写父子进程输出字符的程序,并用 shell 脚本循环执行万次,对 Ubuntu 与 Arch 两个系统的结果进行统计。结果显示:Ubuntu 上 2150 次 abc、2147 次 acb,Arch 上 2007 次 abc、52 次 acb、90 次 bac、1 次 cab。表明输出顺序受系统进程调度影响,本质是概率事件而非固定结果。
关键词:fork、进程调度、C语言、Ubuntu、Arch
关于操作系统fork的记录
由于fork()出来的子进程与父进程时并行执行的,所以在父进程结束后子进程还有可能存在(如果不让父进程等待子进程结束的话)
单次执行的代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int 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');
}
}
return 0;
}
由于不会在c里面写多次执行的方法,所以改用shell脚本调用可执行文件
for((a=0;a<10000;a++))
do
./a.out
sleep 1
echo -e "\n"
done
sleep主要是为了等本程序子进程执行完,不留到下一程序输出,测试一下还是有用的
ubuntu结果:
2150
2 abc
2147 acb
1 bac
1 bca
arch结果:
2150
2007 abc
52 acb
90 bac
1 cab
结论:主要是系统的进程调度问题,在不同系统里面出现不同结果,是一个概率事件呢...我之前还以为是固定的=.=
【小结】
本文围绕 fork 函数的执行顺序展开,主要结论:第一,fork 后父子进程并行执行,输出先后取决于调度;第二,同一程序在 Ubuntu 与 Arch 上结果分布差异显著,并非固定模式;第三,shell 脚本循环万次的统计证明这是概率事件。这些结果表明,进程调度具有不确定性,对理解并发程序行为有参考价值。

浙公网安备 33010602011771号