三、内存管理 (一)存储器管理

news2024/11/15 7:43:19

目录

1.1程序运行的基本过程

1.1.1 编辑、编译、链接、装入

1.1.2链接的三种方式

1.1.3装入的三种方式

1.2内存管理基本概念 

1.2.1内存保护

 1.2.2内存空间扩充

 1.2.3地址转换功能

1.2.4内存空间的分配与回收

1.2.4.1连续分配管理方式

1.2.4.1.1单一连续分配

1.2.4.1.2固定分区分配

1.2.4.1.3动态分区分配

1.2.4.2基本分页存储管理

1.2.4.2.1基本地址变换机构

1.2.4.2.2具有快表的地址变换机构 

1.2.4.2.3二级页表

1.2.4.3基本分段存储管理

1.2.4.3.1基本地址变换机构

1.2.4.3.2段的共享与保护 

1.2.4.4段页式管理 ​

1.2.4.4.1基本地址变换机构 

1.2.4.5三种离散分配方式对比


1.1程序运行的基本过程

1.1.1 编辑、编译、链接、装入

  • 形成完整逻辑地址的阶段是链接。 形成物理地址的阶段是装入
  • 逻辑地址又称相对地址,物理地址又称绝对地址

1.1.2链接的三种方式

  • 静态链接装入前链接成一个完整装入模块以后不再拆开。
  • 装入时动态链接:运行前边装入边链接,便于修改和实现对目标模块的共享。
  • 运行时动态链接边运行边链接,加快程序的装入过程,还可节省大量内存空间。

1.1.3装入的三种方式

  • 绝对装入只适合于单道程序环境。编译程序将产生绝对地址(物理地址)的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
  • 静态重定位(可重定位装入)在多道程序环境下,根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,其地址变换通常是在进程装入时一次完成的,故称为静态重定位
  • 动态重定位(动态运行时装入):装入内存后所有的地址仍然是逻辑地址,把地址转换推迟到程序真正要执行时才进行。这种方式需要一个重定位寄存器的支持。允许程序在内存中移动。

1.2内存管理基本概念 

1.2.1内存保护

  • 设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
  • 采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址

系统中只需设置一个重定位寄存器,只需在切换程序执行时重置寄存器内容。 

 1.2.2内存空间扩充

 这里覆盖与交换大纲已删,虚拟存储技术将在下一小节重点学习。

 1.2.3地址转换功能

  • 绝对装入 ,单道程序阶段,无操作系统
  • 静态重定位,早期多道批处理阶段。
  • 动态重定位,现代操作系统。

1.2.4内存空间的分配与回收

为了能够将用户程序装入内存,必须为它分配一定大小的内存空间。这就引出了存储管理方式。

存储管理方式随着操作系统的发展而发展。在操作系统由单道向多道发展时,存储管理方式便由单一连续分配发展为固定分区分配。为了能更好地适应不同大小的程序要求,又从固定分区分配发展为动态分区分配

为了更好地提高内存的利用率,进而从以上的连续分配方式发展到以下的离散分配方式——页式存储管理。为了满足用户在编程和使用方面的要求,又引入了分段存储管理。而段页式存储管理集中了分页管理和分段管理的优点。

1.2.4.1连续分配管理方式

1.2.4.1.1单一连续分配

内存被分为系统区用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区空间。

优点:无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护

缺点:只能用于单用户、单任务的操作系统中有内部碎片存储器利用率极低

1.2.4.1.2固定分区分配

  •  无外部碎片,会产生内部碎片。

1.2.4.1.3动态分区分配

又称可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。 

 

 

1.2.4.2基本分页存储管理

引入页面和页框 

分页管理不会产生外部碎片每个进程平均只产生半个块大小的内部碎片。

内存空间:页框=页帧=内存块=物理块=物理页面。

进程的逻辑地址空间:页=页面

给它们编号之后它们的编号也是对应的。

操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。进程的页面和内存的页框一一对应的关系。各个页面不必连续存放,可以放到不相邻的各个页框中,这正是离散分配方式的特点。 

地址结构 

在计算机内部,地址是用二进制表示的,如果页面大小刚好是2的整数幂,则计算机硬件可以很快速地把逻辑地址拆分成页号页内偏移量(页内地址)。 

页面大小=物理块大小=页内地址位数=逻辑地址结构=页内偏移量位数。“=”的意思在这里是这些概念是可以互相求得的。

 当然下面这两个公式在页面大小不是2的整数幂时也是适用的:

然后通过页号查询页表,可知页面在内存中的起始地址。

页面在内存中的起始地址+页内偏移量=实际的物理地址

引入页表

引入页表这一数据结构来找到进程的每个页面在内存中的位置。每个进程都有一张页表且存在于内存中。

即页表的作用是实现从页号到物理块号的地址映射。

页表的页号是隐藏(类似数组),所以存储页表时不用考虑页号。

而内存块大小=页面大小,假设内存块大小为2^20,由于计算机以字节分配地址空间,我们至少需要3B=24位即2^24来表示块号。因此每个页表项占3B。

