3内存管理
3.1_1 内存的基础知识
1、什么是内存,作用
(1)内存:内存用来存放数据。程序执行前需要先放到内存中才能被CPU处理――缓和CPU与硬盘之间的速度矛盾。
(2)内存存储单元:每个地址对应一个存储单元
(3)内存地址:给上面存储单元的一个编号
2、进程运行的基本原理
(1)逻辑地址vs物理地址:逻辑地址就是相对地址
(2)从写程序到程序运行:编辑-编译-链接-装入
(3)三种链接方式:
- 静态链接(在程序运行前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件);
- 装入时动态链接(将各目标模块装入内存时,边装入边链接的链接方式);
- 时动态链接(在程序执行中需要该模块时,才对它进行链接,其优点时便于修改和更新)。
(4)三种装入方式:
- 绝对装入(在编译的时候就知道程序放在内存的哪个位置);
- 静态重定位/可重定位装入(装入时将逻辑地址转表为物理地址);
- 动态重定位(把地址转化推迟到程序真正要执行时才进行)。
3.1_2 内存管理的概念
内存管理有以下功能:
1、内存管理的第一件事:让操作系统负责内存空间的分配与回收
2、内存空间的扩充:虚拟技术——内存的虚拟性
3、地址转换:逻辑地址—(转换为->)—物理地址
4、存储保护:让各进程不越界访问,只能访问自己的存储空间
- 设置上下限寄存器
- 采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)进行越界检查。
3.1_3 覆盖与交换
覆盖与交换技术是可以实现对内存空间的扩充:
(1)覆盖技术:将程序分为多个段,内存分为”固定区“和”覆盖区“,需要常驻的放在”固定区“,调入后就不再调出,不常用的段放在”覆盖区“,需要用到时调入内存,用不到时掉出内存。
(2)交换技术:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(PCB会常驻内存,不会被换出)。暂时换出外存的进程为挂起态。
(3)虚拟存储技术:后面再说
3.1_4 连续分配管理方式
内存空间的分配与回收 中的 连续分配方式:为用户进程分配的必须是个连续的内存空间。
(1 )单一连续分配:内存被分配为系统区和用户区,系统区在低地址,用户区是一个用户独享。无外部碎片。
(2)固定分区分配:将用户区分割为若干固定分区给各道程序,分割策略有分区大小相等和分区大小不相等,可以建议一个分区说明表来管理各个分区
(3)动态分区分配/可变分区分配:不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。
内部碎片:分配给某进程的内存区域中,如果有些部分没有用上
外部碎片:是指内存中的某些空闲分区由于太小而难以利用(如果有外部碎片,可以采用紧凑技术)
3.1_5 动态分区分配算法
1、首次适应算法(First Fit)
算法思想:每次从低地址开始查找,找到第一个能满足大小的空闲分区
2、最佳适应算法(Best Fit)
算法思想:为了保证“大进程”到来时能有连续的大片区域,可以尽可能留下大片的空闲区,优先使用更小的空闲区。
如何实现:空闲分区按容量递增次序链接,分配内存时顺序查找空闲分区链,找到大小能满足的第一个空闲分区
缺点:会留下小碎片
3、最坏适应算法(Worst Fit)
算法思想:和最佳适应算法相反,按容量递减次序排列,每次尽可能用大的分区
4、领近适应算法(Next Fit)
算法思想:每次从上次查找结束的位置开始检索。(减少查找开销)
缺点:大空间容易被用完
3.1_6 基本分页存储管理的基本概念(重难点)
是一种非连续分配(为用户进程分配分散的内存空间)
- 每个分区就是一个“页框”(页框=页帧=内存块=物理块=物理页面)。
- 每个页框有一个编号,即“页框号”
- 允许一个进程分散地装入道许多不相邻的位置
- 将内存分为大小相等的小分区“页框”,将用户的进程空间也分为大小相等的一个个区域,以页框的基本单位分配给每个进程片
- 分页管理对逻辑地址和物理地址的转换:物理地址=页面的其实位置+偏移量
- 计算机中用2的整数倍表示页面的大小
- 页表:存放页号和块号的对应关系
3.1_7 基本地址变换机构
基本地址变换机构是实现逻辑地址到物理地址转换的一组硬件机构。
页表寄存器(PTR),存放页表在内存中的起始地址F和页表长度M,进程未执行时,页表的起始地址和页表的长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放在页表寄存器中。
3.1_8 具有快表的地址变换机构
1、什么是快表(TLB)
快表:又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器(不是内存),用来存放当前访问的若干页表项的副本,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。
如果快表命中,就不需要访问慢表了。
2、引入快表后,地址的变换过程
3、局部性原理
时间局部性:访问某个变量后,在不久的将来还会被访问(频繁的再次被访问);
空间局部性:程序访问了某个存储单元,不久之后,其附近的存储单元也很有可能被访问。
3.1_9 两级页表
1、单级页表存在什么问题?如何解决?
- 问题1:所有页表项必须连续存放,页表过大时需要很大的连续空间;
- 问题2:在一段时间内并非所有页面都用得到,因此没必要让整个页表常驻内存;(根据局部性原理:进程只需要访问某些特定的页面,并不是整个页表)
2、两级页表的原理、逻辑地址结构
(1)将长长的页表再分页
(2)逻辑地址结构:(一级页号、二级页号、页内偏移量)
(3)页目录表、或外层页表、或顶级页表
3、如何实现地址变换?
- 按照地址结构将逻辑地址拆分成三部分;
- 从PCB中读出页目录表始址,根据一级页号查页目录表,找到下一级页表在内存中的存放位置。
- 根据二级页号查表,找到最终想访问的内存块号
- 结合页内偏移量得到物理地址
4、两级页表问题需要注意的几个细节
1)多级页表中,各级页表的大小不能超过一个页面。若两级页表不够,可以分更多级
2)多级页表的访问次数(假设没有快表结构),N级页表访问一个逻辑地址需要N+1次访存(两级列表则访问3次)
3.1_10 基本分段存储管理方式
1、什么是分段?
- 进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每段有段名,每段从0开始编址。
- 重点:
- 段号的位数决定了每个进程最多可以分几个段
- 段内地址位数决定了每个段的最大长度是多少
2、什么是段表
- 段表:段映射表
- 每个程序被分段后,用段表记录该程序在内存中存放的位置
- 段表:段号 段长 基址
3、如何实现地址变换
4、分段、分页管理的对比
- 页:信息的物理单位,实现离散分配,提高内存利用率,地址是一维的,访存2次;
- 段:信息的逻辑单位,对系统可见,地址是二维的,访存3次;
- 分段比分页更容易实现信息的共享和保护(不能被修改的代码称为纯代码和可重入代码,不属于临界资源)。
3.1_11 段页式的管理方式
1、分页、分段管理方式最大的优缺点
- 分页:利用率高,碎片少,不方便进行信息共享和保护
- 分段:方便信息共享和保护,如果段长大,容易产生外部碎片
2、分段+分页的结合——段页式管理方式
- 先分段再分页
- 段号+页号+页内偏移量
- 地址结构是二维的
3、段表、页表
4、如何实现地址变换