操作系统内存知识点

操作系统的内存究竟是怎么一回事?带你完整复习一遍《操作系统》一书中有关内存的所有知识点 。
本文分享自华为云社区《操作系统的内存究竟是怎么一回事?带你完整复习一遍《操作系统》一书中有关内存的所有知识点-云社区-华为云》,作者:breakDawn。
1 内存管理的概念
  • 内存管理指操作系统对内存的划分和动态分配
  • 地址空间:
    逻辑地址空间: 相对地址,从0开始编址
    物理地址空间: 地址转换的最终地址
程序运行时
编译: 把源代码编译成目标模块
链接: 把目标模块、库函数链接成1个装入模块
链接属于形成进程逻辑地址的过程
装入:
绝对装入: 编译时就确定了装入地址
可重定位装入: 根据内存情况,把程序装到适当位置
运行时动态装入:运行前才真正把程序装起来(前面2个都是先分配,再装,再运行)
2 内存防溢出机制
即怎么防止内存越界
  • 设置上下限寄存器:
    存放内存中该进程的 上下限地址
    每次访问时,判断是否越界
重定位+界地址:
重定位寄存器——存放物理地址的最小地址
界地址寄存器——存放逻辑地址的最大值
先把访问地址(相对地址) 与界地址比较是否越界
再加到重定位寄存器上,作为物理地址
min + x,且x <max,这样保证地址在min到min+max之内
3 内存分配机制
3.1 连续分配内存
连续分配指 为用户程序分配的内存空间一定是连续的
3.1.1 单一连续:
内存分为系统区和用户区2个区
每次用户区只能放1个程序,这样可确保不会越界
3.1.2 固定分区分配
用户区分成若干个大小的分区,每个分区只能装一个作业 。
程序如果大了会装不下
程序小了则有内存碎片
3.1.3 动态分区分配
程序装入内存时,按照所需大小动态生成1个分区 。有多少碎片空间就给多少
可能会存在碎片,比如中间的进程结束了,于是中间就空出来一个内存碎片,而可能因为太小,其他进程帆布进来 。
动态分配策略:
  • 首次适应: 从上往下找第一个满足的分区——最简单也最好
  • 最佳适应: 找一个大小差距最小的分区——最烂,碎片最多
  • 最坏适应: 直接找最大的分区转入
  • 邻近适应: 从上次查找位置开始找,而不是从第一个碎片位置开始找 。——末尾碎片会很多
3.2 非连续内存分配
非连续指进程内存可以 分成不同地址存放,不一定全部集中在一起 。
3.2.1 分页
把内存划分成固定大小的块,进程以块为单位申请多个不同位置的块作为空间 。
  • 页表:
    每个进程PCB中会有一个页面寄存器PRT,告知页表的起始位置和起始长度
    找到页表后,页面中会告知你所持有的页号和偏移 。
    通过 页号 * 块大小 + 偏移,可知道这段内存的起始位置 。
进程每次想通过虚拟地址去定位物理地址时,都需要先去页表中找到虚拟地址对应的页,然后再得到物理地址 。
  • 快表TBL(Translation Lookaside Buffer )):
    为了避免每次斗取页表换算地址,快表会缓存 虚拟地址->物理地址的直接映射,加快速度
  • 多级页表
    地址空间超级大,1页装不下怎么办?
    用多级
    一级页表指明二级页表的地址
    二级页表再去实际地址
    这样就可以有多页了 。

操作系统内存知识点

文章插图
操作系统内存知识点

文章插图
3.2.2 分段

推荐阅读