操作系统——内存段式和段页式管理

news2024/12/22 10:43:16

目录

一、为什么要有段式管理?

二、段式管理的实现原理

1、段式虚拟空间

2、段式管理的内存分配与释放

3、段式管理的地址变换

(1)段表

(2)动态地址变换

4、段的共享与保护

(1)共享

(2)保护

四、段式管理的优缺点

五、段页式管理

1、为什么会有段页式管理?

2、段页式管理的实现原理

(1)虚拟地址的构成

(2)段表和页表

3、动态地址变换


一、为什么要有段式管理?

我们的程序在很多时候是需要共享的
例如我们写的头文件的代码就需要被其他文件共享
同时,一个开放文件的函数方法,也很可能要被其他文件调用
于是,这就提出了对程序和数据进行分享的要求
为了支持共享的需求,需要对内存采用特殊的管理方式
那么应该采取什么方式?
首先想到的是先前学到的分区式管理和页式管理
但是对这两种内存管理方式来说
很难实现程序和数据共享
为什么?
一、对分区式管理来说:
对于该种方法,内存分配的最小单位是一整个分区块
一整个进程的程序和数据都放在一个分区块中
共享只能对一整块进行共享,而不可能再进行分割
但是这是不现实的,不可能让某个进程的所有程序和数据都暴露

二、对页式管理来说:
内存分配的最小单位是页
似乎可以进行共享,例如把某几页共享出去
但是,也不现实
为什么
因为,一个完整的执行逻辑,可能程序和数据在不同页中
而且不同页的那个地方,也是不清楚的
因此,页式管理对程序和数据的共享也无法实现

综上,旧有的内存管理方式无法支持
如何?
只能寻求新的管理方式
于是,基于此,段页式管理应运而生
同时,段式管理的出发点,
就是以功能完整的逻辑段作为单位进行划分

二、段式管理的实现原理

1、段式虚拟空间

一个进程的虚拟空间为二维:段号s + 段内地址w
段号之间没有顺序管理(不同于页式的页号式有顺序的一维度结构)
段的长度不同,根据逻辑功能完整的程序和数据进行划分
例如:
一个进程的程序和数据被划分为:
程序段、子程序段、数据段和工作区

每个段是一个首地址为0的、连续的一维线性空间
根据需要,段的长度可以动态调整
对段式虚拟地址的访问包括两个部分:段名 + 段内地址

2、段式管理的内存分配与释放

以段为单位分配内存,每段是一个连续的内存区
同一进程所包含的各段之间不要求连续

进程申请段内存时,有两种情况:
(1)进程要调入某段,内存空闲区足够
(2)进程要调入某段,内存空闲区不够

对(1):够用
采用和分区式动态管理方法一样:
用申请表、可用表 / 自由链 进行管理
不同分区组织方式
对应不同的分配算法可用:最佳、最先、最坏算法
回收方法也一样,对回收段修改状态,加入可用表

对(2):不够用
此时就要对内存中某些块进行置换
置换哪些?
同样,可依照动态分区式管理方法:
FCFS算法、LRU算法(最近最久未用)等
一般来说,有时候需要调入的段比较大
可能需要置换出不止一个段

对于释放,参考分区式管理的释放

注意:任何一个段的的段长都不可以超过内存可用区长度

3、段式管理的地址变换

段式虚拟空间的机制是部分程序和数据在内存中
大部分程序和数据保存在外存中
因此,在进程执行时,如果待执行的段不再在内存
此时,中断进程,调入相关段

可是,CPU如何知道某个段不在内存中呢?
很简单,对每个段是否在内存中设置一个状态即可
可见,对段的调入和调出内存是需要额外的数据结构支持的
例如段表

(1)段表

逻辑格式如图所示:

始址:该段在内存 / 外存的实际物理地址
长度:该段的长度
存取方式:对该段进行保护,只有访问的控制状态字和该字段一致才可访问
内外:指明该段存在内存还是外存中
访问位:为置换算法设置,例如淘汰没有被访问 / 访问次数最少的段
段表有一个段表寄存器
段表放在哪里?
一般放在内存一个固定的区域

(2)动态地址变换

CPU执行进程的全部访问过程:
当进程开始执行时:
第一步、把段表开始地址放入段表地址寄存器
第二步、访问段表地址寄存器,得知从哪里访问段表
第三步、根据虚地址中的段号,查段表
第四步、检查存取状态字,判断是否可以访问
第五步、如果可以访问,从段表中查到对应项目,拿出该段的内存起始地址
        和段内相对地址w相加,得到实际内存地址

某段内存地址 = 该段内存始址 + 段内相对地址

段式地址变换需要对内存访问两次:
第一次,访问段表计算程序 / 数据物理地址
第二次,根据计算得到的地址,去实际访问数据

4、段的共享与保护

(1)共享

