【操作系统】内存管理相关知识点

内存管理的作用:

  1. 内存空间的分配与回收,包括内存的管理和共享;
  2. 地址转换,把逻辑地址转换成响应的物理地址;
  3. 内存空间的扩充,利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存;
  4. 存储保护,保证各道作业在各自的存储空间内运行,互不干扰。

1. 存储管理方式

1.1 连续存储方式(分区技术):为一个用户程序分配一片 连续 的内存空间。

优点:设计简单,直接寻址,效率高。
缺点:会出现内部碎片,造成空间浪费,内存利用率低。

主要方式
(1)单一连续分配(静态分区技术):仅用于单用户单任务系统
(2)固定分区分配(静态分区技术):可用于多道系统
(3)动态分区分配(动态分区技术)

补充:
静态分区技术:作业装入时一次完成,分区大小及边界在运行时不能改变。
动态分区技术:根据作业大小动态地建立分区,分区的大小、数目可变。

1.2 离散存储方式(分区技术):允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为 分页存储管理方式分段存储管理方式。而分页存储管理方式根据运行作业时是否要把作业的所有页面都装入内存才能运行分为 基本分页存储管理方式请求分页存储管理方式

主要方式
(1)分页存储管理
(2)分段存储管理
(3)段页式存储管理

2. 连续存储方式

2.1 单一连续分配

存储管理方法:将内存分为 系统区(内存低端,分配给 OS 用)和 用户区(内存高端,分配给用户用) 。

分配方式静态分配,即作业一旦进入内存,就要等待它运行结束后才能释放内存。

特点:

  • 管理简单,只需少量的软件和硬件支持,便于用户了解和使用
  • 最简单的一种存储管理方式,但只能用于单用户、单任务的 OS 中
  • 因内存中只装入一道作业运行,内存空间浪费大,各类资源的利用率也不高

【举例】 一个容量为 256KB 的内存,操作系统占用 32KB,剩下224KB 全部分配给用户作业,如果一个作业仅需64KB,那么就有 160KB 的存储空间被浪费。
在这里插入图片描述

2.2 固定分区分配

存储管理方法:将内存空间划分为若干个固定大小的分区,除 OS 占一区外,其余的每个分区可以装入一道程序。静态分配,分区的大小可以相等,也可以不等,但事先必须确定,在运行时不能改变。固定分区分配方式是最早使用的一种 可运行多道程序 的存储管理方法。

分配方式:当某个用户程序要装入内存时,通常将分区按大小进行排队,由内存分配程序检索分区说明表,从表中找出一个满足要求的尚未分配的分区分配该程序,同时修改说明表中相应分区的状态;若找不到大小足够的分区,则拒绝为该程序分配内存。程序执行完毕,释放占用的分区,管理程序修改说明表中相应分区的状态为未分配,实现内存资源的回收。

划分分区的方法:

  • 分区大小相等:有利用一台计算机去控制多个相同对象的场合,缺点是缺乏灵活性。
  • 分区大小不等:把内存区划分成含有多个较小的分区、适量的中等分区及少量的大分区。

特点:

  • 管理简单,但因作业的大小并不一定与某个分区大小相等,从而使一部分存储空间被浪费,所以内存的利用率不高
  • 系统需建立一张分区说明表或使用表,以记录分区号、分区大小、分区的起始地址及状态(已分配或未分配)
    在这里插入图片描述

2.3 动态分区分配(可变分区分配)

存储管理方法:动态分区分配是一种动态划分存储器的分区方法,即内存不是预先划分好的,在作业装入时,根据作业的需求和内存空间的使用情况来决定是否分配。若有足够的空间,则按需要分割一部分分区给该进程,否则令其等待内存空间。

动态分区中的数据结构:

  • 空闲分区表:用来登记系统中的空闲分区(分区号、分区起始地址、分区大小及状态)
  • 空闲分区链:前、后向链接指针用于把所有的空闲分区链接成一个双向链,当分区被分配出去以后,前、后向指针无意义

