操作系统—分段与分页

2023-05-16

1. 地址重定位

所谓的地址重定位(也叫地址翻译)就是修改程序中的内存地址,使得程序被载入内存后,那些地址能够指向正确的内存空间。

例如,程序中包含 call 40 语句,如果程序被加载到内存地址 1000 处,则需要修改 401040

  • 编译时重定位:在程序编译时进行地址重定位,此时需要预先知道程序将被加载到内存空间的哪个部分。
  • 载入时重定位:在加载程序进内存时执行地址重定位。
  • 运行时重定位:在执行每条指令时执行地址重定位。

2. 分段

分段就是在整体上将一个程序分为多个段,如,代码段、堆段、栈段等。这样加载程序时就可以分别加载每个程序段。且每个段位于内存中的不同地方,物理上不必连续。此外,每个段的长度可以不同,也可以在运行时动态变化,如,堆段、栈段。

如果不将程序分段,则载入时需要一次性将整个程序加载到一片连续的物理内存中。如果无法在内存中找到一片满足所需大小的连续内存空间,则无法运行该程序。此外,随着进程的运行,其所需的内存空间越来越多,如果此时无法满足所需大小的连续内存空间,则需要将整个程序移至其它合适的地方。

每个段在逻辑上都是从 0 开始编址的,且其地址空间也是连续的。此外,每个段也可以有不同的保护级别,如,只读、可读写等。进程会通过段表来维护每个段(段号)的基址、长度、保护级别等信息。

虚拟内存就是用户(即,程序员)所看到、进程所使用的内存视图。在引入虚拟内存之后,分段机制是作用于虚拟内存上的,即,虚拟内存(不再是物理内存)会被划分为多个段。

在这里插入图片描述


3. 分页

因为每个段的大小各不相同,如果以段为单位来管理内存,则很容易产生大量的内存碎片。当然,可以使用内存紧缩(compaction)的方式来合并这些内存碎片,但在内存紧缩期间,每个段的起始地址都会改变,所以,此时用户进程都会处于挂起的状态,而且内存紧缩通常需要花费较长的时间。

分页机制就是将物理内存分为许多大小相同的页框(page frame,也叫页帧),如,大小为 4KB。然后以页框为单位来管理内存。此时,处于段间的内存碎片会转移到页框内部,但一个内存碎片总会小于页框的大小。

分页机制也会把虚拟内存划分为一系列大小相同的(page),页的大小和页框的大小相同。虚拟内存的大小可以大于实际的物理内存空间,因此,页的数量可以多于页框的数量。通常,每个进程都会维护一个属于自己的页表,以维持页到页框的映射关系。

因为页的数量可以大于页框的数量,因此就会存在多个页映射到同一个页框的情况。此时可以使用内存交换技术来解决此问题:

  • 换出(swap out):将页框中的数据保存到磁盘中,同时设置页表中的相应表项为无效,之后该页框便空闲出来了。
  • 换入(swap in):加载磁盘中的页框数据至指定页框中,然后设置页表中的相应表项。

如果虚拟内存过大、页过小,则会导致页表项过多、页表过大的情况。例如,设虚拟内存的大小为 4GB(32位地址),页大小为 4KB,则一共存在 4 G B / 4 K B = 2 20 4GB/4KB = 2^{20} 4GB/4KB=220 个表项,如果每个表项的大小为 4B,则页表的大小为 2 20 × 4 B = 4 M B 2^{20} \times 4B = 4MB 220×4B=4MB。此外,为了加速页表项的查找过程,需要保证页表所占内存空间是连续的(类似于数组,直接根据页号来定位页表项)。此时可以使用多级页表技术来解决此问题。此处以二级页表为例。

  • 页大小仍为 4KB,即页内偏移字段将占用地址的12比特;
  • 余下20比特中,前10比特用于一级页表(也叫页目录),后10比特用于二级页表;则一级页表、二级页表各有 2 10 2^{10} 210 个页表项;
  • 每个页表项的大小为 4B,则一级页表、以及每个二级页表的大小为 2 10 × 4 B = 4 K B 2^{10} \times 4B = 4KB 210×4B=4KB
  • 一级页表中的每个项分别指向下一级页表,此时允许不同的页表放在不同的内存位置,而不必物理上连续;
  • 另外,每个页目录项都有一个存在位,以指示该项指向的页表是否存在;如果程序所需的内存较少,则不会有很多的二级页表存在,从而能够减少页表所占的总的内存空间;
  • 对应的地址翻译过程是:首先根据虚拟地址(也叫线性地址)的前10比特在页目录中找到对应的目录项,从而找到相应页表的基址;然后根据之后10比特在相应页表中找到对应的页表项,从而得到对应的页框号;最后拼接页框号和页内偏移,即可得到对应的物理地址。

