操作系统哲学原理(14)内存原理-段式内存管理

2023-11-18

说明:该系类文章更多的是从从哲学视角看 操作系统 这门学科。同时也是 操作系统的学习笔记总结。因为博主 这些年主要是以研究安卓系统和 嵌入式Linux为主,因此这个系类文章也是这两个领域不可或缺的基石之一,尤其是对操作系统感兴趣的伙伴可特别关注。


14 段式内存管理

14.1 分页系统的缺点

分页系统整体上是将交换系统的缺陷全部避免了;但是本身仍然有一些缺陷:

  • 共享困难:一个页面只要有一行地址不共享,整个页面就是不共享的。
  • 一个进程只能占用一个地址空间:即一个程序的大小至多只能和虚拟空间一样大。

要想满足上面两个要求,分页系统只用一个虚拟空间是解决不了这个问题的;因此需要新的管理模式:分段管理系统。

14.2 分段管理系统

分段管理:将一个程序按照逻辑单元分成多个程序段。每个段使用自己独立的虚拟地址空间。这样程序段就不会发生空间增长时碰到另一个段的问题(如果某个数据结构超过了虚拟地址的空间,程序执行仍会失败,但是这种概率已经很低了)。纯粹分段与逻辑分段比较如图所示:

图1 纯粹分段与逻辑分段比较
  • 纯粹分段:基本内存管理的一段式管理。
  • 逻辑分段:一个程序分为多个段的分段管理。

在分段管理模式下,一个程序占据多个虚拟空间,一个虚拟地址将由段号和段内偏差两个部分构成。如图所示:

图2 分段管理下 虚拟地址由段号和段内偏差两部分组成

分段管理的实现手段:逻辑分段有多个段,因此需要一组基址与极限,如图所示:

图3 逻辑分段的管理机制是一组存放在段表里的基址和极限

在逻辑分段情况下,每个虚拟地址可以加载到物理内存中的任何位置,只需要将加载后的基址和极限寄存器做以下调整即可,如图所示:

图4 逻辑分段下每一个虚拟段可以加载到内存的任何位置

如果需要某一段,就用这一段的基址来寻找,然后根据段号选择对应的段基址,将段内位移偏差加到基址上。翻译过程如下:

 

物理地址生成的过程如下所示:

图5 段式管理下物理地址生成示意图

整个过程中最重要的就是段表,和页表类似,但是由于段表很少,段的数量也很少,段的尺寸也很小。

注意:

  • 段号也要占用寻址位,只是段数很小,所占的位数不会超过3位,每个逻辑段可以使用的空间很大,但是不是一个完整的虚拟空间。
  • 如果想给一个段分配一个完整的虚拟空间,则将虚拟段号放在一个特殊的寄存器里面,即不占用寻址字位;或者将其隐含在指令的操作码里面(这样只要看到操作码就会知道所属段号)。

14.3 分段的优缺点

@1 逻辑分段的优点:

  • 编写程序空间大幅度增长:每个逻辑单元可以独占一个虚拟空间。
  • 共享方便:因为段是按逻辑关系来分。
  • 分段管理节省大量空间:对于稀疏的程序,空闲部分不用分配虚拟空间。
  • 上下文切换更加容易:因为段表很小。

@2 分段管理的缺点:

  • 外部碎片和一个段必须全部加载到内存。

@3 对于缺陷的解决方法:

  • 对程序中的段再进行分页,这样形成了段页式内存管理模式。

14.4 段页式内存管理

段页式管理:每个段分页;将分页和分段组合起来;同时获得分段和分页的优点,避免它们的缺点。(如果把每个段看做一个程序,则逻辑分段就相当于同时加载多个程序)

段页式内存管理的实现:由于段页式管理模式是在段里面分页,而每个段占住一个虚拟地址空间;因此一个程序将对应多个页表。在这里我们只需要将这些页表作为次级页表,而在次级页表上面增加一层段表(相当于多级页表里面的顶级页表)。由段号在段表里面获得所应使用的页表,然后在该页表里面查找物理页面号(由于TLB块表可以绕过段表和页表的查找,所以速度会加快),不过这里的快表必须将段号也包括进来,如图所示:

图6 段页式的页表管理与多级页表结构类似

段表里面包含的内容随着系统的变化而变化,不过一般都大同小异,这里拿multics系统举例说明,段表记录的内容如图所示:

图7 Multics 段表记录内容

对应页表的地址、段长、页面大小、保护标志等前面已经进行过说明;对于是否分页标志,它是用来表明该系统是否分页。0值表示分页,l表示不分页;如果不分页,那就是纯逻辑分段,即Multies支持不分页的分段管理。而当前的商用计算机均支持段页式内存管理模式。

