【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )
文章目录
- 一、页式存储弊端 - 段式存储引入
- 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、自动化测试…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