分区分配工作

1)分配内存:从空闲分区表 / 链中找到所需大小的分区(具体怎么找看 【3. 动态分区分配算法】)。设 size 是不再切割的剩余分区的大小,请求分区大小为 u.size,空闲分区大小为 m.size,若 m.size - u.size ≤ size,将整个分区分配给请求者,否则从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表 / 链中。
在这里插入图片描述
2)回收内存:回收不再使用的内存空间。

  • 回收分区上邻接一个空闲分区,合并后首地址为空闲分区的首地址,大小为二者之和。
  • 回收分区下邻接一个空闲分区,合并后首地址为回收分区的首地址,大小为二者之和。
  • 回收分区上下邻接空闲分区,合并后首地址为上空闲分区的首地址,大小为三者之和。
  • 回收分区不邻接空闲分区,这时在空闲分区表中新建一表项,并填写分区大小等信息。
    在这里插入图片描述

特点: 管理简单,只需少量的软件和硬件支持,便于用户了解和使用,主存的利用率有所提高。

3. 动态分区分配算法

1)基于顺序搜索的动态分区分配算法:按照一定的分配算法从空闲分区表(链)中选出一个满足作业需求的分区分割,一部分分配给作业,剩下的部分仍然留在空闲分区表(链)中,同时修改空闲分区表(链)中相应的信息。

  • 首次适应算法(First Fit)
  • 循环首次适应算法(Next Fit)
  • 最佳适应算法(Best Fit)
  • 最坏适应算法(Worst Fit)

2)基于索引搜索的动态分区分配算法:

  • 快速适应算法(Quick Fit)
  • 伙伴系统(Buddy system)
  • 哈希算法(Hash)

3.1 基于顺序搜索的动态分区分配算法

(1)首次适应算法(First Fit)空闲分区(链)按地址递增的次序排列。在进行内存分配时,从空闲分区表(链)首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。

特点:优先利用内存低地址部分的空闲分区。但由于低地址部分不断被划分,留下许多难以利用的很小的空闲分区(碎片) ,而每次查找又都是从低地址部分开始,增加了查找可用空闲分区的开销。

(2)循环首次适应算法(Next Fit)循环首次适应算法又称为 下次适应算法,由首次适应算法演变而来。在为作业分配内存空间时,不再每次从空闲分区表(链)首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足其大小要求的空闲分区为止。然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。

特点:使存储空间的利用更加均衡,不至于使小的空闲区都集中在存储区的一端,但会导致缺乏大的空闲分区

(3)最佳适应算法(Best Fit)空闲分区表(链)按容量大小 递增 的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。将剩余空闲分区仍留在空闲分区表(链)中。第一次找到的能满足要求的空闲区必然是最佳的。

特点:若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只划分比作业稍大的空闲分区,从而保留了大的空闲分区。最佳适应算法往往使剩下的空闲区非常小,从而在存储器中留下许多难以利用的小空闲区(碎片)

(4)最坏适应算法(Worst Fit)空闲分区表(链)按容量大小 递减 的次序排列。在进行内存分配时,从空闲分区表(链)首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。

特点:总是挑选一个最大的空闲区给作业使用,其优点是可使剩下的空闲区不至于太小,产生碎片的几率最小,对中、小作业有利,但当有大作业到来时,其存储空间的申请可能会得不到满足

3.2 基于索引搜索的动态分区分配算法

基于顺序搜索的动态分区分配算法一般只是适合于较小的系统,如果系统的分区很多,空闲分区表(链)可能很长,检索速度会比较慢。为了提高搜索空闲分区的速度,大中型系统采用了基于索引搜索的动态分区分配算法。

(1)快速适应算法(Quick Fit)又称为 分类搜索法,把空闲分区按容量大小进行分类,经常用到长度的空闲区设立单独的 空闲区链表,系统为多个空闲链表设立一张 管理索引表

