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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现基本的登录功能

一、登录功能的前端处理过程 1、导入项目所需的图片和CSS等静态文件 参考代码存放client节点的/opt/code目录下 执行如下命令: [rootclient ~]# cp -r /opt/code/kongguan_web/src/assets/* /root/kongguan_web/src/assets/ 将参考代码中的css、icon、images等文…

Linux-vim显示乱码

Linux运维工具-ywtool 目录 一.问题二.解决2.1 编辑VIM的配置文件2.2 添加以下内容 一.问题 用vim编辑的时候,中文显示乱码 二.解决 2.1 编辑VIM的配置文件 vim ~/.vimrc #如果这个文件不存在,创建一个即可2.2 添加以下内容 添加完成以后就不会在出现中文乱码了 set fil…

Nginx、LVS、HAProxy工作原理和负载均衡架构

当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。 在实际应用…

IDEA中导入eclipse运行的java项目

本篇文章主要的内容是在IDEA中导入eclipse运行的java项目,亲测有效。 话不多说,直接开整。 前提:先打开idea软件,界面如下: 开始按下方步骤依次走即可。 1、file --> new --> Project from Existing Sources..…

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

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

【Leetcode每日一题】 递归 - 合并两个有序链表(难度⭐)(35)

1. 题目解析 题目链接:21. 合并两个有序链表 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 1. 递归函数定义与功能 递归函数的主要任务是将两个有序链表合并成一个新的有序链表,并返回合并后…

【总结】服务器无法连接外网,设置http代理解决

问题 某天想要在服务器上下载编译github上某开源项目,结果发现访问不了外网。 于是找运维,运维给了个http代理服务器地址。简单操作后,就可以访问外网了。 解决 在需要访问外网的机器上,执行以下命令:http_proxyhtt…

【分布式websocket】群聊中的各种难点以及解决推拉结合【第16期】

前言 群聊中未读消息如何设计,以及是推消息还是拉去消息如何选择是需要讨论的。推送消息是推送全量消息还是推送信号消息让客户端再去拉取。其中方案如何选型会比较纠结。 首先基本的推拉结合思路是在线用户推送消息。用户离线的话上线去拉取消息。这是简单的推拉结…

【QT】UDP通信/广播/多播应用

server.ui client和server.ui完全相同!!!! server.h/.cpp class Server : public QMainWindow {..... private:Ui::Server *ui;QUdpSocket *server; };--------------------#include "server.h" #include "ui_se…

智能物流新纪元:分布式I/O模块重塑仓储自动化

随着工业4.0概念的深入人心,物流行业正在经历前所未有的变革。在这个过程中,物流企业必须积极走向工业自动化、智能化,进而提高物流效率,降低物流成本,以便更好地满足客户和市场的需求。智能物流、仓库自动化已然是趋势…

mysql 排序底层原理解析

前言 本章详细讲下排序,排序在我们业务开发非常常见,有对时间进行排序,又对城市进行排序的。不合适的排序,将对系统是灾难性的,这个不是危言耸听。可能有些人会想,对于排序mysql 是怎么实现的,…

MATLAB画图:错误使用plot无效的颜色或线型...

指定绘图颜色 - MATLAB & Simulink (mathworks.com) 使用matlab画图,想要使用其他颜色时,如想要从上面的颜色类型修改为下面的颜色类型 只需要在后面修改color属性即可 s1 plot(C3, LineWidth,2); s1.Color [0.8500 0.3250 0.0980]; hold on s2 …