三、内存管理

在这里插入图片描述
程序员—(编写)—源代码文件—(编译)—目标模块—(连接)—装入模块—(装入)—内存

程序的链接

静态链接: 在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。
装入时动态链接: 将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。
运行时动态链接: 对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。 其优点是便于修改和更新,便于实现对目标模块的共享。

程序的装入

由装入程序将装入模块装入内存运行。
绝对装入: 在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,因此不需对程序和数据的地址进行修改。
静态重定位: 静态重定位就是指在装入一个作业时,把作业中的指令地址和数据地址全部转换成绝对地址。转换工作是在作业开始前集中完成的。在作业执行过程中无需再进行地址转换。
动态重定位: 装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。

地址空间

逻辑地址空间: 编译之后,每个目标块都从0号单元开始编址,这称为该目标模块的逻辑地址。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依此按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。
物理地址空间: 物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址。

内存保护

内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。
上下限寄存器: 在CPU中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU 要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
基址、限长寄存器: 采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。

分区方式

连续分配

单一连续分配

内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,用户区是为用户提供的。这种方式无须进行内存保护,因为内存中永远只有一道程序。

固定联系分配

固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适 当大小的作业装入该分区,如此循环。
这种分区方式存在两个问题:
一是程序可能太大而放不进任何一个分区中,这时用户不得不使用覆盖技术来使用内存空间;
二是主存利用率低,当程序小于固定分区大小时,也占用一个完整的内存分区空间,这样分区内部就存在空间浪费,这种现象称为内部碎片

动态分区分配

动态分区分配又称可变分区分配,是一种动态划分内存的分区方法。这种分区方法不预先划分内存,而是在进程装入内存时,根据进程的大小动态地建立分区。可能回出现外部碎片。

分区分配算法
首次适应

空闲分区以地址递增的次序链接。分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。

最佳适应

空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲分区。

最坏适应

又称最大适应算法,空闲分区以容量递减的次序链接,找到第一个能满足要求的空闲分区,即挑选出最大的分区。

邻近适应

又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找。

紧凑与动态重定位

动态重定位机制需要硬件的支持,增加重定位寄存器(分区首址寄存器),保存分区起始地址,当进行紧凑内存空间时,只需移动分区内容,然后用新的分区起始地址重置分区首址寄存器。

非连续分配

非连续分配允许一个程序分散地装入不相邻的内存分区,当然,这也需要额外的空间去存储它们的索引。

基本分页

基本概念

页面和页面大小:进程中的块称为页,内存中的块称为页框( 或页帧)。外存也以同样的单位进行划分,直接称为块。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。
地址结构:地址结构包含两部分:前一部分为页号P,后一部分为页内偏移量W。
页表:为了便于在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立一张页表,它记录页面在内存中对应的物理块号,页表一般存放在内存中。
页表与地址结构的区别: 页表是由页表项组成的,初学者容易混淆页表项与地址结构,页表项与地址都由两部分构成,而且第一部分都是页号,但页表项的第二部分是物理内存中的块号,而地址的第二部分是页内偏移;页表项的第二部分与地址的第二部分共同组成物理地址。

基本地址转换机构

地址变换机构的任务是将逻辑地址转换为内存中的物理地址。地址变换是借助于页表实现的。
在这里插入图片描述
在这里插入图片描述

具有快表的地址变换机构

在地址变换机构中增设一个具有并行查找能力的高速缓冲存储器快表,又称相联存储器(TLB),用来存放当前访问的若干页表项,以加速地址变换的过程。
在这里插入图片描述

基本分段

分页管理方式是从计算机的角度考虑设计的,目的是提高内存的利用率,提升计算机的性能。 分页通过硬件机制实现,对用户完全透明。分段管理方式的提出则考虑了用户和程序员,以满足方便编程、信息保护和共享、等多方面的需求。

段表

每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的 一段,段表项记录该段在内存中的始址和长度

逻辑地址

在这里插入图片描述

地址转换机构

在这里插入图片描述
在这里插入图片描述

评价

有效消除了内零头,提高了存储利用率。(采用动态分配)
允许子程序独立编译和修改,而不需要重新编译或链接其它相关子程序。
容易实现存储共享。
具有较高的安全保障。
很容易满足程序段的动态增长需要 。
通常需要编译器的支持。

分段与分页的区别

  1. 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。段则是信息的逻辑单位,它含有一组意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
  2. 页的大小固定且由系统决定,因而在系统中只能有一种大小的页面,而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
  3. 分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

段页式

在段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。

逻辑地址

在段页式系统中,作业的逻辑地址分为三部分:段号、页号和页内偏移量

地址转换

