amj*_*jad 1 c process virtual-memory linux-kernel
我正在阅读一本教科书,其中讨论了如何fork()使用虚拟内存:
当
fork当前进程调用该函数时,内核会为新进程创建各种数据结构,并为其分配一个唯一的 PID。为了为新进程创建虚拟内存,它创建了当前进程的mm_struct、区域结构和页表的精确副本。它将两个进程中的每个页面标记为只读[强调添加],并将两个进程中的每个区域结构标记为私有写时复制。
来源:Computer Systems: A Programmer's Perspective,第 3 章,第 9.8.2 节 -fork重新审视的功能。
我不明白为什么它需要将两个进程中的每个页面都标记为只读。如果父进程中的每个页面都是只读的,那么父进程将永远无法修改一些未初始化的全局变量(.bss部分)。那么程序如何工作呢?
如果父进程中的每个页面都是只读的,那么父进程将永远无法修改一些未初始化的全局变量
只有当页面保持只读状态时才会如此。但他们并不像句子下一部分所说的那样:
并将两个进程中的每个区域结构标记为私有写时复制
每个页面都以只读方式开始,以便父子节点可以共享一个副本。如果任一进程仅在此时尝试修改这样的页面,则会生成可写副本(如果该页面确实是可写的)。复制之后,写入进程可以进行任何它喜欢的更改,而不会影响其他进程的原始(仍为只读)页面。
这可以为父级和子级实际上最终都不会更改的页面节省内存。
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |