操作系统实验过程详细解析

上传人:飞*** 文档编号:7522997 上传时间:2017-09-22 格式:DOC 页数:18 大小:326.50KB
返回 下载 相关 举报
操作系统实验过程详细解析_第1页
第1页 / 共18页
操作系统实验过程详细解析_第2页
第2页 / 共18页
操作系统实验过程详细解析_第3页
第3页 / 共18页
操作系统实验过程详细解析_第4页
第4页 / 共18页
操作系统实验过程详细解析_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《操作系统实验过程详细解析》由会员分享,可在线阅读,更多相关《操作系统实验过程详细解析(18页珍藏版)》请在金锄头文库上搜索。

1、Dufresne改变从现在开始! 博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 126 文章- 0 评论- 61 Linux 中 fork()函数详解 linux 中 fork()函数详解(原创!实例讲解) (转载)一、fork 入门知识一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用 fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的

2、进程的值不同。相当于克隆了一个自己。我们来看一个例子:cpp view plaincopy 1. /* 2. * fork_test.c 3. * version 1 4. * Created on: 2010-5-29 5. * Author: wangth 6. */ 7. #include 8. #include 9. int main () 10. 11. pid_t fpid; /fpid 表示 fork 函数返回的值 12. int count=0; 13. fpid=fork(); 14. if (fpid 8. #include 9. int main(void) 10. 11