在这里插入图片描述
为了实现地址变换,系统为每个进程建立一张段表,每个分段有一张页表。段表表项中至少 包括段号、页表长度和页表始址,页表表项中至少包括页号和块号。此外,系统中还应有一个段 表寄存器,指出作业的段表始址和段表长度(段表寄存器和页表寄存器的作用都有两个,一是在 段表或页表中寻址,二是判断是否越界)。
注意:在一个进程中,段表只有一个,而页表可能有多个。
在进行地址变换时,首先通过段表查到页表始址,然后通过页表找到页帧号,最后形成物理 地址。如图3.19所示,进行一次访问实际需要三次访问主存,这里同样可以使用快表来加快查找 速度,其关键字由段号、页号组成,值是对应的页帧号和保护码。
结合上面对段式管理和页式管理的地址空间的分析,可以得出结论:段页式管理的地址空间是二维的。

分页式、段式、段页式存储管理优缺点。

分页式存储管理:
优点:内存利用率高、实现了离散分配、便于存储访问控制、无外部碎片。
缺点:需要硬件支持(尤其是快表)、内存访问效率下降、共享困难、内部碎片。
段式存储管理:
优点:便于程序模块化处理和处理变换的数据结构、便于动态链接和共享、无内部碎片。
缺点:需要硬件支持、为满足分段的动态增长和减少外部碎片,要采用拼接技术、分段的最大尺寸受到主存可用空间的限制、外部碎片。
段页式存储管理:
优点:兼有以上优点。 缺点:多访问一次内存,有内部碎片。

内存扩充

覆盖

覆盖的基本思想如下:由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可把用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。

交换

换出

交换的基本思想是,把处于等待状态的程序从内存移到辅存,把内存空间腾出来,这一过程又称换出;
系统选择处于阻塞状态且优先级最低的进程作为换出进程,启动磁盘,将该进程的程序和数据传送到磁盘的对换区上。然后回收该进程所占用的内存空间,并对该进程的进程控制块、内存分配表做相应的修改。需判断要换出的程序和数据段是否有共享,动态链接到其他进程中

换入

把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称换入。
系统定时地查看所有进程的状态,从中找出“就绪”状态但已换出的进程;将其中换出时间最久的进程作为换入进程;
有能满足进程需要的内存时可将之换入,否则需先腾出足够空间

覆盖技术与虚拟存储技术有何本质不同?

技术有何相同与不同之处?
覆盖技术与虚拟存储技术最本质的不同在于覆盖程序段的最大长度要受内存容量大小的限制,而虚拟存储器中程序的最大长度不受内存容量的限制,只受计算机地址结构的限制。另外,覆盖技术中的覆盖段由程序员设计,且要求覆盖段中各个覆盖具有相对独立性,不存在直接联系或相互交叉访问;而虚拟存储技术对用户的程序段之间没有这种要求。

交换技术与虚拟存储技术中使用的调入/调出有何本质不同?

交换技术就是把暂时不用的某个程序及数据从内存移到外存中去,以便腾出必要的内存空间,或把指定的程序或数据从外存读到内存中的一种内存扩充技术。
相同点:都在内存与外存之间交换信息。
区别:交换技术调入/调出整个进程,因此一个进程的大小要受内存容量大小的限制;而虚存中使用的调入/调出技术在内存和外存间来回传递的是页面或分段,而不是整个进程,从而使得进程的地址映射具有了更大的灵活性,且允许进程的大小比可用的内存空间大

虚拟内存

基本概念

在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理存储容量大得多,可寻址的“主存储器”,叫做虚拟存储器。虚拟存储区的容量与物理内存无关,而受限于计算机的地址结构和可用磁盘容量(内存+外存)。

局部性原理:

时间局部性:程序中的某条指令一旦执行,不久后该指令可能再次执行。
空间局部性:一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问。

请求分页管理方式

页表机制

在这里插入图片描述
状态位P:用于指示该页是否已调入内存,供程序访问时参考。
访问字段:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供置换算法换出页面时参考。
修改位M:标识该页在调入内存后是否被修改过。
外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。

缺页中断

在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系 统将所缺的页调入内存。此时应将缺页的进程阻塞(调页完成唤醒),若内存中有空闲块,则分 配一个块,将要调入的页装入该块,并修改页表中的相应页表项,若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。

地址变换

在这里插入图片描述

置换算法

最佳置换算法OPT

最佳置换算法选择的被淘汰页面是以后永不使用的页面,或是在最长时间内不使用的算法,只在理论上存在,现实中是无法实现的。

先进先出置换算法FIFO

优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。

最近最久未使用置换算法LRU

选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值