第三章内存
- 3.1_1内存的基础知识
- (1)什么是内存:略
- (2)进程运行的基本原理
- ①从写程序到程序运行
- ②链接
- ③装入
- 3.1_2内存管理的概念
- (1)内存管理管哪几个方面
- (2)内存保护
- ①上下限寄存器:
- ②重定位界地址寄存器
- 3.1_3覆盖与交换
- (1)覆盖技术
- (2)交换技术
- 3.1_4连续分配管理方式
- (1)单一连续分配
- (2)固定分区分配
- ①分区大小相等
- ②分区大小不相等
- (3)动态分区分配
- ①系统要用什么样的数据结构记录内存的使用情况?
- ②当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?(3.1_4详述)
- ③如何进行分区的分配与回收操作?
- (3)总结
- 3.1_5动态分区分配算法
- (1)首次适应算法(First Fit)
- (2)最佳适应算法(Best Fit)
- (3)最坏适应算法(Worst Fit)
- (4)邻近适应算法(Next Fit)
- 3.1_6基本分页存储管理的基本概念
- (1)页框、页面 、页表
- (2)如何实现地址的转换
- 3.1_7基本地址变换机构
- (1)页表寄存器
- (2)地址变换机构
- 3.1_8具有快表的地址变换机构
- (1)局部性
- (2)快表
- 3.1_9两级页表
- (1)单级页表存在的问题
- (2)如何解决问题一(引入多级分页)
- (3)注意
- 3.1_10基本分段存储管理方式
- (1)段
- (2)段表
- (3)地址转换
- (4)分段和分页对比
- 3.1_11段页式管理方式
- (1)分页和分段的优缺点
- (2)段页存储方式
- (3)段页存储的数据结构
- (4)段页存储的地址转换方式
- 3.2_1虚拟内存的基本概念
- (1)传统管理方式的特征、缺点
- (2)局部性原理
- (3)虚拟内存的定义和特征
- (4)如何实现虚拟内存技术
- (5)本节总结
- 脑图
我的脑图链接分享
3.1_1内存的基础知识
本节大纲:什么是内存(略)、进程运行的基本原理
(1)什么是内存:略
(2)进程运行的基本原理
指令的工作原理(略)、逻辑地址和物理地址(略)、从写程序到程序运行
①从写程序到程序运行
编译生成目标模块即.obj文件,链接生成装入模块即可执行文件.exe
②链接
链接的作用:把多个编译好的起始逻辑地址和终止逻辑地址不同的目标模块链接成一个逻辑起始地址为0的装入模块
链接的三种方式:
1.静态链接:在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
2.装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
3.运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。
③装入
装入的作用:把程序中的逻辑地址转为物理地址进而让计算机得以识别
三种装入方式:(其中只有绝对装入是编译程序实现,其他是操作系统实现)
1.绝对装入(只适用于单道程序环境):在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
2.静态重定位(早期多道批处理):又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动==,也不能再申请内存空间。
3.动态重定位(现代操作系统):又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器(基址寄存器)的支持。重定位寄存器存储当前代码首物理地址
3.1_2内存管理的概念
本节大纲:内存管理管什么、存储保护
(1)内存管理管哪几个方面
(2)内存保护
为什么要进行内存保护:控制各个进程只能访问自己的内存空间
内存保护的两个方法:
①上下限寄存器:
在CPU中设置一对上、下限寄存器, 存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
②重定位界地址寄存器
采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址(即物理地址长度)。
3.1_3覆盖与交换
本节大纲:覆盖技术、交换技术
(1)覆盖技术
**覆盖技术的思想:**将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。内存中分为一个“固定区”和若干个“覆盖区”。
需要常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束)。
不常用的段放在“覆盖区”,需要用到时调入内存,用不到时调出内存。
**缺点:**必须由程序员声明覆盖结构,操作系统完成自动覆盖。对用户不透明,增加了用户编程负担。覆盖技术只用于早期的操作系统中,现在已成为历史。
(2)交换技术
交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
交换技术的三个问题:
3.1_4连续分配管理方式
本节大纲:单一连续分配、固定分区分配、动态分区分配
连续分配:指为用户进程分配的必须是一个连续的内存空间。
(1)单一连续分配
单一连续分配方式:内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用于存放操系统相关数据;用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区空间。
**优点:**实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护(eg:早期的PC操作系统MS-DOS)。
**缺点:**只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。
(2)固定分区分配
分区说明表:
①分区大小相等
②分区大小不相等
(3)动态分区分配
动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数
目是可变的。(eg: 假设某计算机内存大小为64MB,系统区8MB,用户区共56 M…)
①系统要用什么样的数据结构记录内存的使用情况?
②当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?(3.1_4详述)
③如何进行分区的分配与回收操作?
分配的两种情况:
回收的两种情况:
回收区相邻有一个空闲分区
回收区没有空闲分区
另外:
紧凑技术
(3)总结
内部碎片,分配给某进程的内存区域中,如果有些部分没有用上。
外部碎片,是指内存中的某些空闲分区由于太小而难以利用。
3.1_5动态分区分配算法
本节大纲:首次适应算法(First Fit)、最佳适应算法(Best Fit)、最坏适应算法(Worst Fit)、邻近适应算法(Next Fit)
(1)首次适应算法(First Fit)
算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区。
(2)最佳适应算法(Best Fit)
算法思想:由于动态分区分配是-种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区。
**缺点:**每次都选最小的分区进行分配,会留下越来越多的、很小的、难以利用的内存块。因此这种方法会产生很多的外部碎片。
(3)最坏适应算法(Worst Fit)
算法思想:为了解决最佳适应算法的问题一即留下太多难以利用的小碎片,可以在每次分配时
优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。
(4)邻近适应算法(Next Fit)
算法思想:首次适应算法每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决.上述问题。
3.1_6基本分页存储管理的基本概念
基本分页存储管理的思想——把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个 个小部分
(1)页框、页面 、页表
①页面和页框
**页面:**将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”,每个页面也有一个编号,即“页号",页号也是从0开始。
**页框:**将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”,或称“页帧”、“内存块”、“物理块”。每个页框有一个编号,即“页框号”(或者.“内存块号”、“页帧号”、“物理块号”)页框号从0开始。
**②页表:**页表记录进程页面和实际存放的内存块(页框)之间的对应关系
**页表结构:**可见页表的页号是顺序递增的,所以不用单独存储,只需存储页框号即可,就像数组a[0]=3,a[1]=6,a[2]=4…,因此由此数组特性可知页表必须在内存中连续存储,以及页表项的大小取决于内存大小或者页框数大小
(2)如何实现地址的转换
由页面页框的结构特点可知地址转换方法为:
物理地址 = 装入之后的起始物理地址 + 页内偏移地址
即
物理地址 = 逻辑地址所在页面的页号在装入之后对应的页框 * 页框大小 + 页内偏移地址
例如:
CPU执行指令1,需要访问逻辑地址为80的内存单元,如何转化为物理地址?
逻辑地址为80的内存单元:在1号页,该页在内存中的起始位置为50, 逻辑地址为80的内存单元相对于该页的起始地址而言,“偏移量”应该是30。实际物理地址=450+30=480.
补充:考试中如何计算页号和页内偏移量
人工手算:页号=80/50=1;页内偏移量=80%50=30
计算机:因为计算机采用二进制计数即
3.1_7基本地址变换机构
(1)页表寄存器
通常会在系统中设置- -个页表寄存器(PTR) ,存放页表在内存中的起始地址F和页表长度M。进程未执行时,页表的始址和页表长度放在进程控制块(PCB) 中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。
(2)地址变换机构
3.1_8具有快表的地址变换机构
(1)局部性
时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行:如果某个数据被访问过,不久之后该数据很可能再次被访问。( 因为程序中存在大量的循环)
空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)
(2)快表
快表:又称联想寄存器(TLB), 是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。
(3)加入快表之后地址变换
与基本地址变换对比
3.1_9两级页表
(1)单级页表存在的问题
问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。
(2)如何解决问题一(引入多级分页)
可将长长的页表进行分组,使每个内存块刚好可以放入一个分组( 比如上个例子中,页面大小4KB,每个页表项4B,每个页面可存放1K个页表项,因此每1K个连续的页表项为一组,每组刚好占一个内存块,再讲各组离散地放到各个内存块中)另外,要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表
(3)注意
①若采用多级页表机制,则各级页表的大小不能超过一个页面
②两级页表的访存次数分析(假设没有快表机构)
三次:第一次访存:访问内存中的页目录表、第二次访存:访问内存中的二级页表、第三次访存:访问目标内存单元
N级页表的访存次数:N + 1次
3.1_10基本分段存储管理方式
基本分段存储管理即根据程序自身逻辑(比如main函数是一个段,某个子函数是一个段)划分为若干个段
(1)段
进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址
内存分配规则:以段为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。
(2)段表
程序分多个段,各段离散地装入内存,为了保证程序能正常运行,就必须能从物理内存中找到各个逻辑段的存放位置。为此,需为每个进程建立一张段映射表, 简称‘段表“
**①段表数据结构:**每个段对应一个段表项,其中记录了该段在内存中的起始位置(又称“基址”)和段的长度。
②各个段表项的长度是相同的。 由于段表项长度相同,因此段号可以是隐含的,不占存储空间。若段表存放的起始地址为M,则K号段对应的段表项存放的地址为M+ K*6
(3)地址转换
(4)分段和分页对比
3.1_11段页式管理方式
(1)分页和分段的优缺点
(2)段页存储方式
(3)段页存储的数据结构
(4)段页存储的地址转换方式
3.2_1虚拟内存的基本概念
(1)传统管理方式的特征、缺点
传统管理方式回顾:
一次性:作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:
①作业很大时,不能全部装入内存,导致大作业无法运行;
②当大量作业要求运行时,由于内存无法容纳所有作业,因此只有少量作业能运行,导致多道程序并发度下降。
驻留性:一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。
事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。(例如和平精英,如果你在海岛地图,那么雨林地图就不用加载到内存中,这也是为什么进入一个地图开始游戏是为什么需要载入中的原因)
(2)局部性原理
①时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行,如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
②空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问,例如数组(因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)
③高速缓冲技术:如何应用局部性原理呢?于是就有了高速缓冲技术
高速缓冲技术的思想:将近期会频繁访问到的数据放到更高速的存储器中,暂时用不到的数据放在更低速存储器中(例如快表机制)
(3)虚拟内存的定义和特征
①在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存,它的原理如下:
基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
②求虚拟内存实际容量( = min(内存和外存容量之和,CPU寻址范围))
③虚拟内存的三个主要特征
多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
对换性:在作业运行时无需一直常驻内存, 而是允许在作业运行过程中,将作业换入、换出。
虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量,远大于实际的容量。
(4)如何实现虚拟内存技术
虚拟内存技术:允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虛拟内存的实现需要建立在离散分配的内存管理方式基础上。