内存管理

1. 内存管理概念

内存管理:操作系统对内存的划分和动态分配

1.1 内存管理的功能

  • 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理
  • 地址转换。在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
  • 内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
  • 存储保护。保证各道作业在各自的存储空间内运行,互不干扰。

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

1.程序装入和链接
创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序包括以下步骤:

  • 编译:由编译程序将用户源代码编译成若干目标模块
  • 链接:由链接程序将编译后形成的一组目标模块及所需要的库函数链接在一起,形成一个完整的装入模块
  • 装入:由装入程序将装入模块装入内存运行

程序的链接有三种方式:

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

2.逻辑地址空间与物理地址空间

  • 编译后,每个目标模块都从0号单元开始编址,这称为该目标模块的相对地址(或逻辑地址)。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从0号单元开始编址的逻辑地址空间。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置。
  • 物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。

3.内存保护
内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法:

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

1.3 扩充内存

  1. 覆盖
    覆盖的基本思想:由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可把用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
    覆盖技术的特点:打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,此外,内存中能够更新的地方只有覆盖区的段,不在覆盖区中的段会常驻内存。

  2. 交换
    交换(对换)的基本思想:把处于等待状态(或在CPU 调度原则下被剥夺运行权利)的程序从内存移到辅存,把内存空间腾出来,这一过程又称换出;把准备好竞争CPU运行的程序从
    辅存移到内存,这一过程又称换入。

  3. 区别
    交换技术主要在不同的进程之间进行,而覆盖则用于同一个程序或进程。现代操作系统主要通过虚拟内存技术来解决,交换技术仍然有较强生命力,覆盖技术逐渐淘汰。

1.4 连续分配方式

  1. 单一连续分配
    内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分:用户区是为用户提供的、除系统区之外的内存空间。这种方式无须进行内存保护。因为内存中永远只有一道程序,因此肯定不会因为访问越界而干扰其他程序。这种方式的优点是简单、无外部碎片,可以采用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。
  2. 固定分区分配
    固定分区分配是一种多道程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。固定分区分配在划分分区时有两种不同的方法:(1)分区大小相等(2)分区大小不等,呈现递增趋势。这种分区方式存在两个问题:一是程序可能太大而放不进任何一个分区中,这时用户不得不使用覆盖技术来使用内存空间;二是主存利用率低,当程序小于固定分区大小时,也占用一个完整的内存分区空间,这样分区内部就存在空间浪费,这种现象称为内部碎片,同时不能实现多进程共享一个主存区
  3. 动态分区分配
    属于多道程序存储管理方式,不预先划分内存,而是在进程装入内存时,根据进程的大小动态地建立分区,使分区大小正好适合进程需要。但是当一个进程执行完毕之后,使用的分区还会保存,这时如果插入一个小于该分区的进程,余下的空间称作外部碎片

1.5 非连续分配方式

非连续分配管理方式根据分区的大小是否固定,分为分页存储管理方式和分段存储管理方式;分页存储管理方式根据运行作业时是否需要把作业的所有页面都存入内存才能运行,分为基本分页存储管理方式和请求分页存储管理方式

基本分页存储管理方式

把主存空间划分为大小相等且固定的,块相对较小,作为主存的基本单位。每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间。块的大小相对分区要小很多,而且进程也按照块进行划分,进程运行时按块申请主存可用空间并执行。这样,进程只会在为最后一个不完整的块申请一个主存块空间时,才产生主存碎片,所以尽管会产生内部碎片,但这种碎片相对于进程来说也是很小的,每个进程平均只产生半个块大小的内部碎片(也称页内碎片)

  1. 页面和页面大小
    进程的块称作页,内存的块成为页框,外存的块就称作块
    页面大小是2的整数次幂,大小应适中,避免页表过长或碎片过大

  2. 地址结构
    地址结构包含两部分:前一部分为页号P,后一部分为页内偏移量W.地址长度为32位,其中0~ 11位为页内地址,即每页大小为4KB;12~31位为页号,地址空间最多允许220

  3. 页表
    作用是实现从页号到物理块号的地址映射。页表由页表项组成,页表项由两部分组成,第一部分是页号,第二部分是物理内存中的块号。页表项的第二部分与地址的第二部分共同组成物理地址。

