不会跑

work for life

16 Sep 2016

关于fork和操作系统一些知识

  • A: 牛客网刷计算操作系统的题,遇到一个一直很模糊的题,所以记录下来。

题目是:

main{
 fork() || fork()
}

共创建了(3)个进程

解释是:

fork()给子进程返回一个零值,而给父进程返回一个子进车id;在main这个主进程中,首先执行 fork() || fork(), 左边的fork()返回一个非零值,根据**||的短路原则**,前面的表达式为真时,后面的表达式不执行,故包含main的这个主进程创建了一个子进程,由于子进程会复制父进程,而且子进程会根据其返回值继续执行,就是说,在子进程中, fork() ||fork()这条语句左边表达式的返回值是0, 所以||右边的表达式要执行,这时在子进程中又创建了一个进程,即main进程->子进程->子进程,一共创建了3个进程。

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,

也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都

复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

  • B: 使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括**:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端**等。

子进程与父进程的区别在于:

1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)

2、各自的进程ID和父进程ID不同

3、子进程的未决告警被清除;

4、子进程的未决信号集设置为空集。

  • C: 用户态切换到内核态的 3 种方式

    a.  系统调用

    b.  异常

    c.  外围设备的中断

 

  • D: 附加:局域网的网络地址192.168.1.0/24,局域网络连接其它网络的网关地址是192.168.1.1。主机192.168.1.20访问172.16.1.0/24网络时,其路由设置正确的是?

参考学习链接来自–博客园: http://www.cnblogs.com/bastard/archive/2012/08/31/2664896.html

comments powered by Disqus