优点查找效率高,可以根据进程的长度,寻找到能容纳它的最小空闲区链表,取下第一块进行分配即可。该算法在分配时,不会对任何分区产生分割,所以能保留大的分区,也不会产生内存碎片。

缺点:在分区归还主存时算法复杂,系统开销较大。在分配空闲分区时是以进程为单位,一个分区只属于一个进程,存在一定的浪费。

(2)伙伴系统(Buddy System)固定分区方式不够灵活,当进程大小与空闲分区大小不匹配时,内存空间利用率很低。动态分区方式算法复杂,回收空闲分区时需要进行分区合并等,系统开销较大。伙伴系统是介于固定分区与可变分区之间的动态分区技术

伙伴:在分配存储块时将一个大的存储块分裂成两个大小相等的小块,这两个小块就称为 “伙伴” 。

伙伴系统的内存分配:
伙伴系统的内存释放:

(3)哈希算法(Hash)哈希函数也叫散列函数,是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值。

哈希既是一种查找技术,也是一种存储技术。可以用哈希函数建立从关键字空间到存储地址空间的映射。

若关键字为 k,计算出 Hash 函数值 Hash(k),把这个值(Hash 地址)存储为一个线性表,称为散列表或哈希表。

查找时,对于给定关键字,求哈希值,然后直接在哈希表中取得所查记录。 (不必顺序查表,查找速度比较快)

哈希算法:构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。

进行空闲分区分配时,根据所需空闲分区大小,通过哈希函数得到在哈希表中的位置,从中得到相应的空闲分区链表的表头指针。

4. 离散存储方式

4.1 分页存储管理方式

内存管理单元(Memory Management Unit,MMU)管理着 地址空间和物理内存的转换,其中的 页表(Page table) 存储着页(程序地址空间)和页框(物理内存空间)的映射表。

分页存储管理方式如果不具备页面置换功能,则称作 “基本分页存储管理方式”,要求将每个作业都装入内存后才能运行。

页面大小一般是 2 的整数幂,方便地址转换。页面大小应适中,若页面太小,页面数就会过多,页表也就越长,占用大量内存的同时增加硬件地址转换的开销,降低页面换入/换出的效率;页面过大会使页内碎片增大,降低内存利用率。

【分页存储方法】

分页存储管理将进程的逻辑地址空间分成若干个 大小相等 的块,每个块称为一页(Page)。其次,将内存物理地址空间也分为 同样大小 的块,每个块称为一页框(PageFrame)。页(Page)和页框(PageFrae)都是从 0 开始连续编号:0,1,2 等。进程在执行时需要申请内存空间,就是要为每个页面分配主存中的可用页框,即页和页框的一一对应。

当进程运行时,操作系统为每个进程建立一张 页表(记录进程逻辑地址空间和物理内存地址空间的对应关系),通过查找页表,就能找到每页对应的物理页框号。这种存储管理方式 允许把进程分配到不相邻的分区中,由于将内存固定大小分区,所以不存在外碎片,但是会有 内碎片(页内碎片)
在这里插入图片描述
页表(PMT/Page Mapping Table):在分页系统中,允许进程的各个页离散地存储在内存地任一物理块中,为保证进程仍然能够正确地运行,即能在内存中找到各个页面所对应地物理块,系统为每个进程建立了一张 页表,它的作用是 实现从页号到物理块号的地址映射

【虚拟地址到物理地址的转换】

地址变换机构:借助页表、页表寄存器完成作业逻辑地址(虚地址)到内存物理地址的变换。当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将虚地址变换为物理地址。

  • 基本地址变换
  • 具有快表的地址变换

页表寄存器(Page-Table Register,PTR):PTR 保存当前执行进程的页表的 起始地址页表的长度。页表可以由一组专门的寄存器实现,但寄存器成本高,而页表大,所以不可能所有页表都用寄存器实现。实际上,页表一般驻留在内存中,系统只设置一个 PTR。进程未执行时,页表始址和页表长度都存放在进程 PCB 中,当进程被调度时,才将这两个数据装入页表寄存器 PTR 中。因此在单处理机环境下,虽然运行了多个进程,但只需要一个页表寄存器。

