当前位置: 首页 > news >正文

3.1_9 基本分段存储管理

文章目录

  • 3.1_9 基本分段存储管理
    • (一)分段
    • (二)段表
    • (三)地址变换
    • (四)分段、分页管理的对比
  • 总结

3.1_9 基本分段存储管理

image-20240314230232393

(一)分段

  进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言,如汇编语言中,程序员使用段名来编程),每段从0开始编址

  内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻

image-20240314230516082

  由于分段存储管理当中,是按照逻辑功能模块划分,因此用户编程会更加方便、程序的可读性会更高


  在采用了分段之后,逻辑地址结构就变成了如下形式。

  分段系统的逻辑地址结构由段号(段名)和段内地址(段内偏移量)所组成,如:

image-20240314231438437

  段号的位数决定了每个进程最多可以分几个段

  段内地址位数决定了每个段的最大长度是多少

  在上述例子中,若系统是按字节寻址的,则:

  段号占16位,因此在该系统中,每个进程最多有 2 16 = 64 K 2^{16}=64K 216=64K个段。

  段内地址占16位(不要忘了系统是按字节编址的),因此每个段的最大长度是 2 16 = 64 K B 2^{16}=64KB 216=64KB

image-20240314232010689

image-20240314235652804

(二)段表

  程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表,简称“段表”。

image-20240315002634017

  与“页表”原理一样,只不过段表是记录了各个逻辑段到实际的物理内存存放位置之间的映射关系。

  1.每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称“基址”)和段的长度

  在分页存储管理中,每个页面的长度肯定都是一样的,所以页长是不需要显式记录的。但是在分段存储管理当中,段的长度是需要这样显式地记录在段表当中的。

  2.各个段表项的长度是相同的。例如:某系统按字节寻址,采用分段存储管理,逻辑地址结构为(段号16位, 段内地址16位),因此用16位即可表示最大段长。物理内存大小为4GB(可用32位表示整个物理内存地址空间)。因此,可以让每个段表项占16+32=48位,即6B。由于段表项长度相同,因此段号可以是隐含的,不占存储空间。若段表存放的起始地址为M,则K号段对应的段表项存放的地址为M + K*6

(三)地址变换

image-20240315004118886

image-20240315004254766

  在内存的系统区当中,存放着很多用于管理系统软硬件资源的结构,包括进程控制块PCB。当一个进程要上处理机运行之前,进程切换相关的内核程序会把进程运行环境给恢复。——其中就包括一个很重要的硬件寄存器当中的数据的恢复,这个寄存器叫做段表寄存器,用于存放这个进程对应的段表在内存中的起始地址,还有这个进程的段表长度。——因此,段表的起始地址、段表长度这两个信息,在进程还没有上处理机运行的时候,是存放在进程PCB当中的。当进程上处理机运行的时候,这两个信息会被放到段表寄存器中,段表寄存器是很快的。

  当获取段表始址、段表长度之后,就能知道段表具体存放在内存当中的什么地方。

  接下来,在进程运行的过程中,避免不了地要访问一些逻辑地址。

  第一步,对于一个给定的逻辑地址A,系统会从中截取得到段号S和段内地址W。

  第二步,知道了段号之后,需要用段号和段表长度进行一个对比,来判断一下段号是否产生了越界,如果段号 ≥ 段表长度的话,就会产生越界中断;如果没有产生中断的话,就会继续执行下去。(需要注意的是:段表长度至少是1;而段号是从0开始的。所以当S = M的时候,也是会引起越界中断的)

  第三步,根据段表始址和段号,就能找到段号对应的段表项。(由于段表项的长度是相同的,因此,通过段表始址F + 段号S * 段表项长度即可得到段号对应的段表项在内存当中的位置)就可以读出这个段表项的内容。

  第四步,在找到段号对应的段表项之后,系统还会用逻辑地址当中的段内地址W,与段表项当中的段长C进行比较,看看要访问的段内地址是否超过了这个段的最大段长。若W ≥ C,则产生越界中断,否则继续执行。(:这一步也是它与页式存储管理区别最大的一步,在页式管理当中,每个页面的页长肯定都是一样的,所以系统并不需要检查页内偏移量是否超过页面长度。但是在分段管理方式中又不同,各个段的长度不一样,所以一定需要对段内地址进行一个越界的检查)

  第五步,由于我们找到了目标段的段表项,所以我们就知道目标段存放在内存的什么地方。我们根据这个段的基址b(即这个段在内存当中的起始地址),再加上在该段内部要访问的段内地址W,就可以计算得到我们最终想要的物理地址了。

