LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1297|回复: 9

请教一个关于进程的问题~~~~~~~~~~

[复制链接]
发表于 2008-8-11 13:18:32 | 显示全部楼层 |阅读模式
首次发帖,急问个问题,想了半天想不通~~~~~
int main()
{
printf("main %d\n",getpid());//打印语句1
pid_t i=fork();
printf("main_2 %d\n",getpid());//打印语句2
if(i==0)
printf("i%d,i%d\n",i,getpid());//打印语句3
else
printf("i%d,i%d\n",i,getpid());//打印语句5
}
大家看一下上面这个程序,就是在main()里面创建了一个新进程,然后测试每一个语句到底处于什么进程中,输出结果如下:

main 1834 //语句1
main_2 1835 //语句2
i0,i1835 //语句3
main_2 1834 //语句4
i1835,i1834 //语句5

输出结果中的1,2,3,5我没什么疑问,就是第4句想不通,为什么在进入父进程空间的时候会调用之前的打印语句2 ???
我新学的,比较愚蠢,请各位讲的详细一点,谢谢~~~~~~~~~~
发表于 2008-8-11 18:12:38 | 显示全部楼层
fork之后,父进程和子进程都要继续执行fork后面的指令阿
回复 支持 反对

使用道具 举报

发表于 2008-8-12 01:41:19 | 显示全部楼层
为什么在进入父进程空间的时候会调用之前的打印语句2
=======
你是问为什么会出现这种顺序对吧?(也就是语句4在语句3之后运行的顺序)
这个问题涉及到基础的操作系统原理。你要能理解多道程序设计。
简单来说就是现代操作系统的分时特性和调度的相关知识。
现代计算机的CPU每次只能运行有限的进程数量。过去一般是一个进程,现在由于多核计算机的出现可以同时运行的进程多了起来。
那么我们看到的非常多的进程同时运行其实是一个假象,其实他们是轮换运行的。
现代操作系统中的分时特性简单来说就是把系统运行多个进程的时间分的一片一片的。
按照固定的算法,每个进程公平的得到他应该得到的时间长度来运行,时间一到就更换下一个。
你用了fork调用。就出现了两个进程。他们在时间的轮换上是平等的。轮换执行的。决定他们的是那个固定的算法。其实非常微妙,对于我们人来说多个程序的轮换顺序是非常不好预测的,也就是不能预测。
其实你这个程序的执行何止是会有这种顺序。

建议你学习国外的操作系统原理书来提高。不但可以学到操作系统原理,还可以学习到一些相对复杂问题的解决方法。比如互斥,多道,调度,存储管理等一些概念。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-12 09:57:12 | 显示全部楼层
多谢2位~~~~~~~~
其实我问的不是为什么会出现这种顺序,而是没理解为什么会执行语句4,我认为不应该执行。。。。
不过昨天看了一些书,似乎理解了。
楼上说的不错,但是在我的计算机上就这一种执行顺序,不过这无所谓啦。
我还发现如果连续使用2个pid_t i=fork()语句,情况会变得异常复杂。
回复 支持 反对

使用道具 举报

发表于 2008-8-14 00:53:09 | 显示全部楼层
建议画张草图就更明白了
回复 支持 反对

使用道具 举报

发表于 2008-8-14 10:09:49 | 显示全部楼层
在fork之后,分成两个进程,但是代码是不变的。
所以fork之后的语句都要执行
很多程序fork之后没有代码,立刻用判断返回值得方式在两个进程中分别执行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-14 13:42:44 | 显示全部楼层
多谢!我都理解了。
我就是不明白像楼上说的这么简单明了的原理,几乎所有书上都不解释一下。
回复 支持 反对

使用道具 举报

发表于 2008-10-12 09:08:14 | 显示全部楼层
fork是让子进程拥有一个跟父进程一模一样的内存映像,所以这里if...else之外的语句父子进程都会执行。
回复 支持 反对

使用道具 举报

发表于 2008-10-26 03:05:43 | 显示全部楼层
我的理解是  LZ写的那段代码 不是按照语言的“顺序”执行的!
回复 支持 反对

使用道具 举报

发表于 2008-10-26 21:24:59 | 显示全部楼层
Post by huyongzs;1884970
为什么在进入父进程空间的时候会调用之前的打印语句2
=======
你是问为什么会出现这种顺序对吧?(也就是语句4在语句3之后运行的顺序)
这个问题涉及到基础的操作系统原理。你要能理解多道程序设计。
简单来说就是现代操作系统的分时特性和调度的相关知识。
现代计算机的CPU每次只能运行有限的进程数量。过去一般是一个进程,现在由于多核计算机的出现可以同时运行的进程多了起来。
那么我们看到的非常多的进程同时运行其实是一个假象,其实他们是轮换运行的。
现代操作系统中的分时特性简单来说就是把系统运行多个进程的时间分的一片一片的。
按照固定的算法,每个进程公平的得到他应该得到的时间长度来运行,时间一到就更换下一个。
你用了fork调用。就出现了两个进程。他们在时间的轮换上是平等的。轮换执行的。决定他们的是那个固定的算法。其实非常微妙,对于我们人来说多个程序的轮换顺序是非常不好预测的,也就是不能预测。
其实你这个程序的执行何止是会有这种顺序。

建议你学习国外的操作系统原理书来提高。不但可以学到操作系统原理,还可以学习到一些相对复杂问题的解决方法。比如互斥,多道,调度,存储管理等一些概念。


和我的想法一样 呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表