【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )

文章目录

  • 一、页式存储弊端 - 段式存储引入
    • 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 超出了 段界限 ;

这就导致 逻辑地址 转换为 物理地址 时 , 会出现 地址越界 ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/967496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统

随着物联网技术的飞速发展&#xff0c;物联网软件开发与应用方向成为了众多开发者关注的焦点。那么&#xff0c;如何在这个领域中脱颖而出呢&#xff1f;本文将为你提供一份详细的学习指南&#xff0c;帮助你从零开始&#xff0c;逐步掌握物联网软件开发与应用的核心技能。 一…

Linux——基础命令1

$&#xff1a;普通用户 #&#xff1a;超级用户 cd 切换目录 cd 目录 &#xff08;进入目录&#xff09; cd ../ &#xff08;返回上一级目录&#xff09; cd ~ &#xff08;切换到当前用户的家目录&#xff09; cd - &#xff08;返回上次目录&#xff09; pwd 输出当前目录…

OpenFeign远程调用返回的是List<T>类型的数据

在使用 OpenFeign 进行远程调用时&#xff0c;如果接口返回的是 List 类型的数据&#xff0c;可以通过以下方式处理&#xff1a; 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化&#xff0c;如果服务端返回的是 List的JSON格式数据&#xff0c;可以直接在 Feig…

向量数据库简单对比

文章目录 一、Chroma二、Pinecone/腾讯云VectorDB/VikingDB三、redis四、Elasticsearch五、Milvus六、Qdrant七、Weaviate八、Faiss 一、Chroma 官方地址&#xff1a; https://www.trychroma.com/优点 ①简单&#xff0c;非常简单构建服务。 ②此外&#xff0c;Chroma还具有自…

字符指针、数组指针和函数指针

1. 字符指针变量 1.1 简单例子 字符指针 char* 在C语言中主要由两种用法&#xff1a; 1.用于存放一个字符变量的地址。 2.用字符指针接收一个字符串。 这里并不是将整个字符串的地址存入 pstr 指针&#xff0c;指针变量 pstr 中存放的是常量字符串的首字符 h 的地址。 以一个…

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 作业控制相关概念作业状态&#xff08;一般指后…

JS宏进阶:XMLHttpRequest对象

一、概述 XMLHttpRequest简称XHR&#xff0c;它是一个可以在JavaScript中使用的对象&#xff0c;用于在后台与服务器交换数据&#xff0c;实现页面的局部更新&#xff0c;而无需重新加载整个页面&#xff0c;也是Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;…

怎么查看电脑显存大小(查看电脑配置)

这里提供一个简单的方法查看 winr打开cmd 终端输入dxdiag进入DirectX 点击显示查看设备的显示内存&#xff08;VRAM&#xff09; 用这个方法查看电脑配置和显存是比较方便的 dxdiag功能 Dxdiag是Windows的DirectX诊断工具&#xff0c;其主要作用包括但不限于以下几点&#…

优惠券平台(一):基于责任链模式创建优惠券模板

前景概要 系统的主要实现是优惠券的相关业务&#xff0c;所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能&#xff0c;这里先通过模拟的形式代替。后续如果需要后管展示&#xff0c;会重构该代码 UserInfoDTO userInfoDTO new…

【机器学习】数据预处理之scikit-learn的Scaler与自定义Scaler类进行数据归一化

scikit-learn的Scaler数据归一化 一、摘要二、训练数据集和测试数据集的归一化处理原则三、scikit-learn中的Scalar类及示例四、自定义StandardScaler类进行数据归一化处理五、小结 一、摘要 本文主要介绍了scikit-learn中Scaler的使用方法&#xff0c;特别强调了数据归一化在…

机器学习中过拟合和欠拟合问题处理方法总结

目录 一、背景二、过拟合(Overfitting)2.1 基本概念2.2 过拟合4个最主要的特征2.3 防止过拟合的11个有效方法 三、欠拟合&#xff08;Underfitting&#xff09;3.1 基本概念3.2 欠拟合的4个特征3.3 防止欠拟合的11个有效方法 四、总结五、参考资料 一、背景 在机器学习模型训练…

ABP框架9——自定义拦截器的实现与使用

一、AOP编程 AOP定义:面向切片编程&#xff0c;着重强调功能&#xff0c;将功能从业务逻辑分离出来。AOP使用场景&#xff1a;处理通用的、与业务逻辑无关的功能&#xff08;如日志记录、性能监控、事务管理等&#xff09;拦截器:拦截方法调用并添加额外的行为&#xff0c;比如…

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…

示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

记录IMX6ULL开发板上移植SQLite3并运行Qt程序

文章目录 概要移植SQLite3Qt程序部署实验现象 概要 基于上一章对使用Qt运行对应的实验实例来完成对用户使用ui界面完成对SQLite数据库的增删改查等操作。本文旨在对上一句节的Qt程序部署到IMX6ULL开发板&#xff0c;并且完成对SQLite数据库在IMX6ULL开发板上的移植。 移植SQ…

达梦数据库(DM)线程管理

目录标题 达梦数据库&#xff08;DM&#xff09;线程管理笔记一、DM 线程架构概述二、DM 主要线程类型及功能&#xff08;一&#xff09;监听线程&#xff08;二&#xff09;工作线程&#xff08;三&#xff09;IO 线程&#xff08;四&#xff09;调度线程&#xff08;五&#…

02.10 TCP之文件传输

1.思维导图 2.作业 服务器代码&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> …

Node.js 环境配置

什么是 Node.js Node.js 是一个基于 Chrome V8 JavaScript 引擎的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript。传统上&#xff0c;JavaScript 主要用于浏览器中的前端开发&#xff0c;而 Node.js 使得 JavaScript 也能够在服务器上执行&#xff0c;…

【办公类-53-04】20250209Python模仿制作2024学年第二学期校历

背景需求&#xff1a; 马上开学了&#xff0c;又要制作校历&#xff08;删划节假日&#xff09;。之前我都是用网络的图片&#xff0c;然后在PPT里修改。 存在问题&#xff1a; 网络校历是从周日开始的&#xff0c;但日常我们老师做教案&#xff0c;都是默认从周一到周五&…

KERL文献阅读分享:知识图谱与预训练语言模型赋能会话推荐系统

标题期刊年份Knowledge Graphs and Pre-trained Language Models enhanced Representation Learning for Conversational Recommender SystemsJournal of LaTeX Class Files2021 &#x1f4c8;研究背景 在数字时代&#xff0c;个性化推荐系统已经成为了我们生活的一部分。从电…