linux - fork 产生的唯一开销是页表复制和进程 ID 创建

标签 linux process operating-system kernel fork

fork() 产生的唯一开销是父页表的复制 并为 child 创建一个独特的进程描述符。 在 Linux 中,实现了 fork() 通过使用写时复制页面。写时复制(或 COW)是一种技术 延迟或完全阻止数据的复制。

那么为什么需要复制页表。只要进程以只读模式共享页面,或者直到他们写了一些东西,就不需要复制页表,因为父进程和子进程的翻译是一样的??

谁能解释一下..

提前致谢

最佳答案

因为 COW 的工作原理是页面是只读的,所以我们需要一份全是只读的页表副本。当新进程写入某处时,页面错误被视为写入只读页面的结果。页面错误处理程序查看页面的状态,确定它是否应该被写入(如果不是,段错误,就像在原始进程中写入只读一样)并将相关的原始页面复制到新的过程。

原始页表的某些条目是可读写的,因此至少必须复制这些条目。我确实相信整个页表都被复制了(因为它使其他一些代码更简单,并且页表条目不是很大 - 每页四或八个字节 [每 4096KB 加一个条目,每 4009*4096KB 加一个条目) , 等等]。

还有一些有趣的方面,例如,如果我们有一些代码:

 char *ptr = malloc(big_number);
 // Fill ptr[...] with some data. 
 if(!fork())
 {
      // child process works on ptr data. 
      ...
 }
 else
 {
    free(ptr);
 }

现在,父进程中的页表条目将被删除。如果我们与子进程共享这些,我们需要知道这些页表条目是共享的。

在通过网络接收/发送数据、写入磁盘、交换页面进出等时,还会出现许多其他类似的问题。

关于linux - fork 产生的唯一开销是页表复制和进程 ID 创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724641/

相关文章:

android - 从 guest 操作系统访问本地主机

c - 具有共享内存的进程异常终止的行为

windows - 创建流程时是否存在系统事件?

multithreading - 线程有多贵?

linux - 操作系统(内核)对程序指令的影响(二进制级别)

operating-system - 小牛 macports 安装过时

linux - Cron-Bash : How to babysit an app on linux

java - 如何获取在 Kubernetes 节点上运行的 Pod 的历史记录?

linux - Android模拟器内存​​占用不断增加

process - 从 xv6 中的进程关闭 qemu