浅谈Linux虚拟内存管理和虚拟地址空间

虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独占了当前系统的4G内存空间。所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。事实上,在每个进程被创建时候,内核只为进程"创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(.txt段,.data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射关系,等到程序运行的时候,才会通过缺页异常来拷贝数据。还有进程在运行过程中需要动态分配内存,比如malloc,也只是分配了虚拟内存,即为这块虚拟内存对应的页表表项做相应的映射关系,当进程真正访问到此数据时,才会引发缺页从而从磁盘文件中通过映射关系得到数据。

虚拟内存的好处
1,扩大地址空间。

2,内存保护:每个进程运行在各自的虚拟内存空间,互相不干扰。虚存还对特定的内存地址提供写保护,防止代码被恶意修改。

3,公平分配内存。采用虚存后,每个进程都有同样大小的虚拟内存空间。

4,当进程通信时,可采用共享内存的方式实现。

5,当不同的进程使用同样的代码时,比如库文件中的代码,物理内存可以只存储一份这样的代码(共享库),不同的进程只需要把自己的虚拟内存映射过去就可以使用该代码了,节省内存资源。

6,虚拟内存很适合在多道程序设计中使用,许多程序的片段同时保存在内存中,当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。在内存中可以保留多个进程,系统并发成都提高。

7,在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要在实际的物理内存分配,可以利用碎片。

虚拟内存的代价

1,虚拟内存的管理需要建立很多的数据结构,这些数据结构会占用额外的内存。

2,虚拟内存到物理地址的转换,增加了指令的执行时间。

3,页面的换入换出需要磁盘IO,很费时。

4,如果一页只能命中一部分数据,会浪费内存。

你可能感兴趣的:(操作系统,笔记,linux,运维,服务器)