OS学习笔记1——分段与分页

原文连接:

本文作者:Happysnaker 本文链接:https://www.cnblogs.com/happysnaker/p/15264905.html

存储器管理-动态分区分配算法_晓宜的博客-CSDN博客_动态分区存储管理算法

内存管理
连续不连续
基本分段
基本分页
段页式

碎片

内部碎片:已被分配 但内存太小不能再被使用

外部碎片:未被分配 但内存太小不能再被使用

外部碎片可以再被分配,可以通过紧缩将多个外部碎片合并成一个大的空闲空间再被使用,但成本较大。

虚拟内存

虚拟地址→物理地址的转化需要:基址寄存器 + 界限寄存器

基址:物理地址的起点

界限:是否访问非法地址

实际地址 = 虚拟地址 + 基址

分段内存

将整体空间分为不同段,每段有上述思想中的:基址寄存器 + 界限寄存器

逻辑地址:段号(段名)+ 段内地址(偏移)

寻址过程:

  1. 检查 段号 是否有效
    • 通过 段号 查找 段表寄存器 (段表开始的地址 + 段表长度)
    • 检查 段号+段表开始地址 >= 段表长度 → 越界中断
  2. 检查 段内地址 是否有效
    • 通过 段号,查找 段表 (段号 + 段长 + 基址)
    • 检查 段内地址 >= 段长 → 越界中断
  3. 计算 物理地址 :段表中 基址 + 段内地址 = 物理地址

特点: 

段内地址的位数决定段总大小,段总大小固定

起始地址固定

符合用户逻辑,利于保护和共享

分段使用的大小不确定,外部碎片多

分页管理

将空间分割成较小的,固定长度的分片,来避免外部碎片

32位程序,虚拟地址空间 2^32

页面大小 4kb

页表项大小 2^32/4kb = 2^20,需要20位地址表示,剩余12位为偏移

物理地址 = 页基址 + 页内偏移

为避免页表过大,可以使用多级页表

  • 上一级页表对应下一级页表的起始地址 + 设置一个标识位表示下一级页表是否存在
  • 当下级页表不存在(未被使用)时,下级页表将不用被加载进来,极大地减小了页表大小
  • 当页表中的每一级页表都设置为恰好装进一个页,将不会产生任何外部或内部碎片
  • 非线性页表,查找更复杂
  • 需要从内存加载多次,产生开销

地址转换:

计算机硬件,自动把地址空间的地址分为页号页内相对地址,通过页号在页表找到内存中的对应块号,计算 物理地址 = 块号 x 每一页的字节数 + 页内偏移地址。一般情况下,块的大小和页的大小是一样的。

分段的逻辑地址需要查两次表,要先根据段号确定是哪一段,但分页的页号与页内地址是定好的,直接根据偏移量计算物理地址即可。

所以分段逻辑地址是二维的,分页是一维的,物理地址是一维的。

段页式

为减少表开销,可以使用 分段+每段使用页管理,由于段仅保存已使用过的资源,因此可以保证每一个页都被使用。

并非是先从内存分段再分页。内存实际上还是采用分页,同一段内的“页”有可能分布在内存的任何地方,只是逻辑上同属于一“段”。

因此,同分页管理相同,不会有外部碎片,但页内会有内部碎片。

每个段描述符指向每段的页表:

段描述符结构如下:

虚拟地址:段号 + 段内地址(页号 + 偏移量

寻址过程:

  1. 依据 段号 找出段描述符。
  2. 检查该 段的页表 是否在内存中。
    1. 在,则找出位置;

    2. 不在,则产生段错误;

    3. 访问违反保护需求,则发出越界错误。

  3. 检查所请求的 段内页表的页表项 是否在内存中。

    1. 在,从页表中取出基址

    2. 不在,缺页中断。

  4. 计算 物理地址 = 页面基址 + 偏移量

分区管理 

使用 分区表(分区号 + 起始地址 + 长度 + 分配占用标志位)

固定大小分区:程序装入内存时从分区表中寻找合适、未被占用的的分区使用

不同大小分区:从空闲区表中寻找第一个>=所需要内存的分区,将所需要内存大小分配给程序使用,剩余大小仍然登记在空闲区表中(动态分配)

固定大小分区会有内部碎片产生,不同大小分区减少了内部碎片的产生。但不同的动态分区算法会有不同的外部碎片产生。

首次适应算法:空闲区地址从低到高(从小到大)排列,顺序查找。优先使用低地址空间,低地址部分可能出现很多外部碎片。

临近适应算法:空闲区地址从低到高(从小到大)排列,每次分配时从上次结束的位置开始查找。大小地址区被使用的概率相同,但有可能使得最终无大分区可用。

最佳适应算法:空闲区容量从小到大排列,顺序查找。优先使用更小的空间,会产生大量外部碎片。

最坏适应算法:空闲区容量从大到小排列,顺序查找。优先使用最大的连续空闲区,避免剩余空闲区太小,但可以导致之后的大进程没有分区可用。

最佳、最坏算法开销较大,因为在分区结束后可能需要对空闲区重新排序。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值