在linux系统中,调用fork系统调用创建子进程时,并不会把父进程所有占用的内存复制一份,而是与父进程公用相同的内存页,而当子进程或者父进程对内存页进行修改时才会进行复制----这就是著名的 写时复制 机制
进程的内存可以分为:虚拟内存 与 物理内存
应用程序使用的虚拟内存,比如C语言取地址操作符号& 所得到的地址就是虚拟内存地址。而虚拟内存地址 需要映射到物理内存地址 才能使用,如果使用没有映射的 虚拟内地址 ,将会导致 缺页异常 。
虚拟内存地址 映射到物理内存地址如图所示:
如上图所示,进程A 与进程B的相同虚拟内存地址 映射到不通的物理内存地址,这就是不通进程的相同虚拟内存地址互不影响的原因。
更多linux内核视频教程文档资料免费领取后台私信【内核】自行获取.
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
前面介绍了 虚拟内存 与 物理内存的概念,接下来将会介绍 linux 写时复制的原理。
前面说过,虚拟内存需要与物理内存进行映射才能使用,如果不同进程的 虚拟内存地址映射到相同的物理内存地址,那么就实现了共享内存的机制,如下图所示:
由于进程A的虚拟内存M 与进程B的虚拟内存M' 映射到相同的 物理内存G,所以当修改进程A虚拟内存M的数据时,进程B 虚拟内存M'的数据也会跟着改变。
linux为了加速创建子进程过程与节省内存使用的原因,实现了 写时复制 的机制。
写时复制 的原理大概如下:
写时复制 过程如下图所示:
从上图可知,当创建子进程时,父子进程指向相同的 物理内存,而不是将父进程所占用的 物理内存 复制一份。这样做的好处有两个:
但这个时候只能对内存进行读操作,如果父进程或子进程对内存进行写操作,那么将会触发 缺页异常,而在 缺页异常 处理中会对物理内存进行复制,并且重新映射其内存映射关系。
复制并重新映射到新的物理内存后,父子进程的虚拟内存就映射到不同的物理内存上,这时父子进程都可以对内存进行写操作而互不影响,所以需要把父子进程的内存读写权限设置为可读写。
- - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛
转载地址:讲解linux写时复制机制原理 - 圈点 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛
留言与评论(共有 0 条评论) “” |