- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 新22S6消防工程参考标准.docx
- 慢性肾脏病早期筛查、诊断及防治指南(2022年版).pptx VIP
- 家庭饮食健康计划.pptx VIP
- 2025年福建省厦门集美中学招聘办公室职员1人笔试备考题库及答案解析.docx VIP
- 级配碎石施工 ..ppt VIP
- 2022年7月上海高考英语真题(学生版+解析版+听力音频).docx
- DB44T 1212-2013 用能单位能源计量管理体系通用要求.pdf VIP
- 上-下气道慢性炎症性疾病联合诊疗与管理专家共识中华医学会呼吸病学分会哮喘学组(发布时间:2017-07).pdf VIP
- 心力衰竭诊疗规范.docx VIP
- 光照时间对三斑海马幼苗成活率和生长速度的影响.pdf VIP
文档评论(0)