基本分段存储管理方式

  1. 分段
    段式管理方式按照用户进程中的自然段划分逻辑空间。例如,用户进程由主程序、两个子程序、栈和一段数据组成,于是可以把这个用户进程划分为5段,每段从0开始编址,并分配一段连续的地址空间(段内要求连续,段间不要求连续),其逻辑地址由段号S与段内偏移量W两部分组成。

  2. 段表。每个进程都有一张逻辑空间与内存空间映射的段表,其中每个段表项对应进程的一段,段表项包括段号、该段在内存中的始址和长度。

段页式管理方式

页式存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享。将这两种存储管理方法结合起来,便形成了段页式存储管理方式。
在段页式系统中,作业的地址空间首先被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。对内存空间的管理仍然和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位。段表只有一个,而页表可能有多个

分页与分段的比较

对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段。
地址空间的维度:分页是一维地址空间,分段是二维的。
大小是否可以改变:页的大小不可变,段的大小可以动态改变。
出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。

2. 虚拟内存管理

2.1 基本概念

局部性原理

  1. 时间局部性。程序中的某条指令一旦执行,不久后该指令可能再次执行;某数据被访问过,不久后该数据可能再次被访问。产生时间局部性的典型原因是程序中存在着大量的循环操作。
  2. 空间局部性。一旦程序访问了某个存储单元,在不久后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。

虚拟存储器
通过系统部分装入、请求调入和置换功能实现一个虚拟存储器,主要特征有:

  1. 多次性:作业无须一次性全部装入内存,允许被分成多次调入内存
  2. 对换性:无须在作业运行时一直常驻内存,而允许在作业的运行过程中,进行换进和换出。
  3. 虚拟性:指从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量。

虚拟内存的作用
虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存

2.2 虚拟内存实现

基本原理:
程序分成的页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。

2.2.1 请求分页管理方式

请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存中时,再通过调页功能将其调入,同时还可通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。
硬件支持:

  1. 页表机制
    目的:解决作业运行过程中需要访问的页面不在内存中的情况
    请求页表项包含6个字段:页号、物理块号、状态位P、访问字段A、修改位置M、外存地址
    增加的四个字段:
    状态位P。用于指示该页是否已调入内存,供程序访问时参考。
    访问字段A。用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供置换算法换出页面时参考
    修改位M。标识该页在调入内存后是否被修改过。
    外存地址。用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。

  2. 缺页中断机构
    在请求分页系统中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞(调页完成唤醒),若内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中的相应页表项,若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。
    缺页中断作为中断,同样要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序、恢复CPU环境等几个步骤。但与一般的中断相比,它有以下两个明显的区别:在指令执行期间而非一条指令执行完后产生和处理中断信号,属于内部中断;一条指令在执行期间,可能产生多次缺页中断。

  3. 地址变换
    在进行地址变换时,先检索块表:若找到要访问的页,则修改页表项中的访问位(写指令还需要重置修改位),然后利用页表项中给出的物理块号和页内地址形成物理地址。若未找到该页的页表项,则应到内存中去查找页表,再对比页表项中的状态位P,看该页是否已调入内存,未调入则产生缺页中断,请求从外存把该页调入内存。

2.2.2 页面置换算法

在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)

  1. 最佳置换算法OPT
    选择的被淘汰页面是以后永不使用的页面,或是在最长时间内不再被访问的页面,以便保证获得最低的缺页率。该算法无法实现,可用来评价其他算法。

  2. 先进先出页面置换算法 FIFO
    优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。该算法会将那些经常被访问的页面换出,导致缺页率升高

  3. 最近最久未使用(LRU)置换算法
    选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面是最近最久未访问的。

  4. 第二次机会算法
    FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:
    当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉;如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索。

  5. 时钟
    第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面连接起来,再使用一个指针指向最老的页面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值