分页地址结构:页号 P + 位移量 d(页内地址)
在这里插入图片描述
1. 基本地址变换过程假设页面大小为 4KB,CPU 发出虚拟地址:0010000000000100,那么后 12 位就是页内地址 d,前 4 位为页号 P,所以地址可分解为 0010000000000100。故得出该地址的虚拟页面为 2 号,页内偏移为 4。在页表中查找索引 2,其对应的块号(页框号)假设为 6(二进制为 110),则将该页框号和页内地址合并,得到物理地址为 0110 000000000100

1)地址转换时,先从页表控制寄存器中找到相应的页表,将目标页号与页表长度(页表项的个数)进行比较:

  • 若页号大于等于页表长度,表示所访问的地址超过了本进程的地址空间,系统发现错误并产生地址越界中断
  • 若未出现越界错误,则在页表中查找到目标页号(查找操作由硬件执行),具体做法是:页表始址 + 页号 x 页表项长度

2)通过目标页号,可以获得该页的物理块号,将块号放入物理地址寄存器中。同时将页内地址也放入物理地址寄存器的块内地址字段,完成逻辑地址到物理地址的变换。
在这里插入图片描述
2. 具有快表的地址变换过程增设若干具有并行查询能力的特殊 高速缓冲寄存器(联想寄存器 / 快表),存储当前执行进程的部分 / 全部页表表目。具体变换过程是:

1)CPU 给出虚地址后,由地址变换机构自动将该地址分为 页号 P 和 页内偏移量 d 两部分。
2)将页号 P 送入高速缓冲寄存器,并将此页号与快表中的所有页号进行比较:

  • 若找到匹配的页号,表示在快表中查到了要访问的页表项,直接从快表中读出页号所对应的物理块号,与页内偏移量拼接形成物理地址,并送到物理地址寄存器中;
  • 若未找到匹配的页号,则需要访问内存中的页表并作相同的查找和拼接操作。与此同时,将目标页表项存入快表中,如果快表已满,则操作系统将快表中存在时间久的的且已被认为不再需要的页表项换出。

3)根据物理地址访问内存数据。
在这里插入图片描述
页面是存放在内存中的,所以 CPU 存取数据需要两次访存,第一次是访问内存中的页表,根据虚地址形成物理地址;第二次是从内存的物理地址上获取所需数据。这是以时间换空间的做法,计算机处理速度慢,效率为 50%。而快表相当于 减少一次访存操作

补充:

  • 平均命中率:在分页系统中增加了快表后,在快表中找出所需页表项的概率称为平均命中率
  • 有效访问时间(Effective Access Time,EAT):是指给定逻辑地址找到内存中对应物理地址单元中的数据所花的总时间。
  • 若给出逻辑地址为 A,页面大小为 L,则页号 P 和页内地址 d 计算方式为:
    P = ⌊ A / L ⌋ d = A m o d L P = ⌊A / L⌋ \\ d = A mod L P=A/Ld=AmodL

4.2 分段存储管理方式

虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,可以动态增长,段内要求连续,段间不要求连续。

逻辑地址由 段号 S段内偏移量 W 两部分组成。页式系统中逻辑地址的页号和页内偏移量对用户是透明的,但段式系统的段号和段内偏移量必须由用户显式提供,高级程序设计语言中这个工作由编译程序完成。
在这里插入图片描述

4.3 段页式存储管理方式

页式存储管理 能有效提高内存利用率,段式存储管理 能反映程序的逻辑结构并有利于段的共享。段页式存储管理一方面具有段式存储的主要优点,用户程序可以模块化编写,程序段的共享和信息的保护都比较方便,程序可以在执行时再动态链接等。另一方面也具有页式虚拟存储器的主要优点,主存储器的利用率比较高,对辅助存储器的管理比较容易。

