文章目录
- Linux虚拟内存
- 1. 如何处理虚拟地址和物理地址的关系
- 2. 分页虚拟地址和物理地址是如何映射的
- 3. 简单的分页缺陷
- 4. 段页式内存管理
Linux虚拟内存
对于32位处理器,虚拟内存空间为4G,每个进程都认为自己拥有4G的空间,实际上,在虚拟内存对应的物理空间上,可能只对应的一点点的物理内存。
进程得到的这4G虚拟内存是一个连续的地址空间(进程也是这么认为的),而实际上,它通常是被分隔成多个物理内存碎片,还有一部分存储在外部磁盘存储器上,在需要时进行数据交换。
由于存在两个内存地址,因此一个应用程序从编写到执行,需要进行两次映射。第一次是 映射到虚拟内存空间,第二次是 映射到物理内存空间。在计算机系统中,第二次映射的工作是由硬件和软件共同完成的。承担这个任务的 硬件部分叫做存储管理单元MMU,软件部分就是操作系统的内存管理模块。
1. 如何处理虚拟地址和物理地址的关系
内存分页
分页就是把整个虚拟和物理内存切成一段段固定大小的空间,连续且尺寸固定的内存空间叫做页,Linux下每一页大小为4KB。虚拟内存和物理内存之间通过页表来映射。
当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
- 采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存,解决了内存碎片的问题。
- 内存空间不足时,操作系统将正在运行的进程中,最近没使用的内存页面释放(暂时写入硬盘)需要的时候再加载进来。一次性只有少数的页,解决了交换效率低的问题。
- 分页使得我们在加载程序时,不用一次性加载到物理内存,可以只有在程序运行时,需要用到对应虚拟内存页里的指令和数据时,再加载到物理内存中。
2. 分页虚拟地址和物理地址是如何映射的
虚拟地址分为:页号 和 页内偏移
页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址。
3. 简单的分页缺陷
空间上的缺陷:32位,单进程一个页4KB,虚拟内存4G,就有个页,一个页表项4个字节,结果是4GB空间映射需要存储页表。多进程100,需要400MB。
以页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有100多万个页表项来映射,二级分页则只需要1024个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。
4. 段页式内存管理
地址由段号、段内页号和页内位移三部分组成。
- 第一次访问段表,得到页表起始地址;
- 第二次访问页表,得到物理页号;
- 第三次将物理页号与页内位移组合,得到物理地址
可用软硬件相结合的方法实现段页式地址变换,这样虽然增加了硬件成本和系统开销,但提高了内存的利用率。