操作系统 并发程序设计

更新时间:2023-04-24 00:22:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

fock()函数的详尽分析的汇报版

030702412陈楠

fock()函数的详尽分析的汇报版

PPT结构

fock()函数的详尽分析的汇报版

修改的代码段

#include<stdio.h>用来检测fork()之前语句是否被执行#include<unistd.h> void main (void){ int x=5;printf(“start\n”); if( fork( ) )用来标示父进程的输出{ x+=30; printf (“father%d\n”,x);}标示子进程的输出 else printf(“child%d\n”,x); printf(“out%d\n”,x);标示if外侧的输出}

fock()函数的详尽分析的汇报版

一般的输出 结论 fock()对于该语句之前的程序段只执行一次 fock()对于该语句返回两次值并针对两次返回值依次执行之后的语句

fock()函数的详尽分析的汇报版

fock() 被fork创建的新进程叫做自进程。fork函数被调用一次,却两次返回。返回值唯一的区别是在子进程中返回0,而在父进程中返回子进程的pid。 子进程和父进程都执行在fork函数调用之后的代码,子进程是父进程的一个拷贝。

父进程的数据空间、堆栈空间都会给子进程一个拷贝,而不是共享这些内存。

fock()函数的详尽分析的汇报版

解释 根据输出来看,fock()第一次先在子进程中执行代码段,第二次返回后在父进程中执行代码

fock()函数的详尽分析的汇报版

代码段修改(1)

#include<stdio.h>#include<unistd.h> void main (void){ int x=5;printf(“start\n”); if( fork( ) ){ x+=30; printf (“father%d\n”,x);} else{x+=20; printf(“child%d\n”,x);} printf(“out%d\n”,x);}

fock()函数的详尽分析的汇报版

解释1 修改后的代码能够体现子进程的空间和父进程的空间是不在同一个区域中,即不是共享同一内存

fock()函数的详尽分析的汇报版

并发执行现象(1) 在原始代码段运行中偶尔还会出现这样的现象

fock()函数的详尽分析的汇报版

并发执行现象(2) 在原始代码段运行中偶尔还会出现这样的现象

fock()函数的详尽分析的汇报版

并发执行解释 我的理解是程序刚好在执行中切换进程执行,在编译原始代码段后因为执行时间持续较短,发生这种现象的概率较小。 在之前的解释中能够说明父进程和子进程的空间是独立,存在进程间切换的可能性,发生这种现象证明了这种猜测。

fock()函数的详尽分析的汇报版

并发执行猜测 既然进程间会进行切换,那么所有执行的可能就有如下几种

start child 5 5 father 35 35(无切换) start child 5 father 35 35 5(切换1次) start child 5 father 35 5 35(切换2次)

start father 35 35 child 5 5(切换1次) start father 35 child 5 5 35(切换2次) start father 35 child 5 35 5(切换3次)

fock()函数的详尽分析的汇报版

并发执行猜测 不可能出现的情况是 start 5 child 5 35 father 35

start 5 35 father 35 child 5 start 5 35 child 5 father 35 start 35 father 35 5 child 5

start 35 5 child 5 father 35 start 35 5 father 35 child 5 即在father输出前已经输出35或 在child输出前已经输出5

fock()函数的详尽分析的汇报版

并发执行改进 在对源程序进行近半小时的重复执行后还没发现其他情况,我尝试的增加了一些冗

余的执行代码来增加切换的几率。 增加了很多空执行的延时 for(int i=0;i<0XFFFFF;i++);

fock()函数的详尽分析的汇报版

代码段修改(2) #include<stdio.h> #include<unistd.h> #define delay for(int i=0;i<0XFFFFF;i++); void main (void) { int x=5;printf(“start\n”); if( fork( ) ) { x+=30;delay; printf (“father%d\n”,x); delay; } else{30;delay; printf(“child%d\n”,x); delay;} delay; printf(“out%d\n”,x); }

fock()函数的详尽分析的汇报版

并发执行结果 这样的程序执行的一般结果就不再是5 5 35 35

而是其他的结果,在此列出我执行出的结果

fock()函数的详尽分析的汇报版

fock()函数的详尽分析的汇报版

小结 我总共尝试出6种结果中的5种,最后一种由于要3次切换才能出现,概率太小了,未能尝试出。

当执行操作很少的时候,一般是顺序就执行完 当执行操作很多的时候,进程间的切换概率就很大 由于并发执行对于单个程序来说还是顺序执行的,所以不可能出现5 child 5 35 father 35等6种情况 验证出来的结果充分说明并发执行中的进程切换是随机而且是无序的,在执行操作持续时间约长的时候,出现的几率越高;但对于同一个程序来说是顺序执行的。

fock()函数的详尽分析的汇报版

所有尝试出来结果的截屏

本文来源:https://www.bwwdw.com/article/l25q.html

Top