多级页表的缺点是增加了地址翻译过程所需的页表项查找次数(内存访问次数)。为了解决此问题,可以使用 TLB(Translation Lookaside Buffer)技术,也就是根据引用局部性原理,将某些地址对应的 页号 -> 页框号 的映射关系给缓存下来。之后进行地址翻译前,总是先查看 TLB 是否命中,如果不命中,则继续使用正常的地址翻译过程。

在这里插入图片描述

4. 总结

因此,一个程序在整体上被分为多个段,一个段又会占用多个页,且一个段对应的页框在物理内存上是可以离散的,而不必连续。

在启用分段和分页机制的情况下,地址的翻译过程是: 逻 辑 地 址 → 虚 拟 地 址 → 物 理 地 址 逻辑地址 \rightarrow 虚拟地址 \rightarrow 物理地址

  • 逻辑地址 → 虚拟地址 \textbf{逻辑地址} \rightarrow \textbf{虚拟地址} 逻辑地址虚拟地址:逻辑地址就是 段号:段内偏移 的形式,如,逻辑地址 cs:ip 指向代码段内当前正在执行的指令。逻辑地址通过段表(分段)映射为虚拟地址,即,段基址 + 段内偏移。虚拟地址具有 |页号|页内偏移| 的形式(如果是二级页表,则具有 |页目录号|页号|页内偏移| 的形式)。
  • 虚拟地址 → 物理地址 \textbf{虚拟地址} \rightarrow \textbf{物理地址} 虚拟地址物理地址:虚拟地址通过页表(分页)映射为物理地址。物理地址具有 |页框号|页内偏移| 的形式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统—分段与分页 的相关文章

  • Centos7下使用CMake

    在进行需要提供跨平台服务的项目时 xff0c 最好有相应的跨平台项目构建工具 本文所述的CMake即其中比较好用的跨平台构建工具之一 下文主要以C 43 43 语言为例进行使用演示 安装C 43 43 所需的环境 xff1a yum ins
  • 树莓派+神经计算棒2实时人脸检测

    树莓派配置摄像头 sudo apt get install python opencv sudo apt get install fswebcam 配置摄像头 sudo nano etc modules 查看树莓派CPU型号 cat pro
  • 学习总结-编写自己的CMakeLists.txt

    cmake minimum required span class token punctuation span VERSION span class token number 3 3 span span class token punct
  • 7.4V锂电池USB平衡充电器 串联锂电池充电器

    7 4V锂电池USB平衡充电器 串联锂电池充电器 本文介绍一种简单实用的串联锂电池充电器 大家知道 xff0c 串联电池的充电 xff0c 是一个麻烦的问题 如果直接拿7 4V来充 xff0c 可能会因为两颗电池的参数差异 xff0c 会导
  • 【Echarts】数据可视化完成大屏地图(拓展乡镇地区)的绘制

    绘制地图要素 地图边缘 地理位置 xff08 中心点或者自定义的未知 xff09 echarts绘制 实现在前 成品展示放在最后 代码太长 xff0c 参考代码可见Github Github地址 获取地图 获取精确到乡镇街道的地图JSON数
  • K8s问题【flannel一直重启问题,CrashLoopBackOff】

    kubectl describe 命令查看 Events Type Reason Age From Message Normal Scheduled 13m default scheduler Successfully assigned k
  • Python openpyxl库

    1 读写单元格 span class token keyword from span openpyxl span class token keyword import span load workbook wb span class tok
  • 子网掩码

    子网掩码 subnet mask 是每个网管必须要掌握的基础知识 xff0c 只有掌握它 xff0c 才能够真正理解TCP IP协议的设置 以下我们就来深入浅出地讲解什么是子网掩码 IP地址的结构 要想理解什么是子网掩码 xff0c 就不能
  • AS学习网址大全

    都是我在学习过程中精心收集的 xff0c 大部分为国内网站 xff0c 绝对是您学习AS最好的去处 本贴于2010年3月22日再次更新 xff0c 并新加了很多好的网站 1 同时将网址全都贴出来 xff0c 方便不想下载的朋友使用 2 附件
  • 紧耦合和松耦合有什么区别

  • 我的大一学习生活总结

    今天最后的一科英语考完了 xff0c 但此刻的我并不觉的轻松 xff0c 我知道从现在开始就标志着我的大一已经结束了 xff0c 在大学仅有的四年时光就过去了四分之一 回想起大一这一年 xff0c 自问一下我到底学到了什么 xff1f 我发
  • 阿里云导出raw文件如何还原查看及centos7系统密码破解

    1 Raw格式转换 1 1 格式介绍 目前阿里云ecs镜像文件的导出格式默认为 raw tar gz xff0c 解压后为 raw格式 raw为最原始的虚拟机镜像文件 xff0c vmdk是vmware Virtual Box的虚拟机镜像文
  • 5.33 综合案例2.0 -ESP32拍照上传阿里云OSS

    综合案例2 0 ESP32拍照上传阿里云OSS 案例说明连线功能实现1 阿里云平台连接2 OSS对象存储服务3 ESP32 CAM开发环境4 代码ESP32 CAM开发板代码HaaS506开发板代码 测试数据转图片方法 案例说明 使用ESP
  • 'grep' 不是内部或外部命令,也不是可运行的程序或批处理文件

    使用 grep 来过滤 xff1a adb shell pm list packages grep qq 然后就报了 39 grep 39 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 xff0c 后来发现根本不是grep
  • 一个程序员的一生

    一个程序员的一生 作者 佚名 我在程序员的时候 xff0c 我一开始追逐这个API怎么用 xff0c 数据库SQL怎么写更优化 xff0c Dcom技术的细节 xff0c 然后我发现我写出来的产品为了符合客户 需求必须要大量修改 xff0c
  • 搭建Ubuntu Samba服务器(超简单)

    1 xff09 安装samba服务 sudo apt get install samba 2 xff09 配置samba sudo vim etc samba smb conf share comment 61 myshare path 6
  • Nginx-配置HTTPS证书(单向认证)

    目录 一 生成 CA 私钥 1 生成一个 CA 私钥 ca key 二 生成CA 的数字证书 1 生成一个 CA 的数字证书 ca crt 三 生成 server 端数字证书请求 1 生成 nginx 端的私钥 nginx key 2 生成
  • 数据结构—B+树

    1 约束 B 43 树的约束与 B 树类似 xff0c 一棵 m m m 阶 B 43 树具有如下特点 xff1a xff08 1 xff09 根节点要么是一个叶节点 xff0c 要么至少具有两个孩子节点 xff1b xff08 2 xff
  • 服务端三种方式实现单设备登录

    单设备登录 xff0c 顾名思义 xff0c 一个账号在一个app中只能在一个设备上进行登录 使用的场景例如 xff1a 账号多端登录时云存档的一致性问题 单设备登录常用的方法 xff1a 1 web端 xff0c session 43 c
  • go 管道简单入门及注意事项:管道创建,发送、接受数据,管道关闭

    1 使用make命令创建channel span class token comment 未设置缓冲区 xff0c 只能放一个 xff0c 不读取再次赋值则会阻塞 span c1 span class token operator 61 s