14.5 段号是否占用寻址字位

段号往往不占用寻址位,采用的是以下两种方式:

  • 使用单独的寄存器来存放段号。
  • 将段号隐含在指令操作码里。

如果地址完全是页号与页内偏差构成,则地址可以放在任何地方,采用段号的目的就是为了区分页表。

14.6 否定之否定的嵌套-纯粹分段与逻辑分段、分页与段页

从纯粹分段到分页、逻辑分段、段内分页的演变过程,流程如下:

  • 人们根据直觉,将一个程序作为一整段来进行管理,从而形成了纯粹分段(固定加载地址、固定分区、非固定分区、交换)管理模式,也称为基本内存管理模式,这种模式由于直观,人人都能想到,曾经大为流行。
  • 但纯粹的分段存在重大缺陷。由于此种模式下一个程序只有一段,从而导致内存空间增长困难、外部碎片、程序不能超过物理内存容量、一个程序必须同时加载到内存才能执行(除非使用重叠)等诸多缺点。为了克服这些缺点,我们引人了页式内存管理模式。
  • 页式内存管理模式虽然克服了纯粹分段的一系列缺点,但又存在共享困难、一个程序只能在一个虚拟地址空间增长的问题。为了解决这个问题,我们引入了逻辑分段。逻辑分段是纯粹分段的否定之否定阶段。虽然都是分段,但已经不在一个层次上。逻辑分段将一个程序按逻辑关系分解为多个段,从而扩大了程序可以使用的虚拟地址空间并解决了共享难的问题。
  • 但逻辑分段终究还是分段,自然又将分段的缺点引入。而要克服这些缺点,自然又想到了分页。这样我们就来到了段页式管理模式。

内存管理模式经历了两次互相穿插的否定之否定过程,如图所示:

图8 纯粹分段-分页-逻辑分段-段页式的否定之否定 演变过程