什么叫做共享?
其实就是我们写代码是的代码复用
例如有一个 add()函数
很多文件都使用到这个函数
是不是每一个文件都写一个呢?
没必要,太浪费
而是写一份,然后共享即可
节省空间

那么段式管理方法如何实现共享?
进程A想用进程B的C段时
直接在进程A的段表中填入C段的相关信息填入进程A的段表即可
并赋予合适的权限即可

共享访问过程中的一些问题
第一,修改数据问题
进程A共享了进程B的C段
可以,但是你不能修改C段的数据
否则进程B就出错了
第二、共享段调出问题
当进程调入段而内存不够用时
需要对某些段进行置换
很明显,对正在共享的段不应该被置换
因此,需要对段表中再加一个共享位
以区分是否被共享

(2)保护

存取控制方式 和 地址越界保护

存取控制方式,
就是上文所说的对段加上一个存取控制字
当某进程要访问该段时,应该检查控制字是否一致
不一致则拒绝

地址越界保护,
段的访问,是段号s + 段内相对地址
于是可以对段内相对地址 和 段的长度进行比较
如果段内相对地址 大于 段长度
很明显,越界,中断

注意:
在支持段动态增长的系统是允许访问的

四、段式管理的优缺点

优点:
1、支持同意内外存的虚拟存储,且每段都是有意义的信息(功能逻辑完成)
2、段长可以动态增长
3、便于共享
4、支持动态链接

缺点:
1、需要更多硬件支持,成本高
2、段式管理采取和分区管理一样的空闲区管理模式,存在小碎片空间问题
3、段的长度收可用区大小的限制
4、淘汰算法需谨慎,否则导致抖动

五、段页式管理

1、为什么会有段页式管理?

段式管理有便于共享、支持动态增长和内存保护的优点
页式管理有消除外部碎片的的优点,提高内存利用率
而进行存储管理的目的,就是为了便于用户程序设计和提高内存利用率
于是,可不可以把段式和页式结合起来呢?
可以

但是,这会是的管理方式变得更加复杂
产生了更大的系统开销
因此,段页式管理一般应用于大型机

2、段页式管理的实现原理

(1)虚拟地址的构成

一个进程中,具有独立逻辑功能的程序和数据被划分为段,并有各自的段号s
对段号s内的程序和数据,则被分成多个大小固定的页
于是,段页式的虚拟地址由三部分组成:
段号 s + 段内相对地址w
w = 页号p + 页内相对地址d

内存被划分为若干大小相等的页面
于是,段的大小不再受内存可用区的限制

(2)段表和页表

页表属于段而不是进程
其逻辑结构如图所示:

3、动态地址变换

地址变换分三步:
第一、访问段表内存,得到页表地址
第二、根据页表地址,访问内存,得到数据地址
第三、根据数据地址,访问内存,得到数据
因此,段页式的访问需要3次,大大减少了CPU的速度

基于此,段页式管理更加需要高速联想寄存器支持,以提高访存速度
将最常用的段号、页号和对应内存页和其他控制项直接放在高速联想寄存器中
当进程要访问内存空间某一单元时
首先检索高速联想寄存器
如果有,则直接将高速联想寄存器的段号、页号和段内地址d相加,得到内存地址
直接取数据

关于存储保护、共享、缺页中断可参考段式管理和页式管理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#设计模式(10)——装饰器模式(Decorator Pattern)】

前言 装饰器模式可以在运行时为对象添加额外的功,而无需修改原始对象的代码。这种方式比继承更加灵活。 代码 //蛋糕类(抽象类) public abstract class Cake {public abstract void Create(); } //奶油蛋糕类 public class CreamCake : Cak…

千图网 AI 绘画平台——智能图像创作工具

抖知书老师推荐: ​千图网的AI图像处理工具已经上线有一段时间了,随着AI技术的不断提升,越来越多的设计师和创意工作者开始接受并使用这个高效的工具。最初对于AI会影响创作行业的担忧,现在也逐渐消散了。设计师们依然在创造&…

【前端】技术演进发展简史