随机推荐

  • java 生成grpc调用service

    1 安装protoc 这里以mac为例 xff1a brew install automake brew install libtool brew install protobuf 检查 protoc version 2 下载protoc
  • go微服务框架Kratos简单使用总结

    Kratos是B站开源的一款go的微服务框架 xff0c 最近PS5上的 战神 诸神黄昏比较火 xff0c 主角就是奎托斯 这个框架的名字就取自他 在进行框架选型时 xff0c 对比了目前主流的很多go微服务框架 xff0c 如Zero x
  • Gradle重新安装后下载插件失败 Read timed out 问题解决

    究极大坑记录 在使用gradle进行构建kotlin项目时 xff0c 项目所用依赖版本需要同步升级gradle版本 升级gradle版本后 xff0c gradle相关插件无法下载 xff0c 反复timeout超时 症状如下 xff1a
  • Jenkins启动失败:Failed to start LSB: Jenkins Automation Server.

    启动systemctl start jenkins service提示 Job span class token keyword for span jenkins service failed because the control pro
  • 最新版 Let’s Encrypt免费证书申请步骤,保姆级教程

    最近将域名迁到了google domain xff0c 就研究了一下Let s Encrypt的域名证书配置 发现网上找到的教程在官方说明中已经废弃 xff0c 所以自己写一个流程记录一下 步骤方法官方文档见 xff1a https eff
  • git 加速代理设置,单仓库设置代理,指定仓库设置单独代理

    1 git全局设置代理 git config global https proxy http 127 0 0 1 7890 git config global https proxy https 127 0 0 1 7890 取消的命令 x
  • 软件系统设计细节,你不知道的13个实践经验!

    记录道具来源等的 source 字段时 xff0c 可以使用 xff08 类名 43 方法名 xff09 xff08 包名 43 方法名 xff09 的组合 xff0c 可以清晰地区分来源 并且可以灵活地增加新的渠道 动作 涉及金额 钱的字
  • 从typro到Obsidian

    使用了typro 3年有餘 xff0c 最近看到yukang的年終博客 xff0c 又一次提到了Obsidian這個軟件 很久沒有還編輯工具的我 xff0c 想要折騰一下 於是 馬上開始 xff01 第一步 xff0c 啥也不知道 xff0
  • C++线程

    1 创建线程 span class token macro property span class token directive hash span span class token directive keyword include s
  • OpenGPT的11种高效用法

    1 问答提示 2 解释复杂的概念 3 创作 创作需要尽可能的缩小范围 xff0c 提出具体的要求 xff0c AI会给出更好的答案 4 准备面试 5 教师教案 6 编码和集成 7 健身 8 送礼推荐 9 翻译 这个甚至不用去演示 xff0c
  • 浅析鹅鸭杀中服务端的技术实现和要点

    在朋友的介绍下 xff0c 我下载了这款游戏 由于之前玩过 Among Us xff0c 我本以为这款游戏不会达到正宗的太空狼人杀的水平 xff08 毕竟是免费的 xff09 但实际游玩后 xff0c 我被它更加丰富的设定和玩法所吸引 接下
  • nginx代理静态网站css解析异常

    今天在使用ecs进行部署网页时 xff0c 出现了一个问题 使用nginx代理到页面index html路径下 xff0c 同路径的资源都可以加载到 xff0c 但是却无法正确加载到页面样式 打开f12 xff0c 网络和控制台都没有资源异
  • 为什么mysql的delete操作不释放磁盘空间

    在 InnoDB 中 xff0c delete 操作并不会真的删除数据 xff0c mysql 实际上只是给要删除的数据打了标记 xff0c 标记为删除 磁盘所占空间不会变小 xff0c 即表空间并没有真正被释放 一 MySQL 删除数据几
  • docker start :FAIL Hypervisor framework fails

    mac 上启动 Docker 提示 FAIL Hypervisor framework fails 提示环境变量出错 我这台 mac 是自己攒的生产力 xff0c 由于软件是直接从旧的 mac 上迁移过来的 xff0c 我怀疑可能是系统版本
  • 在google设置静态页面 CDN加速

    一 创建bucket xff0c 设置bucket 链接 xff1a https console cloud google com storage browser 创建bucket 设置bucket公开访问 在bucket列表中 xff0c
  • Google Cloud Storage CORS跨域允许,忽略访问控制来源标头

    google storage origin https xxx com has been blocked by CORS policy No Access Control Allow Origin header is present on
  • 聊天记录存储实践

    公司的某款游戏在1月初接入微软小冰AI聊天功能 为了保存聊天记录并为后续的统计功能做好准备 xff0c 决定将聊天记录存放在服务端 最初并不清楚聊天数据量的大小以及玩家对聊天功能的使用情况 xff0c 所以采用了价格和性能相对宽容的MySQ
  • 将本地服务通过ssh代理给外部访问(如何使用 ssh 将本地服务代理给外部访问并保持 SSH 会话的连接性)

    如何使用 ssh 将本地服务代理给外部访问并保持 SSH 会话的连接性 1 外部服务器 nginx 配置 server span class token punctuation span listen localhost 80 span c
  • Go 单元测试高效实践

    敏捷开发中有一个广为人知的开发方法就是 XP xff08 极限编程 xff09 xff0c XP 提倡测试先行 xff0c 为了将以后出现 bug 的几率降到最低 xff0c 这一点与近些年流行的 TDD xff08 测试驱动开发 xff0
  • 操作系统—分段与分页

    1 地址重定位 所谓的地址重定位 xff08 也叫地址翻译 xff09 就是修改程序中的内存地址 xff0c 使得程序被载入内存后 xff0c 那些地址能够指向正确的内存空间 例如 xff0c 程序中包含 call 40 语句 xff0c