第七章 存储管理

7.1 简述实际的三级存储器体系的结构(组成)和基本原理?

三级存储器体系的结构

三级存储器体系的结构

三级存储体系包括Cache(快、小、贵)、内存(适中)、外存(慢、大、廉)。
基本原理:当内存太小不够用时,用外存来支援内存;暂时不运行的模块换出到外存上,必要时再换入内存。

7.2 存储管理有哪四大功能?

地址映射:把程序中的地址(虚拟地址/虚地址/逻辑地址)变换成内存的真实地址(实地址/物理地址)的过程;
虚拟存储:解决内存过大造成的内存不够和多程序并发时的地址冲突问题;
内存分配:为程序运行分配足够内存空间;
存储保护:保证内存中的多道程序只能在给定的存储区域中活动并互不干扰。

7.3 有哪三种地址映射方式?

固定地址映射:编程或编译时确定逻辑地址和物理地址映射关系,程序加载时必须放在指定的内存区域,容易产生地址冲突、运行失败,程序装入后不能移动,程序占用连续的内存空间。
静态地址映射:程序装入时由操作系统完成逻辑地址到物理地址的映射,程序运行前确定映射关系,程序装入后不能移动,程序占用连续的内存空间。
动态地址映射:程序执行过程中把逻辑地址转换为物理地址,程序占用的内存空间可动态变化,不要求占用连续空间,便于多个进程共享,但需要内存管理单元的硬件支持,软件复杂。

7.4 为何需要地址映射功能或者它的的作用是什么?在VS(C/C++)开发环境中,我们用”int i,j ;” 定义的i,j变量与地址是什么关系?

地址映射可以让用户方便的读写物理地址,直接使用物理地址比较繁琐,而且不安全。
在VS(C/C++)开发环境执行”int i,j ;”时,编译器将为其分配两块大小为 int型数据所占的内存空间,编译器自动的将其存放在空闲内存空间中。

7.5 何为动态地址映射?有什么特点?

动态地址映射是指程序执行过程中把逻辑地址转换为物理地址。
将地址分为逻辑地址VA和基址BA,物理地址MA等于VA+BA,如果程序移动,根据移动后的BA自动计算MA,从而实现动态映射。
程序占用的内存空间可动态变化,不要求占用连续空间,便于多个进程共享,但需要内存管理单元的硬件支持,软件复杂。

7.6 什么是分区存储管理?有哪些类型?

分区存储管理是指把用户区内存划分为若干大小不等的分区供不同程序使用,分为两种类型。
固定分区:把内存固定地划分为若干个大小不等的分区供各个程序使用,每个分区的大小和位置都固定,系统运行期间不再重新划分。
动态分区:在程序装入时创建分区,使分区大小刚好与程序的大小相等,分区动态建立,分区个数和大小可变,存在内存碎片。

7.7 虚拟内存管理的目标是什么?

使大程序可以在小内存中运行;
使多个程序可以在小内存中运行;
使多个程序并发运行时地址不冲突;
使内存利用率高:无碎片,共享方便。

7.8 使用虚拟存储管理功能的操作系统,还需不需要真是的内存?

虚拟内存技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。
而计算机并不能自己访问硬盘,只能访问内存或者Cache,虚拟内存技术将程序部分内容放到内存中。本质上还是储存在内存上被CPU使用。

7.9 分区存储管理用在专用的,具有特定工作任务的,嵌入式系统中,可不可行?

可以。如果嵌入式系统大多数时间执行单任务,那就适合不分区,简单,无需复杂硬件支持,也提高了内存利用率。

7.10 何为放置策略?有哪些防止策略?各种防止策略的特点或优点是什么?

