接着上面的实验部分,在实验一里面打印了8次“-”,且不太明白为什么,8成和我猜测的缓冲区和引用计数,信号处理没有关系,还是来实验一把,
同样把执行他们时的pid和ppid打印出来
实验4
在实验1的基础上增加id的输出信息
接下来编译运行一下,这里偷懒写了下makefile,内容是最基本的,就不贴这里了
输出的结果没有回车换行,看起来比较乱,这里手动排版一下:
-pid=2290,ppid=1903
-pid=2290,ppid=1903
-pid=2290,ppid=1903
-pid=2292,ppid=2290
-pid=2291,ppid=2290
-pid=2291,ppid=1
-pid=2291,ppid=2290
-pid=2293,ppid=1
通过输出,可以发现主进程( 这里的进程id为2290)打印了3次,而且第一个新生进程(pid=2291),也打印了3次,然后他们分别派生的进程(pid==2292,2293)打印了1次
总计为8次,
且执行的结果很乱,比如第一次ppid为1的时候,2291号进程的原父进程(2290)应该是被销毁了,但第二次打印显示,这时的父进程的id还是2290
这里就有必要怀疑是输出被缓存了,不应该同一个进程的ppid读出出现了2次不相同,且输出顺序有悖逻辑顺序
但为什么主进程和第一次派生的进程执行了3次,按照for循环控制,是不应该出现的呢?
那就输出的同时把i的值也给输出来,为了一步到位,把i的地址也输出出来。
实验5
编译后运行的输出结果为:
然后再来手动排版一下输出:
-pid=2771,ppid=1903,i=0,&i=-1996736788
-pid=2771,ppid=1903,i=1,&i=-1996736788
-pid=2771,ppid=1903,i=0,&i=-1996736788
-pid=2773,ppid=2771,i=1,&i=-1996736788
-pid=2772,ppid=1,i=0,&i=-1996736788
-pid=2772,ppid=1,i=1,&i=-1996736788
-pid=2772,ppid=1,i=0,&i=-1996736788
-pid=2774,ppid=2772,i=1,&i=-1996736788
从输出的结果来看,同一进程中,i值出现0-》1-》0的现象,有点奇怪,仍然搞不明白,且i的地址为啥是一样的呢?????且为负值,这里求大神指点一二
蛋在这个时候已经不复存在
但有个奇怪的现象,就是貌似线程执行的顺序有一定的规律,难道是线程同步的原因吗?上面结果的,本次的结果,执行顺序是一样的,ok,还是用实验验证下
我的猜测。
实验6
这次不改代码,至少多次执行上面的程序,看看输出是否是这样的规律
直接把结果贴出来
这里我已经不要节操了,掉了一地
然而不幸运的是,我的猜测是错误的,进程调度的顺序依然是无序的,这在运行几次的结果中可以看出,这种执行顺序的巧合只是概率问题
且很重要的一点是:0-》1-》0的规律却被保留了下来,且最后一组的输出没有输出完全,
还是把结果排版一下:
-pid=2920,ppid=1903,i=0,&i=1791291036
-pid=2920,ppid=1903,i=1,&i=1791291036
-pid=2921,ppid=2920,i=0,&i=1791291036
-pid=2921,ppid=2920,i=1,&i=1791291036
-pid=2920,ppid=1903,i=0,&i=1791291036
-pid=2922,ppid=2920,i=1,&i=1791291036
-pid=2921,ppid=2920,i=0,&i=1791291036
-pid=2923,ppid=1,i=1,&i=1791291036
到现在为止,我们可以说这8次输出,各个进程分别输出了3次3次1次1次,且输出时出现了截断现象。
接下来,可以大胆的猜测下,如果题目中的控制语句是<3,又会是个怎么个情况,且在有回车符的情况下,他们的i的地址是不是一样的呢?
难道是书本上写错了?
还是因为这些都是虚拟地址空间,实际上映射到物理内存之后,他们i的地址是不一样?