操作系统内存管理

内存管理

在这里插入图片描述

内存管理概念

内存管理的基本原理和要求

  • 尽管内存不断增大,但仍然不可能把所有用户进程和系统所需要的全部程序与数据放入主存,因此OS必须对内存空间进行合理划分和有效动态分配。定义:OS对内存的划分和动态分配。
  • 功能有:
    ①内存空间的分配和回收:OS完成主存空间分配和管理,使人工不负责分配。
    ②地址转换:把程序逻辑地址转换为物理地址。
    ③内存空间的扩充:利用虚拟存储技术/自动覆盖技术,逻辑上扩充内存。
    ④存储保护:保证各作业在各自内存空间内运行,互不干扰。
  • 在具体内存管理之前,首先要了解进程运行基本原理和要求:
    ①程序装入和链接:
    创建进程首先要将程序和数据装入内存,把用户源程序变成内存中执行程序:
    Ⅰ编译:编译程序把用户源代码编译成若干目标模块。
    Ⅱ链接:链接程序把编译好的一组目标模块以及所需要的库函数链接在一起,形成一个完整装入模块。
    Ⅲ装入:装入程序将装入模块装入内存中。
    在这里插入图片描述

程序链接有三种方式:
Ⅰ静态链接:程序运行之前,各模块及所需库函数链接成一个完整可执行程序,不再拆开。
Ⅱ装入时动态链接:把用户源程序编译后得到一组目标模块,装入时采用边装边链接。
Ⅱ运行时动态链接:对于某些目标模块的链接是在程序执行中需要该目标模块时才进行的,优点就是便于修改更新,便于实现对于目标模块的共享。
内存的装入也有三种方式:
Ⅰ绝对装入:编译时若知道程序所留内存位置,则编译程序之间产生绝对地址目标代码,装入模块中地址,且程序中逻辑地址和实际地址完全相同,因此不需要对于程序和数据的地址进行修改。绝对装入方式只适合于单道程序环境,
Ⅱ可重定位装入:多道程序环境下,多个目标模块的起始地址通常从0开始,程序中的其他地址都是相对于起始地址的,此时应该采用可重定位装入方式,根据内存当前情况装入适当位置,装入时对目标程序中指令和数据的修改过程称为重定位,地址变换通常是在装入时一次完成,又称静态重定位,特点就是一个作业装入内存时必须有所需全部内存空间,否则不能装入该作业,一旦进入内存,整个运行期间不能移动,也不能再申请内存空间。
Ⅲ动态运行时装入:也是动态重定位,程序在内存中若发生移动,则需要采用动态装入方式,装入内存后不立马把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行,因此钻杆如内存后所有地址为相对地址,需要要一个重定位寄存器支持。特点:可以把程序分配到不连续的存储区中,在程序运行之前可以只装入它的部分代码即可投入运行,在程序运行期间,根据需要动态申请分配内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
在这里插入图片描述

②逻辑地址空间与物理地址空间:
编译后,每个目标模块都从0开始编址,称为该目标模块的相对地址(逻辑地址),当链接程序链接成一个完整可执行程序时,链接程序顺序依次按照各个模块的相对地址构成统一的0号单元开始编址的逻辑地址空间。
而物理地址空间指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后通过物理地址从主存中获取,当装入程序将可执行代码装入内存时必须把逻辑地址转换为物理地址,这个过程称为重定位。
③内存保护:
内存分配前,保护OS不受用户进程影响,同时保护用户进程不受其他进程影响:
Ⅰ在CPU中设置上,下限寄存器,存放用户作业在主存中的上下限地址,每当CPU访问地址分别和上下限对比,判断是否越界。
Ⅱ采用重定位寄存器和界地址实现保护:重定位寄存器含最小物理地址值,界地址寄存器含逻辑地址的最大值,每个逻辑地址值必须小于界地址寄存器,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。
在这里插入图片描述

覆盖与交换