那么我们已经有了页表初始地址时如何在内存中找到想要的页号呢?页号 i 的地址= F + 3 * i(F为页表在内存中的初始地址,3为每个页表项占3个字节空间)。

我们有了块号J之后如何在内存中找到想要的内存块地址呢?内存块J的地址=J*内存块大小(页面大小)

对页表项长度的进一步讨论

为了使i号页表项地址=页表在内存中始地址F+3*i这个公式成立,整个页表的页表项必须是在内存中地址连续地存储。但实际上可能会发生下面这种情况:

 

 解决方法是让每个页框正好存放整数个页表项,所以可以让页表项长度为4B。

页表项长度和页面大小辨析

  • 上图红色整体是一个页表
  • 黄色为其中一个页表项
  • 页表项长度为页表项所占的存储空间的大小,上图为2^5
  • 页表长度表示页表总共有几个页,上图为3
  • 页面大小=物理块大小为一个页占存储空间的大小。

注:页面大小和页表项长度容易混淆,页面大小是根据进程的平均大小、页表长度等因素划分的。页表项长度是用来指示“页面对应的物理块”在内存中的编号。

1.2.4.2.1基本地址变换机构

通常会在系统中设置一个页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M。进程未执行时,页表的始址和页表长度放在PCB中,当进程被调度时,操作系统内核会把它们放到PTR中。

1.2.4.2.2具有快表的地址变换机构 

快表,又称联想寄存器(TLB,translation lookaside buffer),是一种cache,用来存放最近访问的页表项的副本,加快地址变换的速度。与此对应,内存中的页表称为慢表

1.2.4.2.3二级页表

 问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。

根据对分页管理方式的思想将原来的较长的页表进行分页。 

 补充:若采用多级页表机制,各级页表的大小不能超过一个页面。

问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。

可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增加一个标志位,用于表示该页面是否已经调入内存。

 

1.2.4.3基本分段存储管理

分段 

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

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

  • 段号的位数决定了每个进程最多可以分几个段。
  • 段内地址位数决定了每个段的最大长度是多少。

段表 

 

  •  每个段对应一个段表项,其中记录该段在内存中的起始位置(又称基址)段的长度。注:页表项中记录的是块号,并且不记录段的长度。
  • 各个段表项的长度是相同的
  • 段号可以是隐含的,不占存储空间。 

1.2.4.3.1基本地址变换机构

 第一次访存,查内存中的段表,第二次访存,访问目标内存单元。

1.2.4.3.2段的共享与保护 

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

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

 

1.2.4.4段页式管理 

  • 段号的位数决定了每个进程最多可以分几个段
  • 页号位数决定了每个段最大有多少页(即最大段长)
  • 页内偏移量决定了页面大小=内存块大小是多少

段页式管理中,“分段”对用户是可见的,程序员编程时需要显式地给出段号、段内地址。而将各段“分页”对用户是不可见的。系统会根据段内地址自动划分页号和页内偏移量。因此段页式管理的地址结构是二维的。 

1.2.4.4.1基本地址变换机构 

注意这里的段表和段式管理方式的段表的不同。 

 

  第一次访存,查段表;第二次访存,查页表;第三次访存,访问目标内存单元。

页表和段表同样存储在内存中,系统提供给用户的物理地址空间为总空间大小减去页表或段表所占空间大小。 

1.2.4.5三种离散分配方式对比

页是信息的物理单位,对用户是不可见的。

段是信息的逻辑单位,对用户是可见的。 

分页的用户进程地址空间是一维的。

分段的用户进程地址空间是二维的。

段页式的用户进程地址空间是二维

在不引入快表和多级页表时:

分页二次访存,分段二次访存,段页式三次访存。


总结:学习存储管理方式时要注意以下问题:逻辑地址表项结构寻址过程。此外还有快表多级页表的引入目的。

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

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

相关文章

Http协议和Https协议

Http是不安全的,你的数据容易被黑客拦截,篡改,攻击 https要求对数据加密(不能明文传输), 用抓包工具抓http请求,抓出来的都是明文的,你能看得懂的,抓https请求,抓出来的…

网站域名被QQ拦截提示:当前网页非官方页面拦截的解决办法

今天网友提醒,星空站长网的链接被QQ屏蔽拦截了。提示:当前页面非官方页面,请复制到浏览器打开。 如图: 原因:这是因为QQ方面的诈骗信息特别多,所以腾讯官方索性就直接屏蔽了所有的外部链接。让站长们通过申…

Python源码剖析笔记1-整数对象PyIntObject

1、PyIntObject 对象 [intobject.h] typedef struct {PyObject_HEADlong ob_ival; } PyIntObjectPyIntObject是一个不可变(immutable)对象。Python内部也大量的使用整数对象,我们在自己的代码中也会有大量的创建销毁整型对象的操作&#xff…