(四)分段、分页管理的对比

  信息的物理单位。分页的主要目的是为了实现离散分配,提高内存利用率。分页仅仅是系统管理上的需要,完全是系统行为,对用户是不可见的

  信息的逻辑单位。分段的主要目的是更好地满足用户需求。一个段通常包含着一组属于一个逻辑模块的信息。分段对用户是可见的,用户编程时需要显式地给出段名。

  页的大小固定且由系统决定。段的长度却不固定,取决于用户编写的程序。


从地址空间的角度来说:

  分页的用户进程地址空间是一维的,程序员只需给出一个记忆符即可表示一个地址。

image-20240315011739427

  分段的用户进程地址空间是二维的,程序员在标识一个地址时,既要给出段名,也要给出段内地址。

image-20240315011919653


除了上面所说的这些不同之外:

  分段比分页更容易实现信息的共享和保护

  由于各个段是一个独立的逻辑。因此,若某个段的逻辑功能可以被其他进程拿去使用的话,这个段就可以被共享访问。

  如何实现共享?

image-20240315012431204

  注意:不能被修改的代码称为纯代码可重入代码(不属于临界资源),这样的代码是可以共享的。可修改的代码是不能共享的(比如,有一个代码段中有很多变量,各进程并发地同时访问可能造成数据不一致)

  再来看一下,为什么在分页存储管理中不方便实现信息的共享(下图左)。对信息的保护也是类似的道理(下图右)。

image-20240315012826949


访问一个逻辑地址需要几次访存?

  分页(单级页表):第一次访存——查内存中的页表;第二次访存——访问目标内存单元。总共两次访存

  分段:第一次访存——查内存中的段表;第二次访存——访问目标内存单元。总共两次访存

  与分页系统类似,分段系统中也可以引入快表机构,将近期访问过的段表项放到快表中,这样可以少一次访存,加快地址变换速度。

总结

image-20240315013405678

相关文章:

3.1_9 基本分段存储管理

文章目录 3.1_9 基本分段存储管理(一)分段(二)段表(三)地址变换(四)分段、分页管理的对比 总结 3.1_9 基本分段存储管理 (一)分段 进程的地址空间&#xff1a…...

基于SpringBoot+Druid实现多数据源:baomidou多数据源

前言 本博客姊妹篇 基于SpringBootDruid实现多数据源:原生注解式基于SpringBootDruid实现多数据源:注解编程式基于SpringBootDruid实现多数据源:baomidou多数据源 一、功能描述 支持 数据源分组 ,适用于多种场景 纯粹多库 读写…...

Redis开发规范与性能优化(二)

开发规范与性能优化 3.客户端使用 1.【推荐】避免多个应用使用一个Redis示例 正例:不相干的业务拆分,公共数据库做服务化 2.【推荐】使用带有连接池的数据库,可以有效控制链接,同时提高效率,标准使用方式如代码所示 public c…...

我们是否生活在一个超大型生物的大脑之中?——对多元宇宙观与生命存在形式的哲学探讨

随着科技和哲学思辨的深入,关于人类所处宇宙的本质及我们自身存在的真实性的讨论越发引人入胜。其中一种颇具科幻色彩的观点认为,我们可能生活在某个巨大生物的大脑之中,所有的物理规律、自然现象以及我们的感知体验,都可能是这个…...

【Python数据结构与判断7/7】数据结构小结

