4
  1. 之前copy on write (COW)说父子进程共享同一个地址空间,就是说它们共享同一个代码段、数据段、堆和栈对吧?

  2. 如果在COW之前父子进程共享同一个地址空间,那是什么the page table entries are copied from parent process to child process意思呢?

  3. 复制页表条目是否意味着复制地址空间?

4

3 回答 3

7

假设您的进程有 var name X,其虚拟地址为 100,物理地址为 200。PTE 持有从虚拟 100 到物理地址 200 的地址映射。

在分叉之后,每个进程(父进程和子进程)都会有他的私有 PTE。此时,两个 PTE 都会将虚拟 100 映射到物理 200。

只要两个进程都从那里读取,它们都会从物理地址 200 读取。

当第一个尝试在那里写入时,来自物理地址的数据将被复制到一个新的物理空间,比如说 300,并且他的(并且只有他的)PTE 将被更新,因此虚拟 100 将映射到物理 300。方式对过程是透明的,因为他仍在使用相同的(虚拟)地址。

*注意:这只是一个抽象,真实的事情发生在页面分辨率上。

于 2011-06-01T11:28:39.423 回答
3
  1. 是的,进程(父进程和子进程)共享相同的物理内存。

  2. 这意味着每个人都有自己的 PTE,将虚拟地址空间转换为物理地址空间。就在叉子之后,它们通常是相同的。

  3. 是的,这意味着在分叉之后每个人都有自己的地址空间,这些地址空间在开始时是相同的,但以后可以并且将被更改。例如在 COW、malloc、free 上,基本上是针对进程内存使用的任何变化。

于 2011-06-01T10:19:52.343 回答
2

页表是在线性地址和物理地址之间映射的每个进程的数据结构。页表条目从父进程复制到子进程,这意味着在 之后fork(),两个进程立即使用相同的页表,将相同的物理地址映射到每个进程地址空间中的相同线性地址。但是,在此之后,随着每个 COW 故障的发生和其他地址空间的更改,页表开始发散。

于 2011-06-01T06:46:44.217 回答