放置策略是指空前区表排序原则。
最佳适应法将空闲区表按大小递增排序,优点是尽可能先使用较小空闲区,当需要较大分区时有较大的满足可能性。但在内存中留下许多难以利用的碎片。
最坏适应法将空闲区表按大小递减排序,优点是大空闲区分割后剩余部分还是很大,还能装下较大的分区,仅一次查找就可找到所有分区,不易产生碎片,对中小型文件分配分区操作有利。但造成存储器中缺乏大的空闲区,对大型文件的分区分配不利。
首次适应法将空闲区表按首址递增排序,尽可能先使用低地址空间,当需要较大分区时在高地址空间有较大的满足可能性,方法易于实现,但每次查找都从低址开始,增加查找开销。

7.11 何为内存覆盖技术(Overlay)?有何缺点?

内存覆盖技术将内存分为多个区间,将程序的不同段按需取用,解决大程序在小内存中的运行问题。
缺点:
编程复杂,程序员划分程序模块并确定覆盖关系,模块过大无法运行;
程序执行时间长,程序从外存装入内存,涉及I/O操作耗时长。

7.12 何为内存交换技术(Swapping)?有何优缺点?

内存交换技术是指当内存不够时将进程写到磁盘(称为换出过程),当进程要运行时重新写回内存(称为换入过程)。
优点:增加程序并发数,不考虑程序结构。
缺点:换入和换出增加CPU开销,交换单位太大,为整个进程。

7.13 内存交换技术在实现过程,为何要考虑地址重定位的问题?

因为旧模块取出后新模块换入前,原内存位置可能被其他程序占用,所以新模块换入要重新分配内存空间。

7.14 内存在分配过程中产生碎片的本质是什么?有哪些方法可以消除或减轻碎片问题?

产生碎片的本质是: 过小的空闲区满足不了程序所需内存, 而一直得不到利用, 形成了内存碎片。
解决办法:
规定门限值:分配空闲区时, 如果剩余部分小于门限值, 则将此空闲区整体分配给此程序。
内存拼接技术:将内存碎片(所有的空闲区)拼接成一个大的空闲区,但这种方法消耗系统资源。
让程序能够在不同内存分区进行运行:把程序分开装入不同的空闲区, 充分利用空闲区,避免造成碎片。

7.15 何为程序运行的局部性?

程序在一个有限的时间段内访问的代码和数据往往集中在有限的地址范围内,把程序的一部分装入内存在较大概率上足够让其运行一小段时间。

7.16 试述页式内存管理方案的概念,进程装入和使用内存的原则?

页式虚拟内存管理把进程空间和内存空间划分成等大小的小片,进程的小片称为页,内存的小片称为页框。
进程装入和使用内存的原则:只把程序部分页装入内存便可运行,页在内存中占用的页框不必相邻,需要新页时按需从硬盘中调入内存,不再运行的页及时删除。

7.17 何为页表?描述利用页表完成页式地址映射的过程。

页表记录页与页框的对应关系(起索引作用)。
地址映射过程分为三步:从VA分离页号P和页内偏移W;查页表,以P为索引查页框号P’;计算物理地址MA,MA=P’×页大小+W。

7.18 何为快表?描述有快表的情况下页式地址的映射过程。

快表是指页表放在Cache中。
页式地址的映射过程

7.19 在有快表的存储管理系统中,一条访存指令要访问到真正的数据,需要访问内存几次?

一次或三次。
如果命中Cache中的快表的情况下,从Cache中得到地址,直接去内存取数据,只需访存一次。
如果没有命中,需要得到内存中页表的地址,从页表中得到物理地址,最后得到数据,共三次。

7.20 试述页式存储管理系统的页面共享原理。

在不同进程的页表中填上相同的页框号,多个进程能访问相同的内存空间,从而实现页面共享。共享页面在内存中只有一份真实存储,节省内存。

7.21 试述缺页中断的概念和缺页中断响应的过程。

在地址映射过程中,当要访问的目的页不在内存中时,则系统产生异常中断——缺页中断。
缺页中断处理程序把所缺的页从页表指出的外存地址调入内存的某个页框中,并更新页表中该页对应的页框号以及修改中断位I。

