【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )
文章目录
- 一、页式存储弊端 - 段式存储引入
- 1、页式存储弊端 - 内存碎片
- 2、页式存储弊端 - 逻辑结构不匹配
- 3、段式存储引入
- 二、段式存储 简介
- 1、段式存储
- 2、段表
- 3、段表 结构
- 4、段内地址 / 段内偏移
- 5、段式存储 优缺点
- 6、段式存储 与 页式存储 对比
- 三、逻辑地址 的 合法段地址
- 1、合法 段地址 判断
- 2、合法 段地址 判断 - 案例
一、页式存储弊端 - 段式存储引入
1、页式存储弊端 - 内存碎片
页式存储 将内存划分为 固定大小的页 , 如果 进程所需内存大小 不是 页大小 的整数倍 ,
进程的最后一个 内存页 势必会存在 未使用的内存空间 , 这就 100% 造成了一个内存碎片 ;
页式存储 导致了 内存 的利用率降低 , 尤其在频繁分配小内存时该弊端 对系统性能的影响 会进一步放大 ;
如 : 内存页 大小 为 4KB , 进程需要 5KB 内存时 , 需分配 2 个内存页 ;
- 第一个内存页 的 4KB 内存空间 完全被使用了 ;
- 第二个内存页 的 4KB 内存空间 只使用 1KB , 浪费了 剩余的 3KB 内存空间 , 这就造成了 内存碎片 ;
2、页式存储弊端 - 逻辑结构不匹配
页式存储 按大小 考虑 内存划分 , 没有考虑 代码运行逻辑 ,
可能导致 逻辑结构不匹配 , 程序的 逻辑模块 可能被分散在不同物理页中 , 导致缓存局部性差 , 影响性能 ,
如 : 实际调用某个程序时 , 程序文件并不是正好切割成 n 块 ,
有可能将 程序的重要代码 切割到两个内存页中 ,
一个循环体 的 代码 恰好 被切割到两个不同的 内存页 中 ,
最坏情况下 每次循环 可能 都需要 将 磁盘中的数据 加载到 物理内存 中 ,
循环持续几百万次回导致系统开销很大 , 降低系统性能 ;
3、段式存储引入
为了解决 页式存储 的 逻辑结构不匹配 的 弊端 , 段式存储 将内存 按逻辑段 ( 代码段、数据段、堆栈段 ) 划分 , 每个 逻辑段 长度可变 , 独立分配内存 , 与程序的实际结构对应 ;
段式存储 通过 段表 进行内存管理 , 通过 段表 记录每个段的 基址 ( 起始地址 ) 和 界限 ( 长度 ) , 实现动态映射 ;
段式存储 的 内存段长度 由实际需求决定 , 避免 页式存储 的 固定内存页大小 导致的浪费 ;
二、段式存储 简介
1、段式存储
段式存储 ( Segmentation ) 是一种 内存管理技术 , 它 将程序的 内存空间 按 自然逻辑段(代码段、数据段、堆栈段等)划分 , 每个 内存段 具有独立的 地址空间 和 长度 ;
段式存储的设计目标是更好地反映 程序的 逻辑结构 , 提供更灵活的内存管理和更高的安全性 ;
2、段表
段式存储 主要靠 段表 进行 内存管理 ;
<font color=bluered段表 ( Segment Table ) 是段式存储管理中的核心数据结构,用于记录每个逻辑段的基址(起始地址)和界限(长度)等信息。
通过段表,操作系统可以将程序的逻辑地址转换为物理地址,并实现内存的权限控制和保护。
段表 的 三大作用 :
- 地址转换 : 将逻辑地址(段号 + 段内偏移量)转换为物理地址 , 逻辑地址 中的 段号 用于查找 段表 , 获取 段 的 基址 和 界限 ;
- 内存保护 : 段表中可以记录每个段的访问权限(如只读、可写、可执行), 在地址转换时 , 操作系统会检查访问权限 , 防止非法访问 ;
- 段的管理 : 段表记录了每个段的状态信息(如是否已加载到内存) , 便于操作系统管理内存 ;
3、段表 结构
段表 结构 :
- 段基址(Base Address): 段内存 在 物理内存 中的 起始地址 ; 用于将 逻辑地址 中的 段内偏移量 转换为 物理地址 ;
- 案例 : 段基址为 0x1000 , 段内偏移量为 0x200 , 则物理地址为 0x1200 ;
- 段界限(Limit): 段的长度(单位 : 字节) ; 用于检查段内偏移量是否合法 , 若偏移量超出段界限 , 则触发段错误(Segmentation Fault) ;
- 访问权限(Access Rights) : 段内存 的访问权限 , 用于实现内存保护 , 防止非法访问 ; 访问权限有以下三种 :
- 只读(Read-Only): 段内容只能读取,不能修改。
- 可写(Writable): 段内容可以修改。
- 可执行(Executable): 段内容可以作为代码执行。
- 存在位(Present Bit): 表示 段内存 中的数据 是否已经从 磁盘 加载到 内存中 ; 该字段用于处理段未加载的情况,触发缺段中断(Segment Fault)。
- 1: 表示段已加载到内存。
- 0: 表示段未加载到内存(可能被换出到外存)。
- 修改位(Dirty Bit): 表示段是否被修改过。用于页面置换算法,决定是否需要将段写回外存 , 最近 修改过的 段 不应该被置换到 外存 中 ;
- 1: 段已被修改。
- 0: 段未被修改。
共享位(Shared Bit): 表示段是否可被多个进程共享。用于实现内存共享,减少内存占用。 - 1: 段可共享。
- 0: 段不可共享。
- 保护位(Protection Bit): 表示段的保护级别 ; 用于实现内存保护,防止用户程序访问内核数据。保护级别有两个级别分别是 :
- 用户级(User Level): 普通用户程序可访问。
- 内核级(Kernel Level): 仅操作系统内核可访问。
- 扩展位(Extended Bits): 用于存储额外的信息,如段类型、段描述符类型等。提供更灵活的功能支持。
字段 | 含义 |
---|---|
段基址 | 段在物理内存中的起始地址。 |
段界限 | 段的长度(以字节为单位),用于检查段内偏移量是否合法。 |
访问权限 | 段的访问权限(如只读、可写、可执行)。 |
存在位 | 表示段是否已加载到内存中(1:已加载;0:未加载)。 |
修改位 | 表示段是否被修改过(用于页面置换算法)。 |
共享位 | 表示段是否可被多个进程共享。 |
保护位 | 表示段的保护级别(如用户级、内核级)。 |
扩展位 | 用于存储额外的信息(如段类型、段描述符类型等)。 |
4、段内地址 / 段内偏移
逻辑地址 由 段号 和 段内偏移 组成 , 一般写为 ( 段号 , 段内偏移 ) , 如 : ( 0 , 88 ) 表示 段号 为 0 段内偏移为 88 字节 ;
段内地址 , 又称为 段内偏移 , 加上段的 起始地址 / 基址 ( 查询段表所得 ) 就是 对应的 物理地址 ;
在 程序的作业空间 中 , 每个 内存段 都有自己的 逻辑起始地址 , 段 起始地址 + 段内地址 就是 逻辑地址 ;
5、段式存储 优缺点
段式存储 优点 :
- 减少内部碎片: 段长度由实际需求决定,避免 固定页大小导致的 内部碎片 浪费。
- 逻辑结构匹配: 支持按段设置权限(如代码段只读、数据段可写),提升安全性。提高缓存和内存访问的局部性。
- 内存灵活共享: 共享时可直接 共享整个段(如共享代码库)。
段式存储 缺点 :
- 外部碎片(External Fragmentation): 由于段长度可变,频繁分配/释放会导致内存中出现大量不连续的小块空闲区域。需通过内存紧凑(Compaction)整理碎片,但开销较大。
- 内存分配复杂度: 动态管理可变长度段需要 更复杂的算法(如首次适应、最佳适应)。
6、段式存储 与 页式存储 对比
段式存储 与 页式存储 对比 :
- 页式存储: 把进程地址空间分成固定大小的页,与物理内存的页框映射,避免外部碎片,但可能有内部碎片。
- 段式存储: 按逻辑划分进程地址空间,每段大小不同,适应性强,但可能有外部碎片。
对比项 | 页式存储 (Paging) | 段式存储 (Segmentation) |
---|---|---|
基本单位 | 页 (Page) | 段 (Segment) |
地址结构 | 页号 + 页内偏移量 | 段号 + 段内偏移量 |
分配方式 | 物理内存划分为固定大小的页 | 物理内存划分为不同大小的段 |
地址连续性 | 进程的逻辑地址空间不连续 | 逻辑地址空间是连续的 |
内存管理 | 采用页表(Page Table)映射 | 采用段表(Segment Table)映射 |
外部碎片 | 无外部碎片,但有内部碎片 | 可能产生外部碎片 |
内部碎片 | 可能有内部碎片(页不足时) | 无内部碎片 |
存储灵活性 | 固定大小,适合动态分配 | 变长,适合按需求分配 |
适用场景 | 操作系统内存管理、虚拟内存 | 代码、数据、栈分段存储 |
三、逻辑地址 的 合法段地址
1、合法 段地址 判断
软考 中 针对 段式存储 知识点 考察的是 逻辑地址 的 合法段地址 判断 ;
逻辑地址 由 " 段号 + 段内偏移 " 组成 , 一般使用 ( 段号 , 段内偏移 ) 表示 ,
如 : ( 0 , 99 ) 表示 段号 0 段内偏移 99 字节 ;
合法 段地址 的 段内偏移 在 段界限 ( Limit , 段的长度 ) 之内 ;
非法 段地址 的 段内偏移 超出了 段界限 ;
以下面的段表为例 :
应用程序 作业空间 的 段号为 0 的 段 , 对应 逻辑地址 , 该段 的 段界限 ( 段长 ) 为 30KB ,
逻辑地址 ( 0 , 25 ) , 段号 0 , 段内偏移 25KB , 小于 段界限 30KB , 该逻辑地址 就是 " 合法 " 的 逻辑地址 ;
逻辑地址 ( 0 , 35 ) , 段号 0 , 段内偏移 35KB , 大于 段界限 30KB , 该逻辑地址 就是 " 非法 " 的 逻辑地址 ;
2、合法 段地址 判断 - 案例
下图 是 某进程 的 段式内存管理 的 段表 :
逻辑地址 使用 ( 段号 , 段内偏移 ) 表示 ;
段号 0 的逻辑地址 段内偏移 只能是 0 ~ 799 , 段内偏移 大于等于 800 就是非法地址 ;
段号 1 的逻辑地址 段内偏移 只能是 0 ~ 49 , 段内偏移 大于等于 50 就是非法地址 ;
段号 2 的逻辑地址 段内偏移 只能是 0 ~ 199 , 段内偏移 大于等于 200 就是非法地址 ;
段号 3 的逻辑地址 段内偏移 只能是 0 ~ 579 , 段内偏移 大于等于 580 就是非法地址 ;
段号 4 的逻辑地址 段内偏移 只能是 0 ~ 99 , 段内偏移 大于等于 100 就是非法地址 ;
逻辑地址 ( 0 , 999 ) 是 非法的 逻辑地址 , 不能转换为对应的 物理地址 ,
因为 段号 0 的 段界限 / 段长 为 800 字节 , 段内偏移 999 超出了 段界限 ;
这就导致 逻辑地址 转换为 物理地址 时 , 会出现 地址越界 ;
相关文章:

