前言:文章参考 小林Coding, 部分图片来自王道考研和博主的公众号;学习书籍参考 操作系统设计与实现
目录
1. 什么是虚拟地址?
由程序产生的地址称为虚拟地址,在OS的帮助下,完成虚拟地址和物理地址的映射关系。
计算机中虚拟地址没有直接放到地址总线上,而是放到存储管理单元MMU,由它完成虚拟地址和物理地址的映射关系。
2. 基本分页存储管理思想
把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分
物理内存划分为若干固定大小的内存块, 称为物理页面或页框; 虚拟地址划分为同样大小相同的块,称为页面
操作系统以页框为进程分配内存空间,页框连续,因此可以避免内存碎片的产生(回收后的空间仍能很好被利用);页面与页框之间是一一映射关系。
每个进程可能被划分为若干页面,这些页面组成了页表结构
地址转换计算:
页号 = 逻辑地址 / 页面长度
偏移量 = 逻辑地址 % 页面长度
2.1 为什么分页能够解决碎片问题
页框大小固定,释放的内存大小以页为单位 -》 物理中的某一个页框,在下次分配中还是以页为单位分配,不会存在无法使用的小内存,如果内存过大,会被切分到多个页面中
当页表中不存在对应的页号时,发生缺页中断,通过一些页面置换算法去磁盘中检查是否存在合适的页面(当内存发生不足时,会选择不使用的内存页交换到磁盘当中,称为换入换出操作)
2.2 优缺点
优点:
通过分页,程序内存不需要全部加载到内存当中;在虚拟内存和物理内存建立映射关系后,通过虚存技术将不使用的页面放到磁盘中,当发生缺页中断的时候,在访问磁盘。
缺点:
1.磁盘访问频率过高
2.每个程序都会对应一个页表,当程序过大,页表会占据很大的内存
如:设虚拟内存大小4GB, 每个页面4KB(2^12),需要页面个数:4GB / 4KB = 2^20;如果每个页表项(页表中的每一行)为4B, 页表大小为2^20 * 4B = 4M;当程序存在100个,每个程序占有4M的页表,总页表大小为400M;
3. 多级页表
通过多级页表的方式解决页表内存占据过大的问题
在传统单表的页号部分继续划分分级页表。如上图,由一级页表中的信息可以映射到全部虚拟内存地址,但是计算内存占用,设每个页面4B, 一级页表:4KB, 二级页表:4KB * 1KB = 4MB
根据局部性原理, 虽然进程的虚拟内存很大,但是在程序运行过程中,并不会用到所有的虚拟地址,因此不需要全部记录在页表中
假设程序中只有20%的部分运行中使用,因此内存占据:4KB + 20% * 4MB (二级页表) = 0.804MB
4. 块表TLB
引入页表后,加大了磁盘内存的访问次数;为了解决这个问题,参照局部性原理,引入TLB(关联存储器),存放最常用的页表;TLB存放在MMU中
5. 段页式存储
段式存储 + 页式存储
段式存储思想是将物理内存安装程序划分为不同的段(这个段一般大小不固定,针对不同的程序赋予不同的大小,每个段之间相互独立)。段式存储中程序员可以清晰知道每个段的意义,存储什么数据,但是在回收的时候会产生内存碎片
结合页式存储思想,将物理内存划分为等大的页框便于内存的管理
整个地址空间分为:段号 + 段内页号 + 页内偏移
执行流程:1.先访问段表,得到页表的起始地址; 2. 访问页表,得到物理块号 3.计算物理内存中起始 + 页内偏移 计算真正的物理地址
6.总结
1.为了保证多个程序之间内存地址不会发生冲突,引入虚拟地址的概念。由OS屏蔽虚拟地址和物理地址之间的映射细节。
2.但是在程序内存过大时,可能导致分配不足,引入虚存技术。将不常用的程序先交换到磁盘中。
3.在系统维护映射关系的过程中,考虑分页和分段的思想
分段相对更加针对,程序员知道每段具体分配的信息;而分页将内存划分为等大部分,避免了内存碎片的产生,提高了内存的利用率。
4.分页思想提高了利用率,但是增加了磁盘的访问频率(当发生缺页中断),使用块表; 页表过大,产生多级分表的思想, 两种解决措施的根本来源于局部性原理