假设一个进程是从另一个进程派生出来的。换句话说,我们通过 fork 函数调用来复制一个进程。现在由于分叉是一种写时复制机制,所以每当分叉的进程或原始进程写入一个页面时,它们都会获得一个新的物理页面来写入。所以我的理解是,当分叉和原始进程都在执行时,事情就是这样的。
--> 分叉时,原始和分叉进程的所有页面都被授予只读访问权限,以便内核知道写入哪个页面。当这种情况发生时,内核将一个新的物理页面映射到写入进程,将以前的内容写入其中,然后授予对该页面的写入访问权限。现在我不清楚的是,如果分叉和原始进程都写入同一个页面,它们中的一个是否仍将保留原始物理页面(在分叉之前),或者两者都将获得新的物理页面。其次,我的假设是否正确,即分叉和原始进程中的所有页面在分叉时都被授予只读访问权限?
--> 现在由于每个页面错误都会触发一个中断,这意味着每次写入原始或分叉进程都会减慢执行速度。假设我们知道应用程序,并且我们知道将写入大量连续的内存页面,那么当组中的一个页面时,将写入权限授予多个页面(假设是一组页面)不是更好吗?被写入。这将减少由于页面错误处理而导致的中断数量。不是吗?当然,在这种情况下,我们有时可能会不必要地进行复制,但我认为中断比写入 512 个long类型的变量(每页 4096 字节)的开销要大得多。我的理解是正确的还是我遗漏了什么?