文章目录

  • Linux虚拟内存
  • 1. 如何处理虚拟地址和物理地址的关系
  • 2. 分页虚拟地址和物理地址是如何映射的
  • 3. 简单的分页缺陷
  • 4. 段页式内存管理


Linux虚拟内存

对于32位处理器,虚拟内存空间为4G,每个进程都认为自己拥有4G的空间,实际上,在虚拟内存对应的物理空间上,可能只对应的一点点的物理内存。

进程得到的这4G虚拟内存是一个连续的地址空间(进程也是这么认为的),而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。

由于存在两个内存地址,因此一个应用程序从编写到执行,需要进行两次映射。第一次是 映射到虚拟内存空间,第二次是 映射到物理内存空间。在计算机系统中,第二次映射的工作是由硬件和软件共同完成的。承担这个任务的 硬件部分叫做存储管理单元MMU,软件部分就是操作系统的内存管理模块

1. 如何处理虚拟地址和物理地址的关系

内存分页

分页就是把整个虚拟和物理内存切成一段段固定大小的空间,连续且尺寸固定的内存空间叫做Linux下每一页大小为4KB。虚拟内存和物理内存之间通过页表来映射。

当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。

  • 采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存,解决了内存碎片的问题。
  • 内存空间不足时,操作系统将正在运行的进程中,最近没使用的内存页面释放(暂时写入硬盘)需要的时候再加载进来。一次性只有少数的页,解决了交换效率低的问题。
  • 分页使得我们在加载程序时,不用一次性加载到物理内存,可以只有在程序运行时,需要用到对应虚拟内存页里的指令和数据时,再加载到物理内存中。

2. 分页虚拟地址和物理地址是如何映射的

linux服务器开启cpu虚拟化 linux服务器虚拟内存_运维

虚拟地址分为:页号页内偏移

页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址。

3. 简单的分页缺陷

空间上的缺陷:32位,单进程一个页4KB,虚拟内存4G,就有linux服务器开启cpu虚拟化 linux服务器虚拟内存_服务器_02个页,一个页表项4个字节,结果是4GB空间映射需要linux服务器开启cpu虚拟化 linux服务器虚拟内存_linux_03存储页表。多进程100,需要400MB。

以页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有100多万个页表项来映射,二级分页则只需要1024个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。

4. 段页式内存管理

linux服务器开启cpu虚拟化 linux服务器虚拟内存_页表_04

地址由段号段内页号页内位移三部分组成。

  1. 第一次访问段表,得到页表起始地址;
  2. 第二次访问页表,得到物理页号;
  3. 第三次将物理页号与页内位移组合,得到物理地址

可用软硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。