王道操作系统笔记(七)——— 内存管理的基本要求和连续分配管理方式

news2024/9/22 14:27:30

文章目录

  • 一、内存的概念和作用
  • 二、内存管理的概念
  • 三、进程运行的基本原理和要求
    • 3.1 程序执行过程
    • 3.2 逻辑地址和物理地址
    • 3.3 程序的链接
    • 3.4 程序的装入
    • 3.5 内存保护
  • 四、覆盖与交换
    • 4.1 覆盖技术
    • 4.2 交换技术
  • 五、连续分配管理方式
    • 5.1 单一连续分配
    • 5.2 固定分区分配
    • 5.3 动态分区分配
      • 5.3.1 空闲分区链与空闲分区表
      • 5.3.2 动态分区分配算法
      • 5.3.3 四种分配算法对比(★)
      • 5.3.4 分区的分配与回收
      • 补充:紧凑技术


一、内存的概念和作用

  主存储器,简称主存,又称内存储器(内存),用来存放计算机运行期间所需的程序和数据,CPU可以直接随机地对其进行访问,程序执行前需要先放到内存中才能被CPU处理,主要作用是 缓和CPU与硬盘之间的速度矛盾

在这里插入图片描述
  内存中有一个个的小房间,每个小房间就是一个存储单元,内存地址从 0 开始,每个地址对应一个存储单元如果计算机按字节编制,每个存储单元大小为 1 字节,即 8 个二进制;如果计算机按字编址,每个存储单元大小为 1 个字。若字长为 16 位,则每个存储单元大小为 16 个二进制。若字长为 32 位,则每个存储单元大小为 32 个二进制。

在这里插入图片描述

补充:几个常用的数量单位
1 1 1 B = 8 8 8 bit    2 10 2^{10} 210 = 1 1 1 K (千)   2 20 2^{20} 220 = 1 1 1 M (兆,百万)   2 30 2^{30} 230 = 1 1 1 G (千兆,十亿)
1 1 1 GB = 2 10 2^{10} 210 MB = 2 20 2^{20} 220 KB = 2 30 2^{30} 230 B = 8 8 8* 2 30 2^{30} 230 bit

