一、内存管理
1、虚拟内存
- 定义:将进程所使用的地址隔离开,让操作系统为每个进程分配一套独立的虚拟地址,人人都有,互不干涉
- 两种地址的概念:
- 虚拟内存地址: 程序所使用的内存地址
- 物理内存地址: 实际存在硬件里面的空间地址
- 内存管理单元(MMU): 进程持有的虚拟地址会通过CPU芯片中的内存管理单元CMMU)的映射关系来转换为物理地址,然后再通过物理地址访问内存.
操作系统主要通过内存分段和内存分两种方式来管理虚拟地址与物理地址之间的关系.
2、内存分段
- 分段机制下的虚拟地址由两部分组成,段选择子和段内偏移量
- 段选择子:保存在段寄存器里面。段选择子里面最重要的是段号,用于段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等
- 段内偏移量:虚拟地址中的段内偏移量应该位于0和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址.
- 内存分段的不足:
- 内存碎片
- 内存交换的效率低
- 解决方法: 使用内存分页
3、内存分页
- 定义:分页是把整个虚拟和物理内存空间切成一段段固定的大小,这样把一个连续且尺寸固定的内存空间,称为页.
- 页表:在内存分页中虚拟地址与物理地址之间通过页表来映射
页表实际储存在CPU的内存管理单元(MMU)中,于是CPU就可以直接通过MMU,找出实际要访问的物理内存地址。
当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行.
- 分页是怎么解决分段的内存碎片、内存交换效率低的问题?
由于内存空间都是预先划分好的,也就不会像内存分段会产生间隙非常小的内存,这正是分段会产生内存碎片的原因。采用了分页,那么释放的内存都是以页为单位释放的,也就无法产生不能给进程使用的小内存
如果内存空间不够,操作系统会将其他正在运行的进程中的最近没使用的内存页面暂时写在硬盘上,称为“换出”。一旦需要的时候,在加载进来,称为“换入”。所以,一次性写入磁盘的只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对较高
- 分页机制下,虚拟地址和物理地址是如何映射的?
在分页机制下,虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物
理页每页所在的物理内存的基地址,这个基地址与页内偏移的组合形成了物理内存地址.
- 总结:内存地址转换
①. 把虚拟内存地址,切分成页号和页偏移量
②. 根据页号,以页表中,查询对应的物理页号.
③. 直接拿物理页号,加上前面的偏移量,就得到了物理内存地址.
- 多级页表: 多级页表通过将页表分成多个层次来解决单极页表的内存开销问题
- TLB:将常访问的几个页表存储到访问速度更快的硬件。在CPU中,加入了一个专门存放程序最常访问的页表项Cache,这个Cache就是TLB,通常称为页表缓存、专职旁路缓存、快表等
4、段页式内存管理
-
段页式内存管理实现的方式:
-
先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制
-
将每个段划分为多个页也就是对分段划分出来的连续空间,在划分固定大小的页,这样,地址结构就由段号、段内页号和页内位移三部分组成
-
- 段页式地址交换中要得到物理地址经过三次内存访问
- 第一次访问段表,得到内存访问起始地址
- 第二次访问页表,得到物理页号
- 第三次将物理页号与页内位移组合,得到物理地址