多道程序环境下扩充内存的两种方法。

  • 覆盖:由于程序运行时不是任何时候都需要访问程序和数据各个部分,所以把用户空间分成一个固定区和若干覆盖区,活跃部分放在固定区,其余部分按照调用关系进行分段,把即将访问的段放入覆盖区,其他段放入外存,需要调用再调入覆盖区,替换覆盖区中原有段。
    特点就是打破了全部信息装入内存后才能运行的限制,但同时运行代码大于主存的时候仍然不能运行,此外内存更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存。
  • 交换:把处于等待状态的程序从内存转到辅存,把内存空间腾出来,称为换出。把准备竞争CPU运行的程序从辅存移动到内存,这一过程又称为换入。(中级调度就是交换技术)
    特点就是主要在不同进程之间进行,而覆盖是同一个进程中。

连续分配管理方式

  • 指为一个用户程序分配一个连续的内存空间,包括单一连续分配和固定分区分配和动态分区分配。
  • 单一连续分配:系统分为系统区和用户区,系统区仅仅让OS使用,通常在低地址部分。这种方式无须内存保护,因为内存中永远只有一道程序,因此肯定不会因为访问越界而干扰其他程序。优点就是简单,无外部碎片,可以用覆盖技术。缺点是只用于单道程序系统。
  • 固定分区分配:最简单的多道程序存储管理方式,把用户内存空间划分为若干固定大小区域,每个分区只装入一道作业,当有空闲分区时便可以再从后备作业队列选择适当大小作业装入分区,而划分分区还有两种方法:①分区大小相等②分区大小不等(多个小分区,适量中分区,少量大分区)
    为了便于内存分配,通常按分区大小排队,建立分区说明表(包括每个分区起始地址,大小,状态是否分配)
    在这里插入图片描述

问题:程序可能大到任何分区装不下。且主存利用率低,当程序小于固定分区大小的时候也浪费了分区空间(称为内部碎片)。

  • 动态分区分配:进程装入内存时根据内存大小动态建立分区,使得分区大小合适进程。分区的大小和数目都是可变的。开始分配时是好的,但随着分配进行会产生若干小的内存块,这些小的内存块称为外部碎片,为了克服外部碎片通过“紧凑”技术来解决(OS对于进程的移动和整理)
    首次进程装入主存,OS确定分配哪个内存块给进程使用,分配策略算法:
    ①首次适应算法(First Fit):空闲分区以地址递增的次序链接,分配内存时顺序查找,找到第一个大小满足要求的第一个空闲分区。
    ②最佳适应算法(Best Fit):空闲分区按照容量递增形成分区链,找到第一个满足要求的空闲分区。
    ③最坏适应算法(Worst Fit):空闲分区按照容量递减形成分区链,找到第一个满足要求的空闲分区。
    ④邻近适应算法(Next Fit):由首次适应算法演变而来,分配内存时从上次查找结束的位置开始继续查找。
    在这里插入图片描述

非连续分配管理方式

  • 允许一个程序分散装入不相邻的内存区,也根据分区大小是否固定,分为分页存储管理方式和分段存储管理方式。
  • 分页存储模式又根据运行作业时是否把作业所有页面都撞入内存才能运行,分为基本分页存储管理方式和请求分页存储管理方式,只介绍基本分页存储管理方式。
    ①基本分页存储管理方式:
    固定分区产生内部碎片,动态分区产生外部碎片,内存利用率都比较低。为了避免碎片产生,引入分页思想:把主存空间划分为大小相等且固定的块,作为主存的基本单位,进程也以块为单位进行划分,进程在执行以块为基本单位逐个申请主存中的块空间。
    类似于固定分区,但本质不同:块大小比分区小很多,而且进程也按照块进行划分,所以即使有内部碎片也是很小的(页内碎片)。
    –几个基本概念:
    Ⅰ页面和页面大小:进程中的块称为“页”,内存中的块称为“页帧Page Frame”。外存也以同样的单位进行划分,直接称为块Block,进程执行需要申请主存空间,即要为每个页面分配主存中可用页帧,产生了页和页帧的一一对应。为了方便地址转换,页面大小应该是2的整数幂,大小适中。页面太小会使得进程页面数过多,页表过长,占用大量内存,增加硬件地址转换的开销,降低页面转入转出的效率。页面过大又会使页内碎片增多,降低内存利用率,所以大小应该适中,要在空间效率和时间效率间抉择。
    Ⅱ地址结构:页号P和页内偏移量W。地址长度为32位,0-11为页内地址,每页大小为4KB,12-31位为页号,地址空间最多允许2的20次方页。
    Ⅲ页表:为了便于内存中查找进程每个页面所对应的物理块,系统为每个进程建立一张页表,它记录页面在内存中对应的物理块号,页表一般放在内存中。页表由页表项组成的,第一部分是页号,第二部分与地址结构的第二部分共同组成物理地址。配置页表之后,进程执行时,通过查找该表,找到每页在内存中的物理块号。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GCPOlx90-1653057893675)(操作系统内存管理/9.jpg)]
    –基本地址变换结构:
    地址变换机构的任务是将逻辑地址转换为内存中的物理地址,地址变换是借助页表实现的。
    在这里插入图片描述