【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )
文章目录 一、页式存储弊端 - 段式存储引入1、页式存储弊端 - 内存碎片2、页式存储弊端 - 逻辑结构不匹配3、段式存储引入 二、段式存储 简介1、段式存储2、段表3、段表 结构4、段内地址 / 段内偏移5、段式存储 优缺点6、段式存储 与 页式存储 对比 三、逻辑地址 的 合法段地址…...

PDF另存为图片的一个方法
说明 有时需要把PDF的每一页另存为图片。用Devexpress可以很方便的完成这个功能。 窗体上放置一个PdfViewer。 然后循环每一页 for (int i 1; i < pdfViewer1.PageCount; i) 调用 chg_pdf_to_bmp函数获得图片并保存 chg_pdf_to_bmp中调用了PdfViewer的CreateBitmap函数…...
HTML之JavaScript运算符
HTML之JavaScript运算符 1.算术运算符 - * / %除以0,结果为Infinity取余数,如果除数为0,结果为NaN NAN:Not A Number2.复合赋值运算符 - * / %/ 除以0,结果为Infinity% 如果除数为0,结果为NaN NaN:No…...
借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略
目录 一、引言二、ListWise 方法概述三、ListWise 用于精排的优势四、ListWise 样本具体的构建过程4.1 确定样本的上下文4.2 收集候选物品及相关特征4.3 确定物品的真实排序标签4.4 构建样本列表4.5 划分训练集、验证集和测试集 五、ListWise 方法案例分析六、ListWise 方法在精…...

