当前位置: 技术问答>linux和unix
linux中fork函数对于子进程地址空间的一点疑问
来源: 互联网 发布时间:2016-11-12
本文导语: 我有一个问题,是关于fork的。我知道fork的作用是新开一个子进程,我现在的疑问是,内核是否会给fork开出的子进程单独初始化一个地址空间吗?子进程会否将父进程的地址空间中的数据拷贝到自己的地址空间中,如...
我有一个问题,是关于fork的。我知道fork的作用是新开一个子进程,我现在的疑问是,内核是否会给fork开出的子进程单独初始化一个地址空间吗?子进程会否将父进程的地址空间中的数据拷贝到自己的地址空间中,如果不是的话,那么下面的理解是否正确。
fork开出的子进程是共享父进程的数据。但是当如果需要改变在父进程中定义的数据时,会使用copy on write机制进行修改。如果是这样的话,那么子进程在访问父进程中定义的数据时难道是直接访问父进程的地址空间?这样的话,如何做到地址空间的隔离?
fork开出的子进程是共享父进程的数据。但是当如果需要改变在父进程中定义的数据时,会使用copy on write机制进行修改。如果是这样的话,那么子进程在访问父进程中定义的数据时难道是直接访问父进程的地址空间?这样的话,如何做到地址空间的隔离?
|
fork()之后,父进程中所有的数据都标记成只读。
从而fork出的子进程和父进程都能以读的访问数据。一旦需要写的时候,就会发生拷贝复制。
你你所说的地址空间隔离的问题完全不存在。
因为有虚拟地址的技术。
子进程中有 0x01地址,父进程中也有0x01地址,但是这两个0x01不是同一个地址。
这也就是虚拟地址空间。
子进程认为自己有4G的内存而感觉不到父进程的存在。
所以你所说的地址空间隔离的问题不存在
从而fork出的子进程和父进程都能以读的访问数据。一旦需要写的时候,就会发生拷贝复制。
你你所说的地址空间隔离的问题完全不存在。
因为有虚拟地址的技术。
子进程中有 0x01地址,父进程中也有0x01地址,但是这两个0x01不是同一个地址。
这也就是虚拟地址空间。
子进程认为自己有4G的内存而感觉不到父进程的存在。
所以你所说的地址空间隔离的问题不存在
|
我也是新手,简单说一下自己的理解:(不敢保证正确的)
fork创建子进程后,会将父进程的数据空间,堆栈空间都拷贝一份的,而不是像vfork一样共享父进程的。
fork创建子进程后,会将父进程的数据空间,堆栈空间都拷贝一份的,而不是像vfork一样共享父进程的。