3.1 Using the program shown in the Figure3.30, explain what the output will be at LINE A

答案:LINE A 处的输出是PARENT: value = 5。

解析: 此问题的相关知识有进程创建、fork函数。

  当父进程调用fork函数时, 新创建的子进程几乎但不完全与父进程相同, 子进程会获得一份父进程用户级虚拟地址空间的拷贝, 但是此拷贝是独立的, 拷贝内容包括文本、数据和bss段、堆以及用户栈。

  所以在图中程序执行时, 子进程有一份自己的虚拟地址空间, 里面存放着和父进程相同的一份代码、数据、用户栈的拷贝, 而且是与父进程的地址空间是独立的。 因此, 子进程和父进程都有一个value变量, 二者互不影响。程序执行时, 子进程中的value会改变为20, 但是父进程的value值依然是5.

扩展: 在父进程创建新的子进程时, 子进程还会获得与父进程打开文件描述符相同的拷贝, 也就是说, 当父进程调用fork函数时, 子进程可以读写父进程中打开的任何文件。 父进程和子进程之间的最大区别在于它们有不同的PID。

  fork函数是有趣的(也是常常令人迷惑的), 因为它只被调用一次, 却会返回两次: 一次是在调用进程(父进程)中返回, 返回值是新建的子进程的PID; 一次是在新建的子进程中返回, 返回值是0。 因此总是可以利用fork的返回值来判断程序是在父进程还是子进程中执行。

    #include <sys/types.h>

    #include<unistd.h>

    pid_t fork(void);

    返回: 子进程返回0, 父进程返回子进程的PID, 如果出错, 则为-1。

  如果是第一次学习fork函数, 画进程图通常会有所帮助, 其中每个水平的箭头对应与从左到右执行指令的进程, 而每个垂直的箭头对应于fork函数的执行。

  

  

  下面的图示是一个父进程创建子进程的实例

  当在Linux系统上运行这个程序时, 我们得到下面的结果:

    parent: x = 0

    child  :  x = 2

  这个简单的例子有一些微妙的方面。

    *调用一次, 返回两次。 对于只创建一个子进程来说, 这还是挺直接的, 但是具有多个fork实例的程序可能会令人迷惑。

    *并发执行。 父进程和子进程是并发运行的独立进程。 内核能够以任意方式交替执行他们的逻辑控制流中的指令。在此系统上运行这个程序时, 父进程先完成它的printf语句, 然后是子进程。 然而, 在另一个系统上可能正好相反。 一般而言, 作为程序员, 决不能对不同进程中指令的交替执行做出任何假设。

    *相同的但是独立的地址空间。 如果能够在fork函数在父进程和子进程中返回后立即暂停这两个进程, 我们会看到每个进程的地址空间都是相同的。 每个进程的有相同的用户栈、 相同的本地变量值、相同的堆、相同的全局变量值, 以及相同的代码。 因此, 在实例程序中, 当fork在第8行返回时, 本地变量x在父进程和子进程都为1. 然而因为父进程和子进程都是独立的进程, 它们都有自己的私有地址空间。 父进程和子进程对x所做的任何改变都是独立的, 不会反映在另一个进程的存储器中。 这就是为什么当父进程和子进程调用各自的printf语句时, 它们中的变量x会有不同的值的原因。 3.1问题同样是这个原因。

    *共享文件。 当运行这个实例程序时, 我们注意到父进程和子进程都把它们的输出显示到了屏幕上。 原因就是子进程继承了父进程所有打开的文件。 当父进程调用fork函数时, stdout文件是被打开的, 并指向屏幕。 所以子进程的输出也指向了屏幕。

  文章中的理论知识摘自《Computer Systems: A Programmer's Perspective second edition》

