原文连接:

本文作者: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. 计算 物理地址 = 页面基址 + 偏移量

分区管理

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

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

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

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

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

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

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

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

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


OS学习笔记1——分段与分页相关推荐

  1. 【OS学习笔记】三十三 保护模式九:分页机制对应的汇编代码之---用户程序代码

    本片文章是以下两篇文章: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 对应的用户程序汇编代码. ;代码清单16-2;文 ...

  2. 【OS学习笔记】三十二 保护模式九:分页机制对应的汇编代码之---内核代码

    本片文章是以下两篇文章: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 对应的内核汇编代码. ;代码清单16-1;文件名 ...

  3. 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述

    上几篇文章学习了任务切换相关知识,如下: [OS学习笔记]二十六 保护模式八:任务门-任务切换 [OS学习笔记]二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套 今 ...

  4. 【OS学习笔记】三十八 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----微型内核汇代码

    本文是以下几篇文章对应的微型内核代码汇编代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 保护模式十 ...

  5. 【OS学习笔记】三十七 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----主引导扇区代码

    本文是以下几篇文章对应的主引导扇区代码汇编代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 保护模式 ...

  6. 【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门

    上一篇文章学习了中断与异常的概念:[OS学习笔记]三十四 保护模式十:中断和异常区别 本片文章接着学习以下内容: 中断描述符表 中断门 陷阱门 1 中断描述符表 我们前面讲了无数次,在实模式下,是由位 ...

  7. 【OS学习笔记】三十四 保护模式十:中断和异常区别

    上几篇文章学习了分页机制的一些原理: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 今天继续学习保护模式下的关于中断与异 ...

  8. 【OS学习笔记】四十 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务二代码

    本文是以下几篇文章对应的微型动态加载的用户程序/任务二代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十 ...

  9. 【OS学习笔记】三十九 保护模式十:中断和异常的处理与抢占式多任务对应的汇编代码----动态加载的用户程序/任务一代码

    本文是以下几篇文章对应的动态加载的用户程序/任务一代码: [OS学习笔记]三十四 保护模式十:中断和异常区别 [OS学习笔记]三十五 保护模式十:中断描述符表.中断门和陷阱门 [OS学习笔记]三十六 ...

最新文章

  1. poj2728(最优比率生成树)
  2. 每天一个linux命令(29):chgrp命令
  3. python 装饰器 参数-Python装饰器(4)带参数的装饰器
  4. 为什么不采用“两次握手”建立连接呢?
  5. 【分享】Maven插件的源码下载(SVN)
  6. java网络编程(五)
  7. mynt product model: D1000-IR-120标定相机和IMU外参
  8. 自旋锁/互斥锁/读写锁/递归锁的区别与联系
  9. python random从集合中随机选择元素
  10. mysql sharding 方案_mysql sharding 方案 分库分表(sharding)系列(4)
  11. 解决 sublime text 3 there are no packages available for installation 错误
  12. Microsoft.Office.Interop.Excel 报错
  13. mac 安装homebrew 并替换清华镜像
  14. 定制10kV变压器感应雷直击雷击变压器加避雷器atp-emtp模型
  15. R语言t检验中手动计算t值和p值
  16. 大数据实战——微博舆情大数据分析
  17. 凯恩帝k1000ti参数设置_K1000TII标准程序调试参数说明
  18. python的sqlite3说明_python之sqlite3使用详解
  19. 抢走Salesforce大客户,国产CRM靠的不是运气
  20. 计算机主板手工,教你DIY一台笔记本(伪),简单粗暴成本低

热门文章

  1. win7如何设置wifi
  2. C# textbox控件输入字符串触发回车事件
  3. 亚太部分地区物联网资产实际暴露情况
  4. redis telnet连接失败,java连接超时 个人解决方法
  5. 虚幻4C++编程入门(搬运1)
  6. vue-cli 3.0之跨域请求devServer proxy代理配置
  7. java基于ssm+vue的人才简历求职招聘网站 elementui
  8. Spring MVC中文文档翻译发布
  9. 基于GIS的城市应急疏散方案的分析与研究
  10. 数字信号处理相关1(卷积(convolution)的几种解释)