3、. int i=0; 12. printf(i son/pa ppid pid fpid/n); 13. /ppid 指当前进程的父进程 pid 14. /pid 指当前进程的 pid, 15. /fpid 指 fork 返回给当前进程的值 16. for(i=0;ip3224-p3225 第一次 fork 后,p3224 (父进程)的变量为 i=0,fpid=3225(fork 函数在父进程中返向子进程 id),代码内容为:c-sharp view plaincopy 1. for(i=0;ip3224(当前进程)-p3226 (被创建的子进程)。对于子进程 p3225,执行完第一次循环后,

4、i=1,接着执行 fork,系统中新增一个进程 p3227,对于此进程,p3224-p3225(当前进程)-p3227(被创建的子进程)。从输出可以看到 p3225 原来是 p3224 的子进程,现在变成 p3227 的父进程。父子是相对的,这个大家应该容易理解。只要当前进程执行了 fork,该进程就变成了父进程了,就打印出了 parent。所以打印出结果是:1 parent 2043 3224 32261 parent 3224 3225 3227 第三步:第二步创建了两个进程 p3226,p3227,这两个进程执行完 printf 函数后就结束了,因为这两个进程无法进入第三次循环,无法 f

5、ork,该执行 return 0;了,其他进程也是如此。以下是 p3226,p3227 打印出的结果:1 child 1 3227 01 child 1 3226 0 细心的读者可能注意到 p3226,p3227 的父进程难道不该是 p3224 和 p3225 吗,怎么会是 1 呢?这里得讲到进程的创建和死亡的过程,在 p3224 和 p3225 执行完第二个循环后, main 函数就该退出了,也即进程该死亡了,因为它已经做完所有事情了。p3224 和 p3225 死亡后,p3226,p3227 就没有父进程了,这在操作系统是不被允许的,所以 p3226,p3227 的父进程就被置为 p1 了

6、,p1 是永远不会死亡的,至于为什么,这里先不介绍,留到“三、fork 高阶知识”讲。总结一下,这个程序执行的流程如下:这个程序最终产生了 3 个子进程,执行过 6 次 printf()函数。我们再来看一份代码:cpp view plaincopy 1. /* 2. * fork_test.c 3. * version 3 4. * Created on: 2010-5-29 5. * Author: wangth 6. */ 7. #include 8. #include 9. int main(void) 10. 11. int i=0; 12. for(i=0;i 8. #include

7、 9. int main() 10. pid_t fpid;/fpid 表示 fork 函数返回的值 11. /printf(fork!); 12. printf(fork!/n); 13. fpid = fork(); 14. if (fpid 2. #include 3. int main(int argc, char* argv) 4. 5. fork(); 6. fork() & fork() | fork(); 7. fork(); 8. return 0; 9. 问题是不算 main 这个进程自身,程序到底创建了多少个进程。为了解答这个问题,我们先做一下弊,先用程序验证一下,到此有

8、多少个进程。c-sharp view plaincopy 1. #include 2. int main(int argc, char* argv) 3. 4. fork(); 5. fork() & fork() | fork(); 6. fork(); 7. printf(+/n); 8. 答案是总共 20 个进程,除去 main 进程,还有 19 个进程。我们再来仔细分析一下,为什么是还有 19 个进程。第一个 fork 和最后一个 fork 肯定是会执行的。主要在中间 3 个 fork 上,可以画一个图进行描述。这里就需要注意&和|运算符。A&B,如果 A=0,就没有必要继续执行&B

9、了;A 非 0,就需要继续执行&B。A|B,如果 A 非 0,就没有必要继续执行|B 了,A=0,就需要继续执行|B。fork()对于父进程和子进程的返回值是不同的,按照上面的 A&B 和 A|B的分支进行画图,可以得出 5 个分支。加上前面的 fork 和最后的 fork,总共 4*5=20 个进程,除去 main 主进程,就是 19 个进程了。三、fork 高阶知识这一块我主要就 fork 函数讲一下操作系统进程的创建、死亡和调度等。因为时间和精力限制,我先写到这里,下次找个时间我争取把剩下的内容补齐。原文地址:http:/ Android, Linux, 系统标签: Linux fork

10、 process绿色通道: 好文要顶 关注我 收藏该文与我联系 Dufresne关注 - 13粉丝 - 173 +加关注 9 0 (请您对文章做出评价) 上一篇: Android 系统启动过程 下一篇: Win7 与 Ubuntu 双系统时卸载 Ubuntu 的方法posted 2012-08-31 10:00 Dufresne 阅读(26048) 评论(4) 编辑 收藏评论#1 楼 2014-03-30 18:39 | 小赵同学 啊,几个 fork 在一起我就晕了,一个套一个的。支持(0)反对(0)#2 楼 2014-04-14 14:59 | huangzh198 我怎么都想不懂,既然 f

11、ork 复制的是父进程的,那按照汇编代码的角度来看,我第一次 fork 之后,执行的是后面的,那打印出来的 i 应该是0 11 0 1 1 这样的组合,而不是先打印两次 0,之后再打印各自的 1 两次*2支持(1)反对(0)#3 楼 2014-10-06 15:57 | 小昌昌 最后一道题目,按照你图里面的分析,一个 fork_1 就同时创建了两个子进程,process_gen2_1 和process_gen2_2,这怎么解释啊?支持(0)反对(0)#4 楼 2014-10-20 20:08 | smileshitou 你代码中的回车符错了吧? 应该为n支持(0)反对(0)刷新评论刷新页面返回

12、顶部注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。【免费课程】分享:Fiddler 工具使用【推荐】50 万行 VC+源码: 大型组态工控、电力仿真 CAD 与 GIS 源码库融云,免费为你的 App 加入 IM 功能 让你的 App“聊”起来!写“ 听云”原创博文,赢取 iPhone 6 超级大奖最新 IT 新闻: 硅谷归来:硅谷的自由精神和黑客文化 360 周鸿祎:互联网带来的十大警示 硅谷风投新投资理念:对赢家绝对关注 小米为何固守中低端,不愿进军高端市场? 暴雪:再用外挂永久封号! 更多新闻.最新知识库文章: 大数据在服务器运营中的应用 禅意设计:网络简洁设计的缘起和未

13、来 通过一组 RESTful API 暴露 CQRS 系统功能 图数据挖掘浅析 一像素的恩怨情仇!程序猿与设计狮之间的那些事儿 更多知识库文章.昵称:Dufresne园龄: 3 年 2 个月粉丝:173关注:13 +加关注日 一 二 三 四 五 六29 30 31 1 2 3 45 6 7 8 9 10 1112 13 14 15 16 17 1819 20 21 22 23 24 2526 27 28 29 30 31 12 3 4 5 6 7 8搜索常用链接 我的随笔 我的评论 我的参与 最新评论 我的标签 更多链接我的标签 Android(9) 设计模式(7) Android Ril(4

14、) Android Framework RIL(3) Adapter(2) Telephony(2) 算法 排序(2) SIM(2) Singleton(1) SMS PDU 编码 (1) 更多随笔分类 Android(33) Android FrameWork(26) Android 控件(2) C/C+(12) Java 学习(3) Linux(19) Linux 内核学习笔记(11) Log & Debug(2) Reserved form others(1) Socket(3) Telephony & RIL(14) 代码大全学习笔记(4) 内存管理(1) 软件方法(4) 设计模式(22) 深思总结(5) 实用工具方法(2) 数据结构与算法(3) 通讯协议(7) 系统(4) 随笔档案 2013 年 5 月 (6) 2013 年 4 月 (4) 2013 年 3 月 (1) 2013 年 2 月 (7) 2013 年 1 月 (5) 2012 年 12 月 (1) 2012 年 11 月 (12) 2012 年 10 月 (6) 2012 年 9 月 (16) 2012 年 8 月 (5) 2012 年 7 月 (1) 2012 年 6 月 (7) 2012 年 5 月 (13) 2012 年 4 月 (6) 2012 年

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号