C++中什么时候用. 什么时候用->
学了一年C今天出了一个大岔子,因为太久没有做链表类型题目了,并且STL用惯了今天遇到一题,写的时候发现完全不对劲,搞慌了,首先我们看题目 2. 两数相加 再看我第一次的解答,先不论结果对不对 错的行为有很多…...

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…...
【Python深入浅出】Python3正则表达式:开启高效字符串处理大门
目录 一、正则表达式基础入门1.1 什么是正则表达式1.2 正则表达式的语法规则1.3 特殊字符与转义 二、Python 中的 re 模块2.1 re 模块概述2.2 常用函数与方法2.2.1 re.match()2.2.2 re.search()2.2.3 re.findall()2.2.4 re.sub() 2.3 修饰符(Flags)的使用…...
Vue.js Vue CLI 安装与使用
Vue.js Vue CLI 安装与使用 今天我们来聊聊 Vue CLI 的安装与使用。对于开发 Vue 应用来说,Vue CLI 是一个非常强大的工具,它能帮助你快速创建项目脚手架、配置开发环境、自动化构建流程,从而大大提高开发效率。下面我就和大家一步一步地讲解…...
科技的尽头:在有限与永恒的夹缝中寻找文明的真谛
当人类用燧石点燃第一簇文明之火时,科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程,既是人类突破生物局限的史诗,也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点,"科技尽…...

