操作系统之内存管理篇

x33g5p2x  于2021-11-21 转载在 其他  
字(4.7k)|赞(0)|评价(0)|浏览(483)

本文参考于王道计算机考研操作系统Guide哥的面经

1. 内存管理

1.1 内存的概念和作用

(1)、内存是什么?

内存其实就是一块存储空间,但是它的容量十分有限,所以我们需要对其进行合理的分配和回收,那么这个艰巨的任务由操作系统完成。

(2)、内存的位置

如下图所示:

(3)、内存的作用
众所周知,CPU的处理速度十分之快,而相关的访问相应的外存的速度十分慢。那么这样导致了一个速度差。访问外存的速度会严重影响CPU的处理速度。所以就引入了相关的内存。它处于外存和CPU之间。它里面放置的是需要执行的代码和相应的数据。然而,相关的数据和代码并不会长期存留在内存中,操作系统会对内存空间进行分配和回收。这个我们后面会详细的讲述。内存位于主机内部,CPU访问它的速度相对较快,从而提高了系统的整体性能。

1.2 操作系统的内存管理主要做什么?

(1)、操作系统的主要事务

  1. 操作系统的内存管理主要负责内存的分配与回收(malloc 函数:申请内存,free 函数:释放内存)。
  2. 另外就是地址转换地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。
  3. 对内存空间的扩充(虚拟性)
  4. 对内存的保护

1.3 内存空间的扩充技术

(1)、覆盖技术
内存中分为一个固定区和多个覆盖区固定区的数据信息是常驻内存的,而覆盖区的数据信息会根据系统的需要从而进行调入和调出

(2)、交换技术

交换技术就是将一些暂时未运行的进程调出内存,把外存一些已经具备运行条件的进程调入内存

1.4 常见的几种内存管理机制

简单分为连续分配管理方式非连续分配管理方式这两种。连续分配管理方式是指为一个用户程序分配一个连续的内存空间,常见的如 块式管理 。同样地,非连续分配管理方式允许一个程序使用的内存分布在离散或者说不相邻的内存中,常见的如页式管理 和 段式管理

  1. 块式管理 (以块为单位) : 远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片(内部碎片外部碎片)。
  2. 页式管理以页为单位) :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大(页比块小),提高了内存利用率,减少了碎片。 页式管理通过页表对应逻辑地址和物理地址。
  3. 段式管理以段为单位): 页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义(只对操作系统有意义)。 段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多 。但是,最重要的是段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
  4. 容易忘记的:段页式管理段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制 中段与段之间以及段的内部的都是离散的。

1.5 连续分配方式

(1)、单一连续分配

(2)、固定分区分配

相关的分区说明表

(3)、动态分区分配

(4)、内部碎片和外部碎片

  1. 内部碎片:分配给某些进程的内存区域中,有些难以利用的部分,一般比较大。
  2. 外部碎片: 指内存中有些空闲分区由于太小而难以利用。

1.6 动态分区分配的四种算法

(1)、首次适应算法
顾名思义:操作系统会对内存条的分区从上往下扫描,遇到的第一个满足需求的分区会被分配给相应进程

(2)、最佳适应算法

算法思想:
从相应的内存地址从上往下扫描,找到一个满足进程需求的且是最接近进程的容量需求的分区进行分配。

缺点:

会产生很多的外部碎片

(3)、最坏适应算法

算法思想:
从相应的内存地址从上往下扫描,找到一个满足进程需求的且是所剩分区中容量最大的的分区进行分配。

缺点:
虽然这种算法可以减少外部碎片的产生,但是后面“大进程”到来时,就没有内存分区可以使用了

(4)、临近适应算法

算法思想:
从低地址向高地址扫描,找到一个满足进程需求的分区进行分配。

缺点:

会导致低地址部分出现很多的空闲分区

(5)、四种算法的归纳与比较

1.7 分页存储

(1)、为什么要进行分页存储?

连续分配有很多的缺点:

  1. 固定分区分配:会导致内存中产生很多的内部碎片
  2. 动态分区分配:会导致内存中产生很多的外部碎片

所以为了提高内存的利用率,进而引入非连续内存分配,而分页存储是非连续内存分配方式中的一种

(2)、分页存储思想
内存块分成一个个大小相等的分区,然后将相应的进程所需要的内存容量按照分区大小进行划分。

