当前位置: 技术问答>linux和unix
关于fork系统调用
来源: 互联网 发布时间:2016-05-14
本文导语: 书上写:父进程的所有的资源全部都通过数据结构的复制“遗传”给子进程。 难道真是这样吗?父子进程就没有共享的东西吗?难道程序的正文段也被复制了吗? | 对,说白了还是写时复制...
书上写:父进程的所有的资源全部都通过数据结构的复制“遗传”给子进程。
难道真是这样吗?父子进程就没有共享的东西吗?难道程序的正文段也被复制了吗?
难道真是这样吗?父子进程就没有共享的东西吗?难道程序的正文段也被复制了吗?
|
对,说白了还是写时复制,因为正文段父子进程都不会去写,所以实际使用同一块物理内存是可以的。
|
实际上一般都是在“写时复制”,并不是一开始就复制。
父子进程之间好像真没啥共享的东西。
父子进程之间好像真没啥共享的东西。
|
由f o r k创建的新进程被称为子进程( child process)。该函数被调用一次,但返回两次。两次返
回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程I D。将子进程I D返回
给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以
获得其所有子进程的进程I D。f o r k使子进程得到返回值0的理由是:一个进程只会有一个父进
程,所以子进程总是可以调用g e t p p i d以获得其父进程的进程I D (进程ID 0总是由交换进程使用,
所以一个子进程的进程I D不可能为0 )。
子进程和父进程继续执行f o r k之后的指令。子进程是父进程的复制品。例如,子进程获得
父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这
些存储空间部分。如果正文段是只读的,则父、子进程共享正文段(见7 . 6节)。
现在很多的实现并不做一个父进程数据段和堆的完全拷贝,因为在f o r k之后经常跟随着
e x e c。作为替代,使用了在写时复制( C o p y - O n - Write, COW)的技术。这些区域由父、子进程共
享,而且内核将它们的存取许可权改变为只读的。如果有进程试图修改这些区域,则内核为有
关部分,典型的是虚存系统中的“页”,做一个拷贝。B a c h〔1 9 8 6〕的9 . 2节和L e ff l e r等〔1 9 8 9〕
的5 . 7节对这种特征做了更详细的说明.-------------------------------------Unix环境高级编程
所以,2楼的说法是对的。
回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程I D。将子进程I D返回
给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以
获得其所有子进程的进程I D。f o r k使子进程得到返回值0的理由是:一个进程只会有一个父进
程,所以子进程总是可以调用g e t p p i d以获得其父进程的进程I D (进程ID 0总是由交换进程使用,
所以一个子进程的进程I D不可能为0 )。
子进程和父进程继续执行f o r k之后的指令。子进程是父进程的复制品。例如,子进程获得
父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这
些存储空间部分。如果正文段是只读的,则父、子进程共享正文段(见7 . 6节)。
现在很多的实现并不做一个父进程数据段和堆的完全拷贝,因为在f o r k之后经常跟随着
e x e c。作为替代,使用了在写时复制( C o p y - O n - Write, COW)的技术。这些区域由父、子进程共
享,而且内核将它们的存取许可权改变为只读的。如果有进程试图修改这些区域,则内核为有
关部分,典型的是虚存系统中的“页”,做一个拷贝。B a c h〔1 9 8 6〕的9 . 2节和L e ff l e r等〔1 9 8 9〕
的5 . 7节对这种特征做了更详细的说明.-------------------------------------Unix环境高级编程
所以,2楼的说法是对的。
|
写时复制只是对内存空间进行的,事实上fork一个进程时,你要增加一些管理这个进程的数据结构,而这些数据结构的内容很多就是复制父进程的。
|
楼上几位这么清晰了,帮顶吧