例:一台手机/电脑 有 4 4 4GB 内存
是指该内存中可以存放 4 4 4* 2 30 2^{30} 230 个字节。如果是按字节编址的话,也就是有 4 4 4* 2 30 2^{30} 230 = 2 32 2^{32} 232 个小房间。这么多小房间,需要 2 32 2^{32} 232 个地址才能标识,所以地址需要用 32 32 32 个二进制位来表示( 0 0 0 ~ 2 32 2^{32} 232- 1 1 1


二、内存管理的概念

  虽然计算机技术飞速发展,内存容量也在不断扩大,但仍然不可能将所有用户进程和系统所需的全部程序与数据放入内存,因此操作系统对内存空间进行合理的划分和有效的动态分配。操作系统对内存的划分和动态分配,就是内存管理的概念

操作系统作为系统资源的管理者,主要负责:
内存空间的分配与回收:OS 要怎么记录哪些内存区域已经被分配出去了,哪些又还空闲;当进程运行结束之后,如何将进程占用的内存空间回收。
内存空间的扩充:OS 利用虚拟内存技术或自动覆盖技术使得系统运行很大的程序,从逻辑上扩充内存。
地址转换:为了使编程更方便,程序员写程序时应该只需要关注指令、数据的逻辑地址。而 逻辑地址到物理地址的转换(这个过程称为地址重定位)应该由操作系统负责,其中 地址重定位有三种方式
内存保护:保证各进程在各自存储空间内运行,互不干扰。

在这里插入图片描述


三、进程运行的基本原理和要求

3.1 程序执行过程

创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
编译: 由编译程序将用户源代码编译成若干个目标模块,编译就是把高级语言翻译为机器语言
链接: 由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
装入(装载): 由装入程序将装入模块装入内存运行。
在这里插入图片描述


3.2 逻辑地址和物理地址

  编译后,每个目标模块都是从 0 号单元开始编址,这称为该目标模块的 逻辑地址 (或相对地址)。当链接程序将各个模块连接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从 0 号单元开始编制的 逻辑地址空间。用户程序和程序员只需知道逻辑地址,而内存管理的具体机制则是完全透明的,只有系统编程人员才会涉及内存管理的具体机制。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到内存的不同位置。
  物理地址空间 是指内存中物理单元的集合,它是地址转换的最终地址。进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址(动态重定位是地址转换推迟到程序真正要执行时才进行),这个过程称为 地址重定位

注:以上两段,重点在于理解


3.3 程序的链接

  1. 静态链接
    在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
    在这里插入图片描述

  2. 装入时动态链接
    将各 目标模块装入内存时,边装入边链接的链接方式。
    在这里插入图片描述

  3. 运行时动态链接
    在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享
    在这里插入图片描述


3.4 程序的装入

  1. 绝对装入
    在编译与链接后,得到的装入模块指定 直接使用了绝对地址

  2. 静态重定位(可重定位装入)
    装入时对地址进行重定位,即将逻辑地址变换为物理地址,地址变换是在装入时一次完成的
    在这里插入图片描述
    静态重定位的特点: 在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

  3. 动态重定位(动态运行时装入)
    装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址(装入时依然保持使用逻辑地址)而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持
    在这里插入图片描述
    动态重定位特点: 可以将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间;采用动态重定位时允许程序在内存中发生移动

注:链接的作用是形成了完整的装入模块与逻辑地址,但逻辑地址到物理地址的转换过程是重定位,而不是装入


3.5 内存保护

内存分配前,需要保护 OS 不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。用户进程可采取以下两种方法:

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

四、覆盖与交换

在多道程序环境下用来扩充内存的两种方法:

4.1 覆盖技术

基本思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。

  内存中分为一个 固定区 和若干个 覆盖区。需要常驻内存的段放在 固定区 中,调入后就不再调出(除非运行结束)。不常用的段放在 覆盖区需要用到时调入内存,用不到时调出内存。并且 必须由程序员声明覆盖结构,操作系统完成自动覆盖。
在这里插入图片描述

缺点: 对用户不透明,增加了用户编程负担;覆盖技术 只用于早期的操作系统中,现在已成为历史。


4.2 交换技术

基本思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
  中级调度(内存调度),采用的就是交换技术;暂时换出外存等待的进程状态为挂起状态(挂起态)挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。

在这里插入图片描述

  1. 具有对换功能的操作系统中,通常把磁盘空间分为 文件区和对换区 两部分。 文件区 主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;对换区 空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此 对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。总之,对换区的I/O速度比文件区的更快
  2. 交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。
  3. 可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间。

注:PCB 会常驻内存,不会被换出外存。因为进程被换出外存后,系统需要通过PCB对进程进行管理。


下列措施中,能加快虚实地址转换的是( C )。
Ⅰ.增大快表(TLB)容量  Ⅱ.让页表常驻内存  Ⅲ.增大交换区(swap)
A.仅Ⅰ  B.仅Ⅱ  c.仅Ⅰ Ⅱ  D.仅Ⅱ Ⅲ
(来源:2014年408真题)


解析: 虚实地址转换,即逻辑地址与物理地址的转换。
增大快表容量:可增加查询快表命中的概率。
让页表常驻内存:在采用多级页表的请求分页存储管理系统中,页表常驻内存可保证在查询页表时不会发生缺页、调页的情况,从而加快地址转换。

  • 当系统有足够的交换区空间时,页面的换入换出都是通过交换区进行。
  • 当系统缺少足够的交换区空间时,不会被修改的文件直接从文件区调入,当它们需要换出时,由于未被修改因此不必换出,直接覆盖即可。可能被修改的页面,将其换出时必须调到交换区,以提升I/O速度。
  • 页表显然是可能被修改的内容,因此即使交换区空间不足,页表在换出时也必然放在交换区

因此,增大交换区对地址转换的速度无影响


五、连续分配管理方式

5.1 单一连续分配

  在单一连续分配方式中,内存被分为 系统区和用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区空间
在这里插入图片描述
优点: 实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护(eg:早期的 PC 操作系统 MS-DOS)。
缺点: 只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。

内部碎片:分配给某进程的内存区域中,如果有些部分没有用上。
外部碎片:是指内存中的某些空闲分区由于太小而难以利用。


5.2 固定分区分配

  固定分区分配是最简单的一种多道程序存储管理方式,它将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业。当有空闲分区时,便可从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。

  • 分区大小相等:用于利用一台计算机控制多个相同对象的场合,缺乏灵活性
  • 分区大小不等:划分多个小分区、适量中等分区和少量大分区,可以满足不同大小的进程需求,增加了灵活性

在这里插入图片描述

  为了便于内存分配,通常操作系统需要建立一个数据结构——它分区说明表,来实现各个分区的分配与回收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的大小、起始地址、状态(是否已分配)。
在这里插入图片描述
优点: 实现简单,无外部碎片
缺点: 当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能;
    会产生内部碎片,内存利用率低。


5.3 动态分区分配

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

5.3.1 空闲分区链与空闲分区表

系统中应用 空闲分区链、空闲分区表 两种数据结构记录内存的使用情况。

在这里插入图片描述


5.3.2 动态分区分配算法

当一个新作业装入内存时,须按照一定的 动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。

  1. 首次适应算法
    算法思想: 每次都从低地址开始查找,找到第一个能满足大小的空闲分区
    如何实现: 空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

  2. 最佳适应算法
    算法思想: 优先使用更小的分区,以保留更多大分区
    如何实现: 空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

  3. 最坏适应算法(最大适应算法)
    算法思想: 优先使用更大的分区,以防止产生太小的不可用的碎片
    如何实现: 空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

  4. 邻近适应算法
    算法思想: 由首次适应演变而来,每次从上次查找结束位置开始查找
    如何实现: 空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。


5.3.3 四种分配算法对比(★)

算法算法思想空闲分区排列顺序优点缺点
首次适应从头到尾找适合的分区地址递增 次序排列综合性能最好;算法开销小 ,回收分区后一般不需要对空闲分区队列重新排序/
最佳适应优先使用更小的分区,以保留更多大分区容量递增 次序排列会有更多的大分区被保留下来,更能满足大进程的需求会产生很多难以利用的小碎片; 算法开销大 ,回收分区后可能需要对空闲分区队列重新排序
最坏适应优先使用更大的分区,以防止产生太小的不可用的碎片容量递减 次序排列可以减少难以利用的小碎片,更能满足小进程的需求大分区易被用完,不利于大进程; 算法开销大(原因同上)
邻近适应由首次适应演变而来,每次从上次查找结束位置开始查找地址递增 次序排列(可排列成循环链表)不用每次都从低地址的小分区开始检索;算法开销小 (原因同首次适应算法)会使高地址的大分区提前被用完

注:动态分区分配没有内部碎片,但是有外部碎片

在下列动态分区分配算法中,最容易产生内存碎片的是( C )。
A. 首次适应算法  B. 最坏适应算法  C. 最佳适应算法  D. 循环首次适应算法

解析:内存碎片包括内碎片和外碎片。
最佳适应算法总是匹配当前大小最接近的空闲分区,但是大多数情况下空闲分区的大小不可能完全和当前要求的大小相等,因此会产生很多难以利用的小碎片,所以最佳适应算法最容易产生内存碎片。
而最坏适应算法,优先使用大分区,余下的小分区,可以被分配给小进程使用,因此最坏适应算法可以减少难以利用的小碎片。
(来源:2019年408真题)

5.3.4 分区的分配与回收

回收内存分区时,有可能遇到四种情况:
① 回收区的后面有一个相邻的空闲分区。
② 回收区的前面有一个相邻的空闲分区。
③ 回收区的前、后各有一个相邻的空闲分区。
④ 回收区的前、后都没有相邻的空闲分区。

无论那种情况,都要遵循相邻的空闲分区要合并的原则

注:各表项的顺序不一定按照地址递增顺序排列,具体的排列方式需要依据动态分区分配算法来确定。


补充:紧凑技术

  外部碎片是指内存中的某些空闲分区由于太小而难以利用,但是当内存空闲分区总和可以满足当前进程时,那么可以利用紧凑技术解决该问题。如下图,进程3需要30MB,内存的空闲分区总和恰好可以满足进程3,紧凑之后,再将空闲分区分配给进程3。

在这里插入图片描述
  紧凑之后,需要修改各进程的起始地址,起始地址一般放在 PCB 中。当进程上 CPU 运行时,会把更新的地址信息放到重定位寄存器中,并使用动态重定位方式,对逻辑地址到物理地址的转换进行重新定位。如下图,分别表示紧凑之前与紧凑之后逻辑地址79处指令集合的内存情况。
     在这里插入图片描述

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

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

相关文章

解决ArcSWAT 2012.10_8.25安装 Error 1001 无法获得SWAT_HRU.dll程序集中安装程序类型。->无法加载一个或多个请求熟悉

问题描述 Error1001.无法获得G:SWATArcSWATSWAT_HRUsdll 程序集中的安装程序类型。->无法加载一个或多个请求的类型。有关更多信息,请检索LoaderExceptions 属性。 这是由于找不到对应的dll文件。 参考ArcSWAT的帮助文档后,发现该版本 对应的ArcGI…

revit中如何创建有坡度的排水沟及基坑?

一、revit中如何创建有坡度的排水沟? 先分享一张有坡度排水沟的族的照片给大家加深一下印象,有了一个粗略的直观认识,小编就来说说做这个族的前期思路吧。 一、前期思路: 1、 用拼接的方式把这个族形状拼出来,先用放样&#xff0…

焕新启航,「龙蜥大讲堂」2023 年度招募来了!13 场技术分享先睹为快

龙蜥大讲堂是龙蜥推出的系列技术直播活动,邀请龙蜥社区的开发者们分享围绕龙蜥技术展开,包括但不限于内核、编译器、机密计算、容器、储存等相关技术领域。欢迎社区开发者们积极参与,共享技术盛宴。往期回顾龙蜥社区技术系列直播截至目前已举…

rust 程序设计语言入门(一)

本文是阅读《Rust程序设计语言》的学习记录,配合视频《Rust编程语言入门教程》食用更佳 环境搭建 windows下载rustup_init.exe,点击安装,默认选择msvc的toolchain,一路default即可 解决下载慢的问题,在powershell中修…

2.7、进程调度的时机、切换与过程、方式

1、进程调度的时机 进程调度\color{red}进程调度进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机 进程在操作系统内核程序临界区\color{red}操作系统内核程序临界区操作系统内核程序临界区中不能\color{red}不能…

网络连通性测试(ping/tcp)

网络连通性首先要看ping是否能够通其次,测试TCP是否能通方式一、iperf3/iperf2可以测试tcp的连接一方作为server,一方作为client来连接,但是iperf3和iperf2不兼容server:iperf3/iperf2 -s 172.20.0.36client: iperf3/iperf2 -c 17…

亚马逊、沃尔玛卖家自养号退款经验和测评技术

今天给大家介绍下在做亚马逊、沃尔玛退款自养号中的经验,众所周知,自养号最重要的是养号的环境,包括系统的纯净度,下单的信用卡以及其他的一些细节。 环境系统市面上有很多,鱼龙混杂,比如什么lumi&#xf…

Java测试——junit的使用(2)

排序 我们同一个类下的多个用例的执行顺序是不确定的,如果需要指定固定的顺序,则需要在类上加这个注解 TestMethodOrder(MethodOrderer.OrderAnnotation.class)然后在想要第一个执行的用例上加上 Order(1)第二个执行的用例上注解: Order(…

爬虫圈,常见的加密手段,你应该了解一下

常见加密手段 实验介绍 本实验为大家介绍一下常见的加密技术,掌握之后,可以在反爬时加入各加密算法,从而提高爬虫采集难度,本实验为大家介绍三类加密,其一是消息摘要算法/签名算法,其二是对称加密&#x…

十四、MySQL 约束详解

文章目录一、定义完整性约束1.1 实体完整性1.1.1 主键约束1.1.2 自增列:AUTO_INCREMENT1.1.3 候选键约束或唯一约束(UNIQUE KEY)1.2 用户定义完整性1.2.1 非空约束1.2.2 CHECK约束1.2.3 DEFAULT约束1.3 参照完整性1.3.1 FOREIGN KEY 约束的作用1.3.2 主表(父表)从表…

趣味三角——第10章——(sinx)/x

第10章 函数(sinx)/x I call our world Flatland, not because we call it so, but to make its nature clear to you, my happy readers, who are privileged to live in Space. (我称我们的世界为平面国,这样称呼它并不是我的本意,而是为了让你们明…

【Linux】Rsync基于rsync-daemon认证的使用(rsync服务端与客户端发配置、排错思路、使用示例、优缺点及使用场景)

一、Rsync基于rsync-daemon认证的使用与 ssh 认证不同,rsync 协议认证不需要依赖远程主机的 sshd 服务,但需要远程主机开启 rsyncd 服务,本地 rsyncd 服务可不必开启。另外,rsync 协议认证不是直接使用远程主机的真实系统账号&…

【C++之容器篇】造轮子:list的模拟实现与使用

目录前言一、关于list1. 简介2. 成员类型二、默认成员函数1. 构造函数1. list()2. list(size_t n,const T& val T())和list(InputIterator first,InputIterator last)2. 拷贝构造函数3. 析构函数4. 赋值运算符重载函数三、迭代器1. 普通对象的正向迭代器2. const对象的正向…

多线程

标题创建多线程方式一:继承线程中常用方法和优先级多窗口卖票创建多线程方式二:实现Runnable接口多窗口卖票(使用Runable方式)进程的生命周期同步代码块解决实现Runable的线程安全问题方法一方法二使用同步方法处理实现Runable的线…

结构体熟练掌握--实现通讯录

魔王的介绍:😶‍🌫️一名双非本科大一小白。魔王的目标:🤯努力赶上周围卷王的脚步。魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍&#x1…

帮助中心在线制作工具推荐这4款,很不错哟!

根据用户咨询问题是否解决的情景,分为三个部分,首先帮助中心恰好有用户需要咨询的问题,用户可以通过点击相关问题即可解决自己的问题,其次,用户第一眼没有在帮助中心解决问题,有个搜索框,用户的…

为什么开发人员应该在 2023 年学习 Docker 和 Kubernetes

开发者你好,如果你想在 2023 年学习新的工具和技术,那么你应该考虑学习 Docker 和 Kubernetes,这是在这个微服务和云计算时代创建和管理容器的两个最重要的工具。随着微服务和云计算的兴起,Docker 和 Kubernetes 已经成为软件开发…

gg又来深圳

我们都喜欢的DGGgg是我在TCL的朋友,刚毕业的我们在TCL度过了一段非常欢快的时光,gg也是我们几十人中在TCL呆的特别久的,先是在深圳,然后转去了惠州,后面在惠州买房、结婚、定居、生娃。前几年举家回了西安、也从TCL离职…

ChatGPT到底是个啥 - 它甚至会和狗说话

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

2023.2.12(总结)

今天主要就是下午进行了一个测试,有三个困难版的题目我没有写出来,打算今天晚上好好磨磨,这里主要就只放一个题目。 C - Don’t be cycle Editorial / Time Limit: 2 sec / Memory Limit: 1024 MB Score : 300300 points Problem Statemen…