【牛客】动态规划专题一:斐波那契数列
文章目录 DP1 斐波那契数列法1:递归法2:动态规划法3:优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict,在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1:递归 // 递归 #include <iostream>…...
java8、9新特性
JAVA8 Lambda 表达式 (parameters) -> expression 或 (parameters) ->{ statements; } 提供了一种更为简洁的语法,尤其适用于函数式接口。相比于传统的匿名内部类,Lambda 表达式使得代码更为紧凑,减少了样板代码的编写。 它允许将函…...

作业:zuoye
1.闹钟(错的) #include "widget.h" #include "ui_widget.h" #include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 初始化定时器objTimer new QTimer(th…...
redis底层数据结构——链表
文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力,以及顺序性的节点访间方式,并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有…...
问题解决 4S 法
在深入研读《像高手一样解决问题》的第二章后,犹如打开了一扇通往高效问题解决领域的新大门,其中所阐述的问题解决 4S 法,更是给人以拨云见日之感。 一、陈述(State):明确问题本质 这是问题解决的起始点&…...
SQL-leetcode—1407. 排名靠前的旅行者
1407. 排名靠前的旅行者 表:Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表:Rides -------------------…...

机器学习(李宏毅)——Transformer
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention,可参阅我上一篇。 二、大纲 Transformer问世原理剖析模型训…...

React进阶之React状态管理CRA
React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef(不建议使用) CRA 状态管理 理论讲解 如何针对 effect -> 对action的触发 -&…...
攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图
引言 当我决定考取AWS认证机器学习工程师 - 助理(AWS Certified Machine Learning Engineer — Associate)级别证书时,我就预料到这将是一段充满挑战但回报颇丰的旅程。跟你说吧,它在这两方面都没让我失望。这项考试面向的是不仅理解机器学习原理,还对AWS生态系统有扎实基…...
前端开发环境
vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西,就说明好了 …...

Web自动化测试—测试用例流程设计
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1.3、自动化测试…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...