目录 序言 整体回忆 定义方式 访问元素 访问单个元素 访问多个与元素 修改元素 添加元素 列表里添加元素 字典里添加元素 删除元素 in运算符 实战案例 总结 序言 今天将对前面学过的三种数据结构:元组(tuple)、列表(…...

探讨:MySQL和PostgreSQL谁更火

一、有人说PostgreSQL比MySQL火🔥 PostgreSQL相比于MySQL越来越受欢迎的原因可以从以下几个方面来阐述: 许可协议灵活性: PostgreSQL采用的是较为宽松的BSD许可证,允许企业在开源的基础上自由使用、修改和分发,而无需…...

hbase和es的选取 hbase与es结合

hbase和es的选取 hbase与es结合 背景介绍 HBase与ElasticSearch是现代应用在处理海量数据的技术架构会经常被使用的两款产品,其中HBase是一个分布式KV系统,具有灵活Schema、水平扩展、低成本、高并发的优势,但在复杂查询、分析能力方面相对…...

GoLang:云原生时代致力于构建高性能服务器的后端语言

Go语言的介绍 概念 Golang(也被称为Go)是一种编程语言,由Google于2007年开始设计和开发,并于2009年首次公开发布。Golang是一种静态类型、编译型的语言,旨在提供高效和可靠的软件开发体验。它具有简洁的语法、高效的编…...

高频面试必备(Java研发岗),一线互联网架构师设计思想解读开源框架

BeanFactory 和 ApplicationContext 有什么区别? 如何用基于 XML 配置的方式配置 Spring? 如何用基于 Java 配置的方式配置 Spring? 请解释 Spring Bean 的生命周期? Tomcat Tomcat 的缺省端口是多少,怎么修改&…...

React——react 的基本使用

前提:安装全局的脚手架,通过create-creat-app 项目名,我们创建好一个新项目,cd进去,通过npm start去运行该项目 注意:简单看下demo的配置,在根目录我们可以看到,没有任何webpack的…...

Unity资源热更新----AssetBundle

13.1 资源热更新——AssetBundle1-1_哔哩哔哩_bilibili Resources 性能消耗较大 Resources文件夹大小不能超过2个G 获取AssetBundle中的资源 打包流程 选择图片后点击 创建文件夹,Editor优先编译 打包文件夹位置 using UnityEditor; using UnityEngine; public cla…...

bootstrap企业网站前端模板

介绍 企业网站前端模板 软件架构 前端所用技术html/css/js/jquery 前端框架bootstrap 安装教程 浏览器本地路径访问发布到服务器比如(tomcat/nginx等)云服务器/虚拟机 网站效果图 网站预览 点击预览 源码地址 https://gitee.com/taisan/company…...

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测

分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测 目录 分类预测 | Matlab实现GSWOA-KELM混合策略改进的鲸鱼优化算法优化核极限学习机的数据分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GSWOA-KELM分类&#xff0…...

软考77-上午题-【面向对象技术3-设计模式】-创建型设计模式02

一、生成器模式 1-1、意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 1-2、结构图 Builder 为创建一个 Product 对象的各个部件指定抽象接口。ConcreteBuilder 实现 Builder 的接口以构造和装配该产品的各个部件,定…...

微博热搜榜单采集,微博热搜榜单爬虫,微博热搜榜单解析,完整代码(话题榜+热搜榜+文娱榜和要闻榜)

文章目录 代码1. 话题榜2. 热搜榜3. 文娱榜和要闻榜 过程1. 话题榜2. 热搜榜3. 文娱榜和要闻榜 代码 1. 话题榜 import requests import pandas as pd import urllib from urllib import parse headers { authority: weibo.com, accept: application/json, text/pl…...

有趣的前端知识(三)

推荐阅读 有趣的前端知识(一) 有趣的前端知识(二) 文章目录 推荐阅读JS内置对象JS外部对象BOM模型history对象screen对象navigator对象 DOM(文档对象模型)DOM的方法(对于节点的操作&#xff09…...

How to install teams in ubuntu

Download deb file download link: https://mirrors.sdu.edu.cn/spark-store-repository/store/office/teams/ install deb sudo apt install ./teams_1.5.00.23861_amd64.deb open and login teams....

macOS14.4安装FFmpeg及编译FFmpeg源码

下载二进制及源码包 二进制 使用brew安装ffmpeg : brew install ffmpeg 成功更新到ffmpeg6.1 下载FFmpeg源码...

基于Springboot+vue+mybatis框架的建材运营管理系统的设计与实现【附项目源码】分享

基于Springbootvuemybatis框架的建材运营管理系统的设计与实现: 源码地址:https://download.csdn.net/download/weixin_43894652/88842715 一、引言 随着信息技术的快速发展,各行各业都在积极地进行数字化转型。建材行业作为传统行业之一&a…...

前端路由跳转bug

路由后面拼接了id的千万不能取相近的名字,浏览器分辩不出,只会匹配前面的路径 浏览器自动跳转到上面的路径页面,即使在菜单管理里面配置了正确的路由 跳转了无数次,页面始终不对,检查了路由配置,没有任何问…...

二 centos 7.9 磁盘挂载

上一步 一 windso10 笔记本刷linux cent os7.9系统-CSDN博客 笔记本有两个盘,系统装在128G的系统盘上,现在把另外一个盘挂载出来使用 lsblk 发现磁盘已经分好了,直接挂载就好了,参考文章:Centos7.9 挂载硬盘_centos7.9挂载硬盘-CSDN博客 永久挂载 lsblk -f分区格式化 mkfs…...

二叉搜索树、B-树、B+树

二叉搜索树 二叉查找树,也称为二叉搜索树、有序二叉树或排序二叉树,是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的右子树不空&#xff0…...

Docker简介与安装

简介 用来快速构建、运行、管理应用的工具简单说,帮助我们部署项目以及项目所依赖的各种组件典型的运维工具 安装 1.卸载旧版 首先如果系统中已经存在旧的Docker,则先卸载: yum remove docker \docker-client \docker-client-latest \dock…...

Swift 单元测试

Swift 单元测试是用于检查代码的正确性和稳定性的一种测试方法。它可以帮助开发者在编写代码时及时发现和解决错误,提高代码质量。 在 Swift 中,可以使用 XCTest 框架来编写和运行单元测试。以下是一个简单的示例: import XCTestclass MyMa…...

有来团队后台项目-解析10

axios 安装 pnpm i axios创建文件 src 目录下创建 utils 文件夹,utils 文件夹下创建request.ts src 目录下创建store 文件夹,文件夹下创建index.ts ,创建modules 文件夹 编写request.ts // 引入axios,引入请求拦截器类型约束…...

【自动化】在C#中创建和配置串口对象SerialPort

串口通信在各种应用场景中都有广泛的应用,如工业控制、数据采集等。在.NET框架中,SerialPort类是用于串口通信的一个非常实用的类。本文将介绍如何在C#中使用SerialPort类进行串口通信,包括SerialPort的创建方法、基本属性设置和数据发送的基…...

突破编程_C++_设计模式(访问者模式)

1 访问者模式的基本概念 C中的访问者模式是一种行为设计模式,它允许你在不修改类层次结构的情况下增加新的操作。这种模式将数据结构与数据操作解耦,使得操作可以独立于对象的类来定义。 访问者模式的主要组成部分包括: (1&…...

C语言入门到精通之练习53:矩阵交换行问题(附带源码)

描述 给定一个 5*5 的矩阵(数学上,一个 rc 的矩阵是一个由 r 行 c 列元素排列成的矩形阵列),将第 n 行和第 m 行交换,输出交换后的结果。 输入输入共 6 行,前 5 行为矩阵的每一行元素, 元素与元素之间以一…...

Python白练-2统计下列5行字符串中字符出现的频数

问题:统计下列5行字符串中字符a、c、g、t出现的频数 数据:data2_2: 1.aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggagg 2.cggaggacaaacgggatggcggtattggaggtggcggactgttcgggga 3.gggacggatacggattctggccacggacggaaaggaggacacggcg…...

深入理解DHCP服务:网络地址的自动化分配

深入理解DHCP服务:网络地址的自动化分配 在现代网络环境中,动态主机配置协议(DHCP) 是一个至关重要的服务,它允许自动分配IP地址和其他相关配置信息给网络中的设备。本文将深入探讨DHCP服务的工作原理、配置方法以及如…...