7.22 页式虚拟内存管理是否适合实时操作系统采用?

不适合。
因为采用页式虚拟内存管理时,操作系统所需指令会储存在三种不同的存储介质中,访问时间大小关系:cache<内存<外存(硬盘)。
这样给每条指令或过程的完成时间添加了很大的不确定性,不符合“实时操作系统:每条指令或过程的完成时间是确定的或有上限”的要求。

7.23 何为页面淘汰?页面淘汰的主要算法有哪些?

当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间,这一过程称为页面淘汰。而用来选择淘汰哪一页的规则叫做淘汰策略。
主要有以下几种淘汰策略:
最佳算法(OPT):从主存中移出永远不再需要或最长时间不需要访问的页面,实践中无法实现。
先进先出淘汰算法(FIFO):淘汰在内存中停留时间最长的页面,实现简单,对于一些特定的访问序列缺页率很高。
最近最久未使用淘汰算法(LRU):淘汰最长时间未被使用的页面。
最不经常使用算法(LFU):选择到当前时间被访问次数最少的页面。

7.24 影响缺页的因素有哪些?

淘汰算法、分配给进程的页框数、页本身的大小、程序的编制方法。

7.25 试述段页式存储管理的主要概念和地址映射过程。

段页式存储管理是在段式存储管理中结合页式存储管理技术,在段中划分页面。
同时采用段表和页表实现地址映射。系统为每个进程建立一个段表; 系统为每个段建立一个页表; 段表给出每段的页表基地址及页表长度(段长)。页表给出每页对应的页框。逻辑地址:段号S、页号P和页内位移W。

7.26 X86 CPU 架构下有哪三种地址?

逻辑地址、线性地址、物理地址。
逻辑地址为汇编语言的段偏移,线性地址由逻辑地址转换得到。
逻辑地址到线性地址为段机制,线性地址到物理地址为分页机制。

7.27 何为段描述符,其结构中主要包括哪些内容?

段描述符用于描述段的属性,8字节,包括段基址、段界限、段属性、段类型、访问该段最小特权级、是否在内存等信息。

7.28 在何为选择子?选择子的结构是什么?选择子的作用是什么?

选择子用于选择GDT/LDT中的某个描述符,存放在段寄存器中。
高13位是整数索引,给出段描述符的位置;
下面1位是TI域,1表示LDT中,0表示GDT中;
下面2位是特权级别域,从0到3。

7.29 逻辑地址如何通过选择子/描述符表转化为线性地址?

根据选择子在GDT/LDT表中找到对应描述符,然后根据偏移地址得出线性地址。

偏移地址-线性地址

偏移地址-线性地址

7.30 Windows和Linux为何不用普通页表,而要用二级或三级页表结构?(即如果直接使用普通页表会有哪些问题?)

对于大容量内存,直接使用普通页表,会占很大内存。例如4G空间,每页4K,页表每个记录占4字节,共需要4M内存储存页表,难以找到连续1K个页框存放页表。

7.31 Linux本质上采用的是二级页表结构。为何它在形式上要采用三级页表结构?

增加Linux对硬件的适应性。

7.32 Linux中段机制的作用什么?

利用段机制隔离用户数据和系统数据;
避免逻辑地址到线性地址的转换。

7.33 Linux内存管理的基本框架和典型算法。

https://www.cnblogs.com/ralap7/p/9184773.html

7.34 了解“页式虚拟内存管理”的实时性?

https://blog.csdn.net/lxc19861120/article/details/8449981

7.35 了解关于Intel CPU的保护模式的概念,了解段描述符,描述符特权级(DPL),请求特权级(RPL)等概念。

https://blog.csdn.net/chuanwang66/article/details/84410042

7.36 Linux段机制的实现过程。

https://blog.csdn.net/hzrandd/article/details/50898817?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

7.37 Linux是如何解析ELF文件并加载其中内容到内存中的?

https://blog.csdn.net/gatieme/article/details/51628257?utm_source=blogxgwz1