这种方式推动了内存管理模式的进步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统哲学原理(14)内存原理-段式内存管理 的相关文章

  • JavaScript常用事件讲解

    声明 本人的所有博客皆为个人笔记 作为个人知识索引使用 因此在叙述上存在逻辑不通顺 跨度大等问题 希望理解 分享出来仅供大家学习翻阅 若有错误希望指出 感谢 事件流 事件流描述的是从页面接收事件的顺序 事件冒泡 事件开始由最具体的元素接收
  • c语言统计各类字符个数

    输入十个字符 统计其中英文字母 空格或回车 数字字符和其他字符的个数 7 43 统计字符分数 15 全屏浏览题目 切换布局 作者 颜晖 单位 浙大城市学院 本题要求编写程序 输入10个字符 统计其中英文字母 空格或回车 数字字符和其他字符的
  • mysql的索引 优化 前导列

    组合索引之 前导列 1 对于where子句中出现的列要想索引生效 会有一些限制 这就和前导列有关 2 所谓前导列 就是在创建复合索引语句的第一列或者连续的多列 比如通过 CREATE INDEX comp ind ON table1 x y
  • 第一个Node程序,Node入门

    第一个Node程序 在前面的所有内容中 我们编写的JavaScript代码都是在浏览器中运行的 因此 我们可以直接在浏览器中敲代码 然后直接运行 从本章开始 我们编写的JavaScript代码将不能在浏览器环境中执行了 而是在Node环境中
  • 位运算及其应用详解

    http blog chinaunix net uid 21411227 id 1826986 html 一 逻辑运算符 1 位与运算 1 运算规则 位与运算的实质是将参与运算的两个数据 按对应的二进制数逐位进行逻辑与运算 例如 int型常
  • 低代码发展史及现状

    做开发 真的一定需要写代码吗 这次真的轮到程序员革自己的命了 业内很多人都这样感叹 2019年见证了低代码 零代码市场的首次爆发 种种迹象似乎在提醒着我们 一个新的 风口 正在形成 Do developers really need to
  • NeRF项目LLFF 解决新场景pose生成的问题

    最近一直在做NeRF相关的项目 其中LLFF前向数据集 是NeRF常用数据集 本文讲下怎么对NeRF数据进行处理 几个重要的链接地址 github llff GitHub Fyusion LLFF Code release for Loca
  • upload-labs-2

    登陆第二关 查看代码 发现是文件类验证 抓包 修改为允许发现成功 放包
  • solr的三种提交方式

    三种solr提交索引的方式 1 commit 通过api直接commit 这样性能比较差 在我测试下 平均每条commit600ms HttpSolrServer solrServer new HttpSolrServer http loc
  • Docker安装mysql

    Docker安装mysql 查看镜像 下载镜像 启动容器 进入mysql数据库 查看镜像 docker search mysql 5 7 下载镜像 docker pull mysql 5 7 启动容器 可以直接执行这一步 一步到位 dock
  • APP自动化测试-8.移动端混合应用自动化测试

    APP自动化测试 8 移动端混合应用自动化测试 文章目录 APP自动化测试 8 移动端混合应用自动化测试 前言 一 webview 1 webview简介 2 webview判断 二 环境准备 三 脚本编写 1 启动被测应用 2 进入web
  • 2021最新 腾讯云添加二级域名

    0 什么是二级域名 二级域名也就是在顶级域名下的子域名 在国际顶级域名下 它是指域名注册人的网上名称 在国家顶级域名下 它是表示注册企业类别的符号 我国在国际互联网络信息中心 Inter NIC 正式注册并运行的顶级域名是CN 这也是我国的
  • 虚拟服务器实现方式,服务器实现虚拟主机的三种主要方式

    服务器实现虚拟主机的三种主要方式 内容精选 换一换 弹性云服务器 Elastic Cloud Server ECS 是由CPU 内存 操作系统 云硬盘组成的基础的计算组件 购买时通过选择实例规格 操作系统 虚拟私有云 登录鉴权方式等信息实现
  • VMware虚拟机跑Linux系统无/dev/fb0解决办法

    最近在做摄像头的视频采集显示与处理 需要用到Frame Buffer的图形显示 我们知道在Linux系统应用中 可以通 过对 dev fb0 操作把数据显示在屏幕上 比如摄像头的图像采集 可以通过设备名 dev video0 来打开摄像头
  • 华为OD机试 - 单词搜索(Java)

    题目描述 找到它是一个小游戏 你需要在一个矩阵中找到给定的单词 假设给定单词 HELLOWORD 在矩阵中只要能找到 H gt E gt L gt L gt O gt W gt O gt R gt L gt D连成的单词 就算通过 注意区分
  • linux密码过期前警告天数,linux更改用户的密码过期时间

    对于新添加的用户 用户密码过期时间是从 etc login defs中PASS MAX DAYS提取的 普通系统默认就是99999 而安全操作系统4 0是90 更改此处 只是让新建的用户默认密码过期时间变化 已有用户密码过期时间仍然不变 功
  • score在java中_java基础

    DOC执行 set classpath c java Hello 将类的查找路径指向了c盘 在运行时 会从c盘下开始查找 mian 方法是程序的主方法 在一个java程序中有且只能有一个main 方法 main method 之前必须加上p
  • 关于“访问映射网络驱动器提示 本地设备名已在使用中,此连接尚未还原”解决方法!...

    这几天单位2台电脑出现故障 其中一台作为内部部门范围内文件服务器 另外一台电脑连接该机器的共享文件夹 一直正常 就这几天突然出现 访问映射网络驱动器提示 本地设备名已在使用中 此连接尚未还原 的错误 网上查找资料发现一段说明公司客户端的电脑
  • SpringMVC系列(二)之常用注解介绍及参数传递说明

    目录 前言 一 SpringMVC常用注解 1 1 RequestParam 1 2 RequestBody 1 3 PathVariable 1 4 RequestHeader 二 SpringMVC的参数传递 2 1 基础类型传参 可以