每次访问存储操作都需要从逻辑地址到物理地址,转换地址过程必须足够快,否则访问速度会降低。每个进程引入页表,用户存储映射机制,页表不能太大否则内存利用率降低。
–具有快表的地址变换结构:
若页表全部放在内存中,存取一个数据/指令至少访问两次内存,第一次是访问页表获取物理地址,第二次是存取数据/指令,显然比通常执行指令慢了一半。
为此增设了一个并行查找能力的告诉缓冲存储器——快表,又称TLB,用来存放当前访问的若干页表项,加速地址变化的过程,而主存中的页表常称为慢表。
在这里插入图片描述

–两级页表:
逻辑结构是一级页号+二级页号+页内偏移。为了压缩页表,进一步延申页表映射的思想。
②基本分段存储管理方式:
分页管理目的为了提高内存利用率,通过硬件实现。而分段提出考虑了用户和程序员,满足方便编程,信息保护和共享,动态增长,等多方面需要。
Ⅰ分段:按照用户进程中的自然段划分逻辑空间。每段从0开始编址,并且分配一段连续的地址空间,其逻辑地址由段号S和段内偏移量W两部分组成。段号16为,偏移量16位,一个作业最多2的16次方=65536段,最大段长为64KB。(页系统的S和W对于用户透明,而端系统则是由用户提供的)
在这里插入图片描述

Ⅱ段表:每个进程都有一个逻辑空间与内存空间映射的段表。
在这里插入图片描述

配置表之后,执行中的进程可以通过查找段表,找到每段所对应的内存区。
在这里插入图片描述

Ⅲ地址变换机构:实现进程从逻辑地址到物理地址的变换功能,再系统设置了段表寄存器,用于存放段表起始位置F和段表长度M。
在这里插入图片描述

Ⅳ段的共享和保护:通过两个作业的段表中响应表项指向被共享的段的同一个物理副本来实现的,不能修改的数据和代码可以共享。
③段页式管理方式:
作业地址空间首先分成若干逻辑段,每段都有自己段号,段分成若干大小固定的页,内存仍然分成和页面大小相同的块。

虚拟内存管理

