之前
copy on write (COW)
说父子进程共享同一个地址空间,就是说它们共享同一个代码段、数据段、堆和栈对吧?如果在COW之前父子进程共享同一个地址空间,那是什么
the page table entries are copied from parent process to child process
意思呢?复制页表条目是否意味着复制地址空间?
3 回答
假设您的进程有 var name X,其虚拟地址为 100,物理地址为 200。PTE 持有从虚拟 100 到物理地址 200 的地址映射。
在分叉之后,每个进程(父进程和子进程)都会有他的私有 PTE。此时,两个 PTE 都会将虚拟 100 映射到物理 200。
只要两个进程都从那里读取,它们都会从物理地址 200 读取。
当第一个尝试在那里写入时,来自物理地址的数据将被复制到一个新的物理空间,比如说 300,并且他的(并且只有他的)PTE 将被更新,因此虚拟 100 将映射到物理 300。方式对过程是透明的,因为他仍在使用相同的(虚拟)地址。
*注意:这只是一个抽象,真实的事情发生在页面分辨率上。
是的,进程(父进程和子进程)共享相同的物理内存。
这意味着每个人都有自己的 PTE,将虚拟地址空间转换为物理地址空间。就在叉子之后,它们通常是相同的。
是的,这意味着在分叉之后每个人都有自己的地址空间,这些地址空间在开始时是相同的,但以后可以并且将被更改。例如在 COW、malloc、free 上,基本上是针对进程内存使用的任何变化。
页表是在线性地址和物理地址之间映射的每个进程的数据结构。页表条目从父进程复制到子进程,这意味着在 之后fork()
,两个进程立即使用相同的页表,将相同的物理地址映射到每个进程地址空间中的相同线性地址。但是,在此之后,随着每个 COW 故障的发生和其他地址空间的更改,页表开始发散。