随机推荐

  • Java的作用域

    Java的作用域 作用域是指变量能生效的区域范围 声明在不同地方的变量具有不同的作用域 而决定作用域的就是花括号的位置 同时还决定了变量名的可见性与生命周期 Java语言中 变量的类型主要有成员变量 静态变量 和局部变量三种 类的成员变量
  • VS2013编译64位OpenSSL(附32位)

    安装ActivePerl 这个没什么好说的 直接运行msi即可 编译OpenSSL 1 使用Visual Studio Tool中的 VS2013 x64 本机工具命令提示 来打开控制台 也可以打开一个控制台 然后进到 安装路径 Micro
  • OLED拼接屏:打破显示界限,在教育培训中有哪些应用展示?

    早在20世纪初 人们就开始梦想着能够拥有一种透明的屏幕 可以将信息直接显示在空气中 然而 直到现在 这个梦想才真正实现 老透明屏是一种新型的显示技术 它可以将图像和文字直接投射到空气中 使其看起来像是悬浮在空中一样 老透明屏的工作原理是利用
  • [114]python supervisor使用

    Supervisor 是基于 Python 的进程管理工具 只能运行在 Unix Like 的系统上 也就是无法运行在 Windows 上 Supervisor 官方版目前只能运行在 Python 2 4 以上版本 但是还无法运行在 Pyt
  • MQTT在解析一条消息时收不到其他消息

    前提说明 客户端发送两个topic消息 第一个消息依赖第二个消息传入的值 两个topic分别为topic1 topic2 业务说明 topic1消息订阅之后 进行相关业务处理 查库插库等操作 然后轮训redis等待10s redis中存的时
  • 除法取模(比赛常用)

    由费马小定理可推出 其中m为素数 那么 就可以变成 如果m太大 可以使用快速求正整数幂
  • 操作系统系列(二)——进程

    往期地址 操作系统系列一 操作系统概述 本期主题 操作系统进程 文章目录 1 异常 1 前言 异常控制流是什么 2 异常的处理过程 3 异常的分类 4 异常和进程的关系 2 进程 1 进程的概念 2 进程所做的事情 意义 1 逻辑控制流 2
  • Adobe Flash CS6 下载与安装教程

    文章目录 Adobe Flash CS6 简介 一 软件介绍 二 软件特点 三 新增功能 四 安装要求 1 Windows 2 Mac OS 一 Adobe Flash CS6 下载 自取 二 Adobe Flash CS6 安装 Adob
  • QquickWidget与QML交互 ,自定义信号

    在widget加载QML文件 在加载过程中把qml文件添加到资源文件 在Pro文件中添加 QT quickwidgets Qt qml 下面如何qml中的信号连接呢 查看QQuickWidget类 找到了rootObject 方法 这个返回
  • 华为性格测试的破解方法

    几个原则必须要遵守 1 表现出积极进取 乐观向上 不焦虑不紧张的形象 2 华为喜欢那种喜欢艰苦奋斗的人 所以要能吃苦耐劳不计较报酬 3 华为喜欢中庸 不要表现自己的特性 有自己性格可能会被刷掉 4 华为喜欢稳定的 稳定超过一切包括技术 包括
  • 谷歌chromeos_如何安装Chrome OS系统

    Chrome OS是由Google设计的基于Linux内核的操作系统 它源自免费软件Chromium OS 并使用Google Chrome网络浏览器作为其主要用户界面 因此 Chrome操作系统主要支持Web应用程序 谷歌于2009年7月
  • 修改mysql数据库的时区

    查看数据库时区 mysql gt show variables like time zone Variable name Value system time zone EST time zone SYSTEM 2 rows in set 0
  • 阿里弃用Hibernate,却用MyBatis,竟然是因为这个!

    最近一直在研究MyBatis源码 作为国内经常使用的持久层框架 其内部代码的设计非常优秀 比如在开发过程中 有能力对框架进行深度的定制化开发 解决BUG也更加得心应手 另外学习开发者是如何设计高扩展性 低耦合性的代码 便于在自己的开发场景中
  • 66W真的比60W充电更快吗?基于Charge pump Charger的快充方案分析

    智能手机发展至今 充电功率和电池续航一直是人们最为关注的问题之一 从早期的5V 1A和5V 2A的低瓦数快充 到后来的高压大电流和低压小电流两极分化 不同手机厂商都制定了自己的充电协议 如OPPO的VOOC vivo的Flash Charg
  • 【HBZ分享】Redis的热点key问题

    Redis是如何将数据落在某个Redis节点上的 通过crc16取模 不是hash算法 是校验一种算法 计算该key应该落到哪个hash槽 solt 上 一共16384个hash槽上 这些槽位会均匀分布在每个节点 上 注意 只有主节点才有槽
  • Qt生成随机数

    参考网址 https www it610 com article 5005396 htm https www cnblogs com bingcaihuang archive 2011 02 11 1951401 html 生成随机数主要用
  • vue监听缓存数据(localStorage)

    方法 可以重写localStorage的setItem方法 当调用setItem方法设置新值的时候 会new Event setItemEvent 用window dispatchEvent 这个方法来派发一个事件 让window去监听 以
  • 用Python实现AI声音克隆的原理和代码示例

    声音克隆是一种利用机器学习技术学习特定人说话的声音特征 并以此生成合成音频的技术 通常在语音合成和人机交互等领域有广泛的应用 下面是一个简单的Python实现示例 1 数据收集 首先 需要从多个不同说话人的语音数据集中收集原始音频数据 并将
  • __init__()方法和__new__()方法

    class A object def init self args kwargs print init A def new cls args kwargs print new A s cls return object new cls ar
  • 操作系统哲学原理(14)内存原理-段式内存管理

    说明 该系类文章更多的是从从哲学视角看 操作系统 这门学科 同时也是 操作系统的学习笔记总结 因为博主 这些年主要是以研究安卓系统和 嵌入式Linux为主 因此这个系类文章也是这两个领域不可或缺的基石之一 尤其是对操作系统感兴趣的伙伴可特别