虚拟内存的基本概念

  • 传统存储方式特征:①一次性:作业一次性装入内存,才可以运行,但如果作业大无法装入,且大量作业同时运行无法满足只能少部分作业先运行,多道程序度降低。②驻留性:作业装入之后不换出 ,可能长期等待状态。
  • 局部性原理:高速缓存依赖的就是局部性原理,有两方面:①时间局部性:程序中指令和数据可能大量循环执行。②空间局部性:程序访问某个存储单元,不久之后附近的存储单元也将被访问,即程序一段时间内访问的地址可能是集中在一定范围内。
    时间局部性通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存层次结构实现。空间局部性通常使用较大的高速缓存,并把预处理机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上建立了“内存-外存”的两级存储器机构,利用局部性原理实现高速缓存。
  • 虚拟存储器的定义和特征:
    基于局部性原理,程序装入时,把程序的一部分装入内存,其余部分留在外存,就可以启动程序运行。在程序执行过程中,当所访问信息不在内存时,由OS将所需的部分调入内存继续执行程序,OS把不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这时系统好像为用户提供了一个比实际内存大得多的存储器称为虚拟存储器。
    只是由于系统提供了部分装入,请求调出和置换功能之后,给用户感觉像存在一个比实际内存大得多的存储器。大小由计算机地址结构决定,并不是内存+外存,特征有:①多次性:作业无须一次性全部装入内存,允许多次调入内存运行。②对换性:作业无须一直等待在内存中, 允许换进换出。③虚拟性:逻辑上扩充内存容量。
  • 虚拟内存技术实现:
    允许一个作业多次调入内存,所以采用连续分配方式时使得相当一部分内存处于空闲,所以需要建立在离散分配的内存管理方式的基础上。有三种方式:请求分页存储管理,请求分段存储管理,请求段页式存储管理。
    但无论哪种方式都需要硬件支持:一定容量内存和外存,页表机制,中断机构,地址变换机构。

请求分页管理方式

  • 建立在基本分页系统基础上,为了支持虚拟存储区功能而增加了“请求调页”和“页面置换”功能,也是最常用的方法。请求分页管理方式中:只要求让当前需要的一部分页面装入内存便可开始运行作业,当访问页面内存中不存在时,再通过调页功能将其调入,同时还可以通过页置换功能把暂时不用的页面换出到外存,腾出内存空间。
  • 页表机制:
    在这里插入图片描述

比基本分页管理中页表项多个4个字段:
①状态位P:用于指示该页是已经调入内存。
②访问字段A:记录本页一段时间内被访问次数(页置换时使用)。
③修改位M:标识该页调入内存中是否被修改过。
④外存地址:该页外存上的地址,通常是物理块号。

  • 缺页中断机构:
    访问页面不在内存中,便产生缺页中断,请求操作系统把所缺少的页调入内存,此时应该把缺页的进程阻塞,若内存有空闲块,则分配一个块,把调入的页传入该块,并修改页表中相应页表项,无空闲块则要淘汰某页(淘汰的页如果修改过则要写回外存)。
    缺页中断作为中断,同样经历中断的几个步骤,但有两个明显区别:①在指令执行期间而非之后产生和处理中断信号,属于内部中断。②一条指令执行期间,可能产生多次缺页中断。
  • 地址变换机构:
    是在分页系统地址变换机构的基础上,为实现虚拟内存,增加了某些功能而形成的。地址变换时,先检索快表。
    在这里插入图片描述

页面置换算法

  • 进程运行访问页面不在内存中而需要把它调入,但内存已无空闲空间,就需要从内存中调出一页程序或数据送入磁盘的对换区。选择调出的页面算法就是页置换算法,好的页置换算法应该有较低的页面置换频率。

  • 最佳置换算法OPT:
    选择淘汰的页面是以后永不使用的页面,或是在最长时间内不再访问的页面,以保证最低的缺页率(但未知进程下不知道哪个是最长不被访问的,所以无法实现),但可以用作评价其他置换算法。
    在这里插入图片描述

  • 先进先出页面置换算法FIFO:
    优先淘汰先进入内存的页面,即留在内存最长时间的页面,但算法跟实际运行规律不符。而且FIFO算法还会产生所分配的物理块增大而页故障数不减反增的异常现象(Belady异常),而LRU和OPT算法不会出现Belady异常。
    在这里插入图片描述

  • 最近最久未使用置换算法LRU:
    选择最长时间为访问过的页面淘汰,过去时间未访问过的页面将来也不会访问。OPT是向后看,而LRU是向前看。LRU性能较好。
    在这里插入图片描述

  • 时钟置换算法CLOCK:
    LRU实现困难,开销大,且性能接近OPT。因此试图使用较小的开销但性能接近LRU的算法,都是CLOCK的变体。简单CLOCK算法给每帧关联一个附加位,称为使用位。当该页首次装入主存,使用位为1,随后再次被访问到时也为1。用于替换的候选帧集合视为一个循环缓冲区,并有一个指针与之关联,当某页被替换时该指针被设置指向缓冲区的下一帧,当需要替换一页时,OS把该位重新置为0。若开始过程时,缓冲区所有帧为0,则选择遇到第一个帧替换,若全为1,则指针在缓冲区完整循环一周,把所有使用位置为0,并停留在最初的位置,替换该帧的页,又称为最近未用算法(NRU)。
    通过增加使用位数目,可以使得CLOCK算法更高效,再增加一个修改位,得到改进型CLOCK置换算法,则出现四种情况:
    ①最近未被访问,也未被修改(u=0,m=0)
    ②最近被访问,但也未被修改(u=1,m=0)
    ③最近未被访问,但被修改(u=0,m=1)
    ④最近被访问,也被修改(u=1,m=1)
    算法步骤如下:
    ①指针从当前位置开始,扫描帧缓冲区,对使用位不作任何修改,选择遇到的第一个帧(u=0,m=0)用于替换。
    ②若①失败,则重新扫描,查找(u=0,m=1)的帧,选择第一个这样的帧替换,对于每个跳过的帧,使用位都设置为0.
    ③若②失败,则指针回到最初位置,且集合中所有帧使用位为0,重复①,若有必要重复②。