段页式系统中,作业的地址空间划分成多个拥有独立地址空间的逻辑段,再将每个段上的地址空间划分为大小相同的页。内存空间的管理和分页存储管理一样,将其分成若干和页面大小相同的存储块,对内存的分配以存储块为单位。

逻辑地址:段号 + 页号 + 页内偏移量。
地址变换:为每个进程建立一张段表,每个分段有一张页表。段表表项中至少包括段号、页表长度和页表起始地址,页表表项中至少包括页号和块号。系统还有一个 段表寄存器,指出作业的段表起始地址和段表长度。在进行地址变换时,首先通过段表查到页表的起始地址,然后通过页表找到页框号,最后形成物理地址

【分页和分段的比较】

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

5. 页面置换算法

请求分页系统建立在基本分页系统基础上,增加了 请求调页功能页面置换功能。请求分页系统只要求将当前需要的一部分页面装入内存,便可以启动作业运行。

在程序运行过程中,如果要访问的页面不在内存中,就会发生 缺页中断 从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。

页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。

页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。

抖动:频繁的页面调度行为称为抖动(或颠簸),此时进程在换页上用的时间多于执行时间。
工作集(驻留集):在某段时间间隔内,进程要访问的页面集合。经常被使用的页面需要在工作集中,而长期不被使用的页面要从工作集中被丢弃。为了防止系统出现抖动现象,需要选择合适的工作集大小。操作系统会跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。如果还有空闲物理块,则可以再调一个进程到内存以增加多道程序数。如果所有工作集之和增加以至于超过了可用物理块的总数,操作系统就会暂停一个进程,将其页面调出并将其物理块分配给其他进程,防止出现抖动现象。

5.1 最佳置换算法(OPT)

OPT,Optimal replacement algorithm

基本思想:所选择的被换出的页面将是 最长时间内不再被访问,通常可以保证获得 最低的缺页率。这是一种理论上的算法,因为无法知道一个页面多长时间不再被访问,但可以用来评价其他置换算法的优劣。

5.2 先进先出(FIFO,First In First Out)

基本思想:选择换出的页面是最先进入的页面,即 先进入内存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。 该算法会将那些经常被访问的页面换出,导致缺页率升高。

实现方法:将进入内存的页面根据先后顺序排成队列,需要换出页面时选择队头页面即可。

FIFO算法 实现简单,但 算法性能差。而且 FIFO 算法可能出现 Belady 异常,即当所分配的物理块数增大而页故障数不减反增的异常现象。

5.3 最近最久未使用(LRU,Least Recently Used)

基本思想:根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择 在最近一段时间内最久不用的页面 予以淘汰。

实现方法链表或者堆栈

  • 链表:维护一个页面链表,按照当前被使用的时间排列,最近使用的页面为头节点,最久未使用的页面为尾节点,每次访问页面后更新链表头节点,缺页中断时,淘汰尾节点的页面
  • 堆栈:维护一个页面堆栈,访问某个页面时,将该页号入栈并去除栈内的重复页,淘汰掉栈底的页面

LRU 算法 性能较好,但需要硬件支持,实现困难,开销大。LRU 是堆栈类的算法,堆栈类算法不可能出现 Belady 异常。

4,7,0,7,1,0,1,2,1,2,6

在这里插入图片描述

5.4 时钟置换算法(Clock)

Clock 算法又叫做 最近未使用(NRU,Not Recently Used)

OPT 算法性能最好,但无法实现;FIFO算法实现简单,但性能差;LRU 算法的性能接近于 OPT,但是实现起来比较困难且开销大;Clock 算法是一种性能和开销比较均衡的算法,属于 FIFO 和 LRU 的折中。

1)简单 Clock 置换算法(最近未使用 NRU)