一、前端 1、概述 1990 年,第一个web浏览器诞生,Tim 以超文本语言 HTML 为基础在 NeXT 电脑上发明了最原始的 Web 浏览器。 1991 年,WWW诞生,这标志着前端技术的开始。 前端(Front-end)和后端(…

【C#设计模式(4)——构建者模式(Builder Pattern)】

前言 C#设计模式(4)——构建者模式(Builder Pattern) 运行结果 代码 public class Computer {private string part1 "CPU";private string part2 "主板";private string part3 "内存";private string part4 "显卡";private st…

android studio导入OpenCv并改造成.kts版本

1.下载opencv Android版本 2.解压导入android studio,我这里是先导入低版本的,还是gradle,直接导入module,我这里是4.2.0的版本 我的as版本是Android Studio Electric Eel 2022.1.1 Patch 2,我导入直接就能用 //load OpenCV engine and init OpenCV library //这里放在oncreat…

【easily-openJCL】要尝试下用 显卡 做数据对称加密吗?

easily-openJCL 要尝试下用 显卡 做数据对称加密吗? 开源技术栏 本文演示了一个案例,使用显卡进行数据加密哦,加密方法是 XOR 目录 文章目录 easily-openJCL 要尝试下用 显卡 做数据对称加密吗?目录开始导入项目库加密操作解密…

挖到宝了!统一dlp数据防泄漏解决方案有哪些?千字长文带你熟知这6款!

信息外泄、内部疏忽、离职泄密、黑客入侵、系统漏洞、第三方风险,这些司空见惯的企业数据泄漏问题,无一不牵动着企业的神经,考验着企业的数据安全防线。 今天,我们就来深挖几款统一dlp数据防泄漏解决方案,帮助企业筑起…

wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器

嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 wflow-web是一个开源的工作流设计器,它支持可视化拖拽表单组件,动态任意层级结构审批节点,以及复杂流程条件的设置…

VUE3实现好看的世界建筑中国建筑网站源码

文章目录 1.设计来源1.1 网站主界面1.2 登录界面1.3 注册界面1.4 特色建筑展览界面1.5 世界建筑介绍界面1.6 世界建筑介绍 - 详情界面1.7 中国建筑介绍界面1.8 中国建筑介绍 - 详情界面1.9 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码2.3 目录结构 源码下载万套模板&…

Flink新版Source接口源码解析

目录 1. 前言 2. Source解析 2.1 Source类图 2.2 接口和方法说明 2.2.1 Source,> 3. SplitEnumerator解析 3.1 SplitEnumetator类图 3.2 类和方法说明 3.2.1 SplitEnumerator 3.2.2 SimpleVersionedSerializer 4. SourceReader解析 4.1 SourceReader类图 4.2 类…

SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性

介绍 Spring Cloud Gateway 根据请求的路径、HTTP 方法、头部等信息,将请求路由到对应的微服务实例。它支持基于动态路由规则的配置,可以根据请求的 URL、查询参数、请求头等条件,灵活地决定将请求转发到哪个微服务。Spring Cloud Gateway 提…

【老白学 Java】你能想到「封装」说明有点专业

你能想到「封装」说明有点专业 文章来源:《Head First Java》修炼感悟。 上一章,师兄们能否理解对象属性的相互关系? 本章老白想聊聊数据安全的问题,毕竟谁都不想把自己的数据暴露于大庭广众之下。 如果那样的话将毫无隐私可言&a…

chat2db调用ollama实现数据库的操作。

只试了mysql的调用。 其它的我也不用,本来想充钱算了。最后一看单位是美刀。就放弃了这分心。于是折腾了一下。 本地运行chat2db 及chat2db ui https://gitee.com/ooooinfo/Chat2DB clone 后运行起来 chat2db的java端,我现在搞不清这一个项目是有没有…

主机型入侵检测系统(HIDS)——Elkeid在Centos7的保姆级安装部署教程

一、HIDS简介 主机型入侵检测系统(Host-based Intrusion Detection System 简称:HIDS);HIDS作为主机的监视器和分析器,主要是专注于主机系统内部(监视系统全部或部分的动态的行为以及整个系统的状态)。 HIDS使用传统的C/S架构,只需要在监测端安装agent即可,且使用用户…

qt中ctrl+鼠标左键无法进入

现象:qt中ctrl鼠标左键无法跳转部分函数,例如能跳到textEdit->toPlainText().,但无法跳转到toUtf8();但编译没有问题 排查1:我发现是交叉编译链的问题,使用linux自带就可以进,用ATK-I.MX6U就部分不能进…

Android gradle下载失败后 解决方案

Android 导入gradle一直失败,更新gradle源即可 比如项目里默认的是 distributionUrlhttps\://services.gradle.org/distributions/gradle-7.3.3-bin.zip 用下面这个来替换distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip

基于Java Springboot餐厅点餐系统(加入商家版)

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库:MySQL5.7…

开源项目推荐——OpenDroneMap无人机影像数据处理

实景三维作为GIS最火的课题,最近在想做一套自己的三维构建工具,考察了几个开源项目,把自己的搜索过程用csdn记录下来,希望也能帮助到各位同仁。 OpenDroneMap(ODM)是一个开源项目,旨在处理无人…

手动安装Ubuntu系统中的network-manager包(其它包同理)

自己手闲把系统中的network-manager包给删了,导致的结果就是Ubuntu系统彻底没有网络。结果再装network-manager时,没有网络根本装不了,网上的方法都试了也没用,然后就自己源码装,这篇文章就是记录一下怎么手动下载包然…

【C++】从零实现 C++ 自定义 list 容器:双向链表与迭代器深度解析

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 📘 基础数据结构【C语言】 💻 C语言编程技巧【C】 🚀 进阶C【OJ题解】 📝 题解精讲 目录 📌 1. 引言📌 2. 内容概要📌 3. list 容…