SVM 用于将数据分类为两分类或多分类(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

CMake中install的使用

CMake中的install命令用于指定安装时要运行的规则&#xff0c;其格式如下&#xff1a; install(TARGETS targets... [EXPORT <export-name>][RUNTIME_DEPENDENCIES args...|RUNTIME_DEPENDENCY_SET <set-name>][[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDL…

基于单片机的电压电流表设计

原理图&#xff1a; 部分程序&#xff1a; #include "stc15.h" #include "delay.h" #include "timer.h" #include "TM7707.h" #include "LCD1602.h" #include "eeprom.h" #include "stdio.h" #include…

【数学】双根号求值域问题

∣双根号求值域问题NightguardSeries.∣\begin{vmatrix}\Huge{\textsf{ 双根号求值域问题 }}\\\texttt{ Nightguard Series. }\end{vmatrix}∣∣∣∣∣​ 双根号求值域问题 Nightguard Series. ​∣∣∣∣∣​ 求 f(x)3x−63−xf(x)\sqrt{3x-6}\sqrt{3-x}f(x)3x−6​3−x​ 的…

开发工具——gdb

开发工具gdb gdb在Linux下负责程序的调试。 gdb相较于vs2019的调试&#xff0c;是不方便的。图形化界面调试确实是一种进步的现象。 先编写一个简单的程序&#xff0c;如果不支持在for循环中定义变量&#xff0c;要在编译指令后面加上-stdc99选项。 要编译的文件和要生成的文…

Spring 源码编译

Spring 源码编译&#xff0c;一定要选好版本&#xff01;&#xff01;&#xff01; Spring 源码编译&#xff0c;一定要选好版本&#xff01;&#xff01;&#xff01; Spring 源码编译&#xff0c;一定要选好版本&#xff01;&#xff01;&#xff01; 重要的事说三遍。 Spri…

MYSQL用函数请三思

背景&#xff1a;最近公司有个同事遇到个需求需要用到mysql sleep函数&#xff0c;但结果却大出意料. 测试如下&#xff1a; 表&#xff1a; CREATE TABLE test_sleep ( id int NOT NULL AUTO_INCREMENT, a int NOT NULL, b int NOT NULL, PRIMARY KEY (id), KEY a (a) ) ENGIN…

电子学会2021年3月青少年软件编程(图形化)等级考试试卷(一级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 花花幼儿园有三个班。根据下面三句话&…

CentosLinux 7 字符安装教程

打开VMware虚拟机,点击文件 — 新建虚拟机选项。在弹出的对话框中选择自定义(高级)选项。单机下一步。 以下步骤根据自己的所需自行配置

[附源码]Python计算机毕业设计Django酒店在线预约咨询小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

健身中心管理系统/健身房管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

【OpenCV-Python】教程:3-16 利用Grabcut交互式前景提取

OpenCV Python Grabcut分割 【目标】 Grabcut 算法创建一个交互程序 【理论】 从用户角度是如何工作的呢&#xff1f;用户在需要的目标上初始绘制一个矩形&#xff0c;前景目标必须完全在矩形内部&#xff0c;算法迭代的去分割然后得到更好的效果&#xff0c;但是有些情况下…

Java9-17新特性解读,了解少于3个你可能脱节了

前言 Java8出来这么多年后&#xff0c;已经成为企业最成熟稳定的版本&#xff0c;相信绝大部分公司用的还是这个版本&#xff0c;但是一眨眼今年Java19都出来了&#xff0c;相信很多Java工程师忙于学习工作对新特性没什么了解&#xff0c;有的话也仅限于某一块。 本篇就是博主对…

【论文笔记】Radatron: Accurate Detection Using Multi-Resolution Cascaded MIMO Radar

文章及补充材料链接&#xff1a;https://jguan.page/Radatron/ 理解本文需要一些电磁波与雷达信号处理相关的理论知识。 1. 引言 雷达的角度分辨率通常很低。雷达的角度分辨率与雷达的天线孔径成反比&#xff0c;因此毫米波雷达要达到激光雷达的角度分辨率&#xff0c;需要3000…

黑盒测试用例设计 - 因果图法

说明 因果图法是一种适合于描述对多种输入条件组合的测试方法根据输入条件的组合、约束关系和输出条件的因果关系&#xff0c;分析输入条件的各种组合情况&#xff0c;从而设计测试用例的方法它适合于检查程序输入条件涉及的各种组合情况 使用步骤 第一步&#xff1a;根据功…

60岁首席工程师被SpaceX边缘化,主管:我怕他退休或死了

金磊 发自 凹非寺量子位 | 公众号 QbitAI在SpaceX&#xff0c;连首席工程师竟也能遭遇职场边缘化。故事的主人公叫做John Johnson&#xff08;姑且叫他“逊哥”&#xff09;&#xff0c;他在2018年加入SpaceX。当时的逊哥已经58岁&#xff0c;但在光学工程领域可谓颇有建树。刚…

Java---数据库---MyBatisPlus

MyBatisPlus1&#xff0c;MyBatisPlus入门案例与简介1.1 入门案例步骤1:创建数据库及表步骤2:创建SpringBoot工程步骤3:勾选配置使用技术步骤4:pom.xml补全依赖步骤5:添加MP的相关配置信息步骤6:根据数据库表创建实体类步骤7:创建Dao接口步骤8:编写引导类步骤9:编写测试类1.2 M…