(3)、分页存储中逻辑地址到物理地址的转化

补充概念:

  1. 逻辑地址: 比如在 C 语言中,指针里面存储的数值就可以理解成为内存里的一个地址,这个地址也就是我们说的逻辑地址,逻辑地址由操作系统决定
  2. 物理地址: 物理地址指的是真实物理内存中地址,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元真正的地址

(4)、快表的引入

引入原因:
为了解决虚拟地址到物理地址的转换速度,操作系统在 页表方案 基础之上引入了 快表 来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的高速缓冲存储器(Cache),其中的内容是页表的一部分或者全部内容。作为页表的 Cache,它的作用与页表相似,但是提高了访问速率。由于采用页表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。

快表存储的内容:

快表里面存储的是最近频繁访问的页表的页表项

引入快表后的逻辑地址到物理地址的转化

访问流程:

  1. 根据虚拟地址中的页号查快表
  2. 如果该页在快表中,直接从快表中读取相应的物理地址
  3. 如果该页不在快表中,就访问内存中的页表,再从页表中得到物理地址,同时将页表中的该映射表项添加到快表中
  4. 快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页

(5)、多级页表的引入

为什么引入多级页表?

引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间比如说一个进程进行作业时,它只需要访问几个特定的页面,而不需要全部的页面。),特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景。

1.8 分段存储

(1)、分段存储思想
内存块分成一个个大小相等的分段,然后将相应的进程所需要的内存容量按照段大小进行划分。

(2)、分段的逻辑结构

(3)、地址变换

1.9 分页存储和分段存储的共同点和区别

  1. 共同点 :
  • 分页机制和分段机制都是为了提高内存利用率,较少内存碎片
  • 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的
  1. 区别 :
  • 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序。
  • 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需要

1.10 段页式存储

(1)、分页和分段的优缺点

(2)、相关思想
综合利用分段和分页的思想对进程按逻辑模块进行分段处理,再对段进行分页。

(3)、管理的逻辑地址

(4)、地址变换过程

2. 虚拟内存

2.1 什么是虚拟内存?

(1)、虚拟内存的概念

很多时候我们使用点开了很多占内存的软件,这些软件占用的内存可能已经远远超出了我们电脑本身具有的物理内存为什么可以这样呢? 正是因为 虚拟内存 的存在,通过 虚拟内存 可以让程序可以拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。 这样会更加有效地管理内存并减少出错。

(2)、虚拟地址的意义
虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且 把内存扩展到硬盘空间

2.2 局部性原理

(1)、相关概念

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

  1. 时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。
  2. 空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存

2.3 虚拟内存的实现方式

(1)、实现方式

  1. 请求分页存储管理建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中
  2. 请求分段存储管理 :建立在分段存储管理之上,增加了操作系统也可以将暂时不用的页面置换到外存中功能。请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。
  3. 请求段页式存储管理

(2)、请求分页存储管理的缺页中断的地址变换

(3)、请求分页与分页存储管理的区别

  1. 请求分页存储管理建立在分页管理之上。他们的根本区别是否将程序全部所需的全部地址空间都装入主存,这也是请求分页存储管理可以提供虚拟内存的原因
  2. 它们之间的根本区别在于是否将一作业的全部地址空间同时装入主存请求分页存储管理不要求将作业全部地址空间同时装入主存。基于这一点,请求分页存储管理可以提供虚存,而分页存储管理却不能提供虚存

(4)、上述实现方式的前提条件

  1. 一定容量的内存和外存:在载入程序的时候,只需要将程序的一部分装入内存,而将其他部分留在外存,然后程序就可以执行了;
  2. 缺页中断:如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;
  3. 虚拟地址空间逻辑地址到物理地址的变换

2.4 页面置换算法

(1)、OPT 页面置换算法(最佳页面置换算法)
最佳(Optimal, OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。

(2)、FIFO(First In First Out) 页面置换算法(先进先出页面置换算法)

算法思想:
总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰

(3)、LRU (Least Recently Used)页面置换算法(最近最久未使用页面置换算法)

算法思想:
LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰

(4)、LFU (Least Frequently Used)页面置换算法(最少使用页面置换算法)

算法思想:
该置换算法选择在之前时期使用最少的页面作为淘汰页。

相关文章