操作系统--实验一实验报告.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统课程实验指导书 【实验名称】:并发程序设计(实验1) 【实验目的】:掌握在程序中创建新进程的方法, 观察并理解多道程序并发执行的现象。 【实验原理】:fork():建立子进程。子进程得到父进程地址空间的一个复制。 返回值:成功时,该函数被调用一次,但返回两次,fork()对子进程返回0,对父进程返回子进程标识符(非0值)。不成功时对父进程返回-1,没有子进程。 【实验内容】:首先分析一下程序运行时其输出结果有哪几种可能性,然后实际调试该程序观察其实际输出情况,比较两者的差异,分析其中的原因。 void main (void) { int x=5; if( fork( ) ) { x+=30; printf (?d\n?x);其实 } else printf(?d\n?x);x) printf((?d\n?x);); } 【实验要求】:每个同学必须独立完成本实验、提交实验报告、源程序和可执行程序。实验报告中必须包含预计的实验结果,关键代码的分析,调试记录,实际的实验结果,实验结果分析等内容。 【预计的实验结果】 35 5 35 5 【关键代码分析】 这个实验代码只有几行,看起来很简单。可以看到,重点就是fork()函数和一个if else 条件分支语句。 关于fork()函数,它是Linux的系统调用。 函数定义:   int fork( void );   返回值:   子进程中返回0,父进程中返回子进程ID,出错返回-1   函数说明:   一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。   子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。系统派生出一个跟主程序一模一样的子进程可以这样想象,2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序;上下文和数据,绝大部分就是原 进程(父进程)的,但它们是两个相互独立的进程 这些代码,因此父进程的x变量被赋值为35,并输出。 子进程在之后的某个时候得到调度,它的上下文被换入,占据?CPU,操作系统对fork的实现,使得子进程中fork返回0。所以在这个进程fork前父进程的东西子进程可以继承,而在fork后子进程没有任何和父进程的继承关系了。在子进程里创建的东西是子进程的,在父进程创建的东西是父进程的。可以完全看成两个进程。 【调试记录】 这段代码基本上没有什么运行的问题,在这里我就用gdb来跟踪查看一下这个代码的运行情况。 (shell下) $gdb //进入gdb调试器 在 if(fork()) { 这行加个断点,执行run命令,就可以在fork执行之前停下来,此时变量x的值为5。 执行next命令,终端立即打印出5\n5\n,我们知道这里是父进程创建的子进程在执行,而且已经执行完了。所以我们可以很清楚的看到,fork()之后,子进程被创建,并与父进程在宏观上并行执行。因为父进程正在被调试中,所以子进程自己先执行完了。 此时断点在 x+=30; 这行代码,执行完剩下的代码后终端打印35\n35,调试结束。 【实际的实验结果】 35 35 5 5 【实验结果分析】 从实际的实验结果来看,父进程比子进程更先执行完,但我们应该记住,对于fork()来说,父子进程的优先级是一样的,至于父进程和子进程谁先执行, 则与操作系统的调度算法等等诸多因素。因此不能保证这个实验结果就是唯一的。至于其中的运行细节分析,已在关键代码分析中叙述,这里不再赘述。 【附加分析】 这里讨论一个有趣的代码段: void main(void) { printf(string); if(fork()) { printf(\n, x); } els

文档评论(0)

feiyang66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档