操作系统之内存管理
如果要真的把操作系统的内存管理全都搞清楚 那就不是一个帖子的事情
为了面向面试 总结一下面试话术吧
内存管理,操作系统主要需要负责的有
1.内存空间的分配与回收
2.地址转换,即虚拟地址与物理地址的转换
3.内存隔离保护
4.内存不足时从怎么扩充内存
1.内存空间的分配与回收
早期的操作系统分配内存时 是按块分配与回收的
会把内存分成大小相同的块,一个进程装到一个块里,这样就有比较大的内部空间碎片
即可能有些小进程也分到一个块里 大部分空间没用到 这里操作的内存还可以看做是物理内存
但是直接操作物理内存有许多问题,比如不安全 隔离性不好 等等
所以就有了虚拟内存 虚拟内存为会每个进程分配自己的虚拟地址,并不直接操作物理内存,由操作系统完成映射。
这样做有几个好处;
1.安全,不用担心直接操作到核心进程的物理内存
2.隔离,不会担心对当前进程的内存操作影响到其他进程
3.方便,程序员不用关心底层的物理内存,只对这个虚拟内存进行操作即可
4.可扩展,内存不够时,可以把一部分硬盘空间映射成虚拟内存,不过会下降性能
但是毕竟多了一步映射的操作,会小小影响性能,不够这点影响在他带来的好处来说几乎可以忽略不计
基于虚拟内存 发展出了分段机制
即根据程序运行动态地分配空间,使用内存段来为进程提供内存,用段表实现虚拟内存与物理内存之间的映射。
这样减少了内部内存碎片问题,但是仍然无法避免外部的内存碎片,即分配段空间时要求内存必须连续,不连续的内存无法分配到同一个段里。
所以为了进一步减小粒度 ,出现分页机制
操作系统把内存空间都划分成很多大小相同的页,每页4kb
这样应用程序虚拟地址空间中的任意虚拟页都可以被映射到物理内存的任意物理页,可以实现真正的内存离散分配,大幅度减少了内存的外部碎片问题
要查询分页机制下虚拟内存和物理内存的映射关系 要用页表 表内存的页号+偏移量
多级页表:时间换空间
TLB(快表):缓存被频繁访问的页,直接查询即可 不用查询页表
页缺失问题:
硬性页缺失:物理内存中没有
软性页缺失:物理内存中有但是mmu没有建立映射
换页机制:发生硬性页缺失时,要读页到内存但是内存不够 就要换页
物理内存不够用时,操作系统会选择将一些物理页的内容放到磁盘上去 等要用的时候再读到内存
页面置换算法:
1.最佳页面置换算法:理论最优秀
2.先进先出页面置换算法:将存活最久的淘汰,性能较差
3.最近最久未使用页面置换算法:LRU算法
4.最少使用:LFU
5.时钟页面
分段机制与分页机制的异同
同:
1.都是非连续
2.都用了地址映射来管理和保护内存
异:
1.页固定大小 段不固定
2.页是物理单位 段是逻辑单位
3.分段容易外部内存碎片
4.页表 段表
5.分页对程序没有要求 分段要把程序分段
段页机制
段:虚拟地址->线性地址
页: 线性地址->物理地址
空间局部性原理:记载当前页时,也会把相邻页加进来