页面分配策略

  • 驻留集大小:
    对于分页式的虚拟内存,在进程准备执行时,不需要也不可能把一个进程所有页读入主存,因此OS决定读取多少页,即决定给特定的进程分配几个页框,就是这个进程的驻留集,考虑以下几点:
    ①分配给一个进程存储量越小,任何时候驻留在主存中的进程数越多,提高处理机时间利用率。
    ②一个进程主存中页数过少,则尽管有局部性原理,但页错误率仍然较高。
    ③页数过多,则局部性原理,给特定的进程分配更多的主存空间对该进程的错误率没有明显影响。
    基于这些因素,OS常采用三种策略:
    ①固定分配局部置换:物理块数量固定,数目不好确定,太少频繁缺页中断,太多资源利用率下降。
    ②可变分配全局置换:易实现,进程分配一定物理块,OS内也有空间物理块,发生缺页就去拿一个物理块给进程,并调页进其中,更加灵活。但盲目加物理块导致多道程序并发能力下降。
    ③可变分配局部置换:从该进程在内存的页面中选出一页换出,频繁换页则分配物理块,若缺页率低则减少物理块。不仅动态增加,还能减少,保证系统均衡。
  • 调入页面时机:
    两种策略:
    ①预调页策略:根据局部性定理,一次调入若干页可能比逐次搞笑,但调入很多未访问则是低效。所以预测为基础的预调页策略,预计不久之后被访问的页面预先调入内存。
    ②请求调页策略:进程运行中需要请求调页。缺点就是一次只能调一页。
    实际上预调页就是运行前调入,请求调页就是运行期间调入,一般两种策略同时使用。
  • 从何处调入页面:
    请求分页系统中的外存分为两部分:用于存放文件的文件去和用于存放兑换页面的对换区。对换区常用连续分配方式,文件区用离散分配方式,因此对换区IO速度比文件区更快,有三种情况:
    ①系统拥有足够对换区空间:可以全部从对换区调入页面,提高调页速度,所以进程运行前把所有的所需文件从文件区复制到对换区。
    ②系统缺少足够对换区空间:凡是不会被修改的文件都直接从文件区调入,修改的部分需要调入对换区,再从对换区调入内存。
    ③UNIX方式:与进程有关文件都放在文件区,因此未运行过的页面都在文件区调入,曾经运行过的放在对换区,因此下次调入时应从对换区调入。

抖动

页面置换时一种最糟糕情形是刚刚换出页面马上换入主存,频繁的页面调入行为就是抖动/颠簸,若一个进程在换页时间多于执行时间,则这个进程就在颠簸。主要原因就是,某个进程频繁访问的页面数目高于可用的物理页帧数。

工作集

指某段时间间隔内,进程要访问的页面集合,可用最近访问过的页面确定工作集。一般说,工作集W可由时间t和工作窗口大小来确定。
在这里插入图片描述

小结

  • 在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值