简单 Clock 给每一帧附加了一个 “使用位”,当某一页首次装入某帧时,该帧使用位设置为 1;当该帧再次被访问到,且访问目标就是该帧所存数据时,该帧使用位也置为 1;当该帧被访问到,但访问目标非该帧的数据时,该帧使用位就置 0。当需要替换某一页时,操作系统扫描缓冲区,查找使用位为 0 的帧,每当遇到一个使用位为 1 的帧时,操作系统就将该位重新置 0。若所有帧的使用位均为 1,则指针在缓冲区会完整地扫描一周,将所有帧的使用位都置 0,然后回到最初的位置上,替换该帧中的页。

【举例】 页面走向为 3,4,2,6,4,3
在这里插入图片描述
1)第 1 个页面为 3,此时指针所指内存没有数据,且使用位为 0,于是 3 直接调入内存,并修改使用位为 1,指针后移。
2)第 2 个页面为 4,此时指针所指内存没有数据,且使用位为 0,于是 4 直接调入内存,并修改使用位为 1,指针后移。
3)第 3 个页面为 2,此时指针所指内存没有数据,且使用位为 0,于是 2 直接调入内存,并修改使用位为 1,指针后移。
4)第 4 个页面为 6,此时指针指向数据 3,且使用位为 1,不放入,将使用位置 0,指针后移。
5)此时指针指向数据 4,且使用位为 1,不放入,将使用位置 0,指针后移。
6)此时指针指向数据 2,且使用位为 1,不放入,将使用位置 0,指针后移。
7)此时指针指向数据 3,使用位为 0,可以装入 6,将使用位置 1,指针后移。
8)第 5 个页面为 4,此时指针恰好指向数据 4,将访问位置 1,指针后移。
9)第 6 个页面为 3,此时指针指向数据 2,且使用位为 0,可以装入 3,将使用位置 1,指针后移。
10)置换流程结束。

例子来源:操作系统时钟(CLOCK)置换算法

2)改进的 Clock 置换算法(二次机会法)

在简单 Clock 算法的基础上,增加了一个 “修改位(也叫脏位,dirty bit)”。这样每个页面都有两个状态位:R(访问位) 与 M(修改位),当页面被访问时设置页面的 R = 1,当页面被修改时设置 M = 1。其中 R 位会定期被清零,以区别最近没有被访问的页面和被访问的页面。当发生缺页中断时,操作系统检查所有页面及它们当前的 R 和 M 值,可以将页面分成以下四类:

  • R=0,M=0,最近未被访问,也未被修改
  • R=0,M=1,最近未被访问,但被修改
  • R=1,M=0,最近被访问,但未被修改
  • R=1,M=1,最近被访问,被修改

算法执行步骤

  • 从指针的当前位置开始,扫描帧缓冲区,寻找 R=0,M=0 的页面,将所遇到的第一个 R=0,M=0 的页面作为淘汰页,在第一次扫描期间不改变访问位 R;
  • 如果第一步未找到 R=0,M=0 的页面,则开始第二轮扫描,寻找 R=0,M=1 的页面,将所遇到的第一个 R=0,M=1 的页面作为淘汰页,再第二轮扫描期间,将所有扫描过的页面访问位 R 都置 0;
  • 如果第二步也未找到 R=0,M=1 的页面,此时指针返回到初始位置,将所有访问位 R 置 0,返回第一步。

改进的 Clock 算法会优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。

6. 虚拟内存

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

为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。

从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0 ~ 64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。

虚拟存储器:由于系统提供部分装入、请求调入和置换功能,给用户的感觉是好像存在一个比实际物理内存大得多的存储器。

虚拟内存实现方式:

  • 请求分页存储管理
  • 请求分段存储管理
  • 请求段页式存储管理

不论哪种实现方式,都需要硬件支持,包括:1)一定容量的内存和外存;2)页表机制(段表机制);3)中断机构;4)地址变换机构。


参考资料:
CS-Notes:内存管理
CS-Xmind-Note:计算机操作系统
【操作系统】连续分配存储管理方式
分页存储管理方式介绍及例题
分页存储 – 地址变换机构
操作系统之页面置换算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃饭就会放大招

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值