[Chapter 3 Process]Practice 3.1 相关知识:进程创建、fork函数的更多相关文章

  1. [Chapter 3 Process]Practice 3.2 Including the initial parent process, how many processes are created by the program shown in Figure?

    3.2 Including the initial parent process, how many processes are created by the program shown in Fig ...

  2. [Chapter 3 Process]Practice 3.12 Including the initial parent process, how many processes are created by the program shown in Figure 3.32?

    3.12 Including the initial parent process, how many processes are created by the program shown in Fi ...

  3. [Chapter 3 Process]Practice 3.5 When a process creates a new process using the fork() operation

    3.5 When a process creates a new process using the fork() operation, which of the following state is ...

  4. [Chapter 3 Process]Practice 3.3 Discuss three major complications that concurrent processing adds to an operating system.

    3.3  Original version of Apple's mobile iOS operating system provied no means of concurrent processi ...

  5. [Chapter 3 Process]Practice 3.9 Describe the actions token by a kernel to content-switch between processes.

    3.9 Describe the actions token by a kernel to content-switch between processes. 答案: 内核在进行进程上下文切换时, 首 ...

  6. [Chapter 3 Process]Practice 3.8: Describe the differences among short-term, medium-term, long-term scheduling

    3.8 Describe the differences among short-term, medium-term, and longterm scheduling. 答案: 长期调度决定哪些进程进 ...

  7. [Chapter 3 Process]Practice 3.4 Describe what happens when a context switch occurs if the new context is already loaded into one of the register sets.

    3.4 The Sun UltraSPARC processor has multiple register sets. Describe what happens when a context sw ...

  8. python的面向对象-实例(对象)的相关知识、实例化

    1.对象就是实例,什么是实例 类运行的过程就是实例化的过程,实例化产生的结果就是产生了一个实例 class的牛逼之处就是不用手动的return,他会加载完函数之后,自动return  __init__ ...

  9. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

随机推荐

  1. SolrCloud 5.5.5 + Zookeeper + HDFS使用

    安装sol r 三个节点192.168.1.231,192.168.1.234,192.168.1.235 下载安装包solr.tar.gz 解压 tar -zxvf solr.tar.gz 配置ZK ...

  2. nodejs mysql 操作数据库方法二

    node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选, ...

  3. 0.00-050613_ZC_Chapter4_20151230

    1. 32位 保护模式 段选择符 --> 段描述符(段描述符表) --> 段基地址 + 偏移量  ==> 线性地址(ZC: 这个地址就是段的开始地址) 1.2. 段限长字段LIMIT ...

  4. 十大监视SQL Server性能的计数器

      作为DBA,每个人都会用一系列计数器来监视SQLSERVER的运行环境,使用计数器,既可以衡量当前的数据库的性能,还可以和以前的性能进行对比.我们也可以一直以快速和简单的方法把计数器做了一张图表来 ...

  5. VSCode设置中文语言显示

    Vscode是一款开源的跨平台编辑器.默认情况下,vscode使用的语言为英文(us),如何将其显示语言修改成中文了? 1)打开vscode工具: 2)使用快捷键组合[Ctrl+Shift+p],在搜 ...

  6. DocString

    文档字符串:写注释专用的, 在函数的第一个逻辑行的字符串是这个函数的 文档字符串 .注意,DocStrings也适用于模块和类,我们会在后面相应的章节学习它们. 文档字符串的惯例是一个多行字符串,它的 ...

  7. //封装tabs函数

    //封装tabs函数function tabs(tabTit,on,tabCon){ $(tabCon).each(function(){ $(this).children().eq(0).show( ...

  8. Django 基础 模板系统

    Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {% %} 'b', 'c', 'd']的话,就显示4. filesizeformat 将值格式化为一个 “人类可读的” 文件尺寸 ( ...

  9. L121

    今天上午签字仪式的布置与该场合的严肃性非常协调.The setting for this morning's signing ceremony matched the solemnity of the ...

  10. js字符串和数组操作,容易混淆的方法总结(slice、substring、substr、splice)

    平时工作中,很少静下心来总结基础知识,总觉得自己会用了,有点飘了,直到碰壁之后才懂得基础知识的重要性.大牛告诉我,一次写对,是不是可以不用F12去调试了?是不是省了时间?简直是面红耳赤,无地自容.在这 ...