【操作系统】存储器管理
存储管理:
- 内存分配与回收
- 内存共享与保护
- 内存扩充
- 地址变换
@[toc]
4.1 存储器的层次结构
练习题
1. 提出存储层次体系的主要依据是(D)
A.多道程序设计技术
B.存储保护技术
C.虚拟存储技术
==D.程序访问的局部性原理==
2. [2013 统考试题 29]计算机开机后,操作系统最终被加载到(D)
A. BIOS
B. ROM
C. EPROM
==D. RAM==
3. 存储管理的目的是(C)
A. 方便用户
B.提高主存空间利用率
==C.方便用户和提高主存利用率==
D.增加主存实际容量
4.2 程序的装入和链接
将用户源程序变为可在内存中执行的程序的步骤:
编译:由编译程序将用户源代码编译成若干个目标模块
链接:由链接程序将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块
装入:由装入程序将装入模块装入内存,构造 PCB,形成进程(使用物理地址)
在多道程序环境下,要使程序运行,必须为之先建立==进程==。创建进程的第一件事是将程序和数据装入内存。
用户程序的主要处理阶段
1、编辑阶段(形成符号空间)
2、编译阶段(生成目标代码)
3、链接阶段(确定相对地址)
将编译后一组目标模块以及它们所需的库函数装配成一个完整的装入模块。
4、装入阶段(可以确定物理地址)
将装入模块放入分到的内存区中。这时需要进行地址重定位。
5、运行阶段(可以确定物理地址)
运行可执行的程序 file1.exe。
逻辑地址、物理地址和地址映射
逻辑地址(相对地址,虚地址):用户程序经过编译链接后形成的以 0 为基址的地址。不能用逻辑地址在内存中读取信息。
物理地址(绝对地址,实地址):内存中存储单元的地址。物理地址可直接寻址。
地址映射:将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。
重定位
重定位:把程序中的逻辑地址变成内存中的物理地址的过程叫做重定位。
静态重定位:在程序执行之前进行,由专门设计的重定位装配程序完成。
动态重定位:在程序执行过程中,每次访问内存之前将程序地址变换为内存地址,这种变换是依靠硬件地址变换机构实现的。
4.2.1 程序的装入
1.绝对装入方式
在编译时,如果知道程序驻留在内存的什么位置,那么编译程序将产生绝对地址的目标代码。
程序中的逻辑地址与实际内存地址完全相同,无需对程序和数据的地址进行变换。
优点:装入过程简单。
缺点:过于依赖硬件结构,不便多道程序系统。
2.静态重定位装入方式
- 在多道程序环境下,目标模块的起始地址通常从 0 开始,程序中的其它地址都是相对于起始地址计算的;
- 因此应采用可重定位装入方式,根据内存的实际情况,将装入模块装入到内存的适当位置。
在程序执行之前由专门设计的重定位装配程序一次性实现逻辑地址到物理地址的转换。
优点:不需硬件支持,可以装入多道程序。
缺点:一个程序通常需要占用连续的内存空间;程序装入内存后不能移动。
3.动态重定位装入方式
- 程序装入内存后,并不立即实施地址变换,而是把这种地址转换推迟到程序真正运行时才进行;
- 装入内存后仍是相对地址;
- 应设置一个重定位寄存器。
在程序执行过程中,每次访问内存之前将程序地址变换为内存地址,这种变换是依靠硬件地址变换机构实现的。
优点:OS 可以将一个程序分散存放于不连续的内存空间,可以移动程序。
缺点:需要硬件支持,OS 实现较复杂。是虚拟存储的基础。
练习题
1. 为了保证 CPU 执行程序指令时能正确访问存储单元,需要将用户进程中的逻辑地址转换为运行时可由 CPU 直接寻址的物理地址,这一过程称为(A)
==A.地址映射==
B.地址查询
C.地址分配
D.地址计算
2. 要保证一个程序在主存中被改变了存放位置后仍能正确执行,则对主存空间应采用(B)。
A.静态重定位
==B.动态重定位==
C.动态分配
D.静态分配
3. 若采用动态地址重定位,其地址重定位工作是在什么时刻完成的(B)
A.调度程序选中进程时刻
==B.执行每一条指令时刻==
C.往内存装载进程时刻
D.在内存中移动进程时刻
4.2.2 程序的链接
1.静态链接:
定义:在程序运行前,将目标模块及所需的库函数链接成一个完整的装配模块,以后不再拆开。
静态链接是在生成可执行文件时进行的。
事先进行链接,以后不再拆开。
2.装入时动态链接:
定义:指将用户源程序编译后所得的一组目标模块,在装入内存时,采用边装入边链接的链接方式。
在装入或运行时进行链接。通常被链接的共享代码称为动态链接库(DLL, Dynamic-Link Library)或共享库(shared library)。
==边装入边链接。==
优点:
(1) 便于模块的修改和更新;
(2) 便于实现对目标模块的共享。
3.运行时动态链接:
定义:指对某些目标模块的链接,是在程序执行中需要该目标模块时,才对它进行链接。
边执行边链接!
优点:
加快装入过程、节省内存空间
4.3 连续分配存储管理方式
连续分配方式,是指为一个用户程序分配一个连续的内存空间。
4.3.1 单一连续分配
内存分为两个区域:系统区,用户区。应用程序装入到用户区,可使用用户区全部空间。
最简单,适用于单用户、单任务的 OS。
优点:易于管理。
缺点:
- 对要求内存空间少的程序,造成内存浪费;
- 程序全部装入,很少使用的程序部分也占用内存。
4.3.2 固定分区分配
1、基本原理及技术
系统提前把内存分为一些大小相等或不等的分区(partition),==每个进程占用一个分区==。操作系统占用其中一个分区。
特点:
- 适用于多道程序系统和分时系统。
- 支持多个程序并发执行
问题:可能存在内碎片。
==内碎片:分区之内未被利用的空间==
==外碎片:分区之间难以利用的空闲分区(通常是小空闲分区)==
划分分区的方法
分区大小相等:只适合于多个相同程序的并发执行(处理多个类型相同的对象)。缺乏灵活性。
分区大小不等:多个小分区、适量的中等分区、少量的大分区。根据程序的大小,分配当前空闲的、适当大小的分区。
优缺点
- 优点: 易于实现,开销小。
- 缺点:
内碎片造成浪费
分区总数固定,限制了并发执行的程序数目。
- 可以和覆盖、交换技术配合使用。
- 采用的数据结构:分区表-记录分区的大小和使用情况
步骤
- 当有一用户程序要装入时,由内存分配程序检索该表;
- 从中找出一个能满足要求的、尚未分配的分区;
- 将之分配给该程序,然后将该表项中的状态置为“已分配”;
- 若未找到大小足够的分区,则拒绝为该用户程序分配内存。
4.3.3 动态(可变)分区分配
动态创建分区:
在装入程序时按其初始要求分配;
或在其执行过程中通过系统调用进行分配或改变分区大小。
优点: 没有内碎片。
缺点: 有外碎片。
练习题
1. 固定分区存储管理中存储保护用(B)关系式进行核对。
A. 逻辑地址≤限长寄存器值
==B.下限寄存器值≤绝对地址≤上限寄存器值==
C. 界限地址≤绝对地址≤主存最大地址
D. 段内地址≤段表中对应段的限长
2. (C)判断到“逻辑地址>限长寄存器值”时,形成—个“地址越界”的程序性中断事件。
A.一个存储分区管理
B.固定分区存储管理;
==C.可变分区存储管理==
D.段式存储管理
3. 公式“绝对地址=下限寄存器+逻辑地址”被用来在(B)中做地址转换。
A.一个分区存储管理
==B.固定分区存储管理==
C.可变分区存储管理
D.页式存储管理
4. 可变分区存储管理时采用的地址转换公式为(C))。
A.绝对地址=界限寄存器值+逻辑地址
B. 绝对地址=下限寄存器值+逻辑地址
==C. 绝对地址=基址寄存器值+逻辑地址==
D.绝对地址=块号×块长÷页内地址
动态分区分配是根据进程的实际需要,动态地为之分配内存空间。
1.分区分配中的数据结构
空闲分区表: 记录每个空闲分区的情况。每个空闲分区占一个表目,表目中包括分区序号、分区始址及分区的大小等数据项。
空闲分区链:
2.分区分配算法
基于顺序搜索的分区分配算法:
(1) 首次适应算法 FF(First Fit)
(最先匹配法(first-fit))首址递增排列。
优点: 优先利用内存低址部分。
缺点: 低址部分不断划分,产生小碎片;每次查找从低址部分开始,增加了查找的开销。
(2) 循环首次适应算法 NF(Next Fit)
(下次匹配法(next-fit))
为实现算法,需要:
- 设置一起始查寻指针
- 采用循环查找方式
优点: 使内存空闲分区分布均匀,减少查找的开销
缺点: 缺乏大的空闲分区
(3) 最佳适应算法 BF(Best Fit)
(最佳匹配法(best-fit) )
==空闲区按大小递增排列!==
缺点: 产生许多难以利用的小空闲区(外碎片)
(4) 最差适应算法 WF(Worst Fit)
(最坏匹配法(worst-fit) )
==空闲区按大小递减排列!==
不会留下太多的小空闲分区;
但较大的空闲分区不被保留。
- 首次适应算法
将地址最小的够用的空间分配出去
- 下次适应算法
从上次分配位置开始搜索
将地址最小的够用的空间分配出去
- 最佳适应算法
将够用的长度最小的空间分配出去
- 最差适应算法
将够用的长度最大的空间分配出去
分配算法对比
练习题
1. 固定分区存储管理一般采用(D)进行主存空间的分配。
A.最先适应分配算法
B.最优适应分配算法
C.最坏适应分配算法
==D.顺序分配算法==
2. 可变分区常用的主存分配算法中不包括(B)。
A.最先适应分配算法
==B.顺序分配算法==
C.最优适应分配算法
D.最坏适应分配算法
3. 主存中按地址顺序依次有五个空闲区:
现有五个作业:
问:
(1) 如果采用最先适应分配算法能把这五个作业 按 J1~J5 的次序全部装入主存吗?
(2) 用什么分配算法装入这五个作业可使主存的利用率最高?
解答:
(1) 按最先适应分配算法,这五个作业不能全部依次装入主存,因为前二个主存块能依次装入作业:J1(10K),J2(15K),第 3 块 10K 无法分配,第四、五块可分配给 J3(102K),J4(26K),最后 J5(180K)无法装入主存。
(2) 用最优适应分配算法,能使主存的利用率最高,此时,这五个主存块依次装入了五个作业,它们是:J2(15K),J4(26K),J1(10K),J5(180K),J3(102K)。
3.分区分配操作
设请求的分区大小为 u.size,
表中每个空闲分区的大小表示为 m.size,
若 m.size- u.size<=size(最小阈值),
将整个分区分配给请求者,
否则从分区中按请求的大小划出一块内存空间分配,
余下部分留在空闲链中,将分配区首址返回给调用者。\
回收内存
当进程运行完毕释放内存时,系统根据回收区首址,在空闲分区链(表)中找到相应插入点;
此时可能有四种情况:
(1) 回收区与插入点的前一个分区 F1 邻接:将回收区与 F1 合并,修改 F1 的表项的分区大小
(2) 回收区与插入点的后一个分区 F2 邻接:将回收区与 F2 合并,修改 F2 的表项的首址、分区大小
(3) 回收区与插入点的前后两个分区 F1、F2 邻接:将三个分区合并,使用 F1 的表项和 F1 的首址,取消 F2 的表项,大小为三者之和
(4) 回收区既不与 F1 邻接,又不与 F2 邻接:为回收区单独建立新表项,填写回收区的首址与大小,根据其首址插到空闲链中的适当位置
练习题
1. 在可变分区方式管理下,收回主存空间时,应检查是否有与归还区相邻的空闲区并进行合并。假定空闲区表中,已有第 j 栏和第 k 栏空闲区,此时作业归还的分区始址为 S,长度为 L。并且有:
S=第 j 栏始址+第 j 栏长度,且第 k 栏始址=S+L,
则表示归还区(C)
A.有下邻空闲区
B.有上邻空闲区
==C.既有上邻空闲区,又有下邻空闲区==
D.既无上邻空闲区,又无下邻空闲区
基于索引搜索的分区分配算法
当系统很大时,系统中的内存分区可能会很多,相应的空闲分区表或链就可能很长,这时采用顺序搜索分区方法可能会很慢。
1.快速适应算法:
将空闲分区,按其容量大小,进行分类,对于每一类的所有空闲分区,单独设立一个空闲分区链表
2.伙伴系统:
分区大小均为 2 的 k 次幂,将空闲分区按分区的大小进行分类,并单独设立一个空闲分区双向链表。
Buddy(伙伴的定义)
满足以下三个条件的称为伙伴:
1)两个块大小相同;
2)两个块地址连续;
3)两个块必须是同一个大块中分离出来的;
- 一种经典的内存分配方案
- 主要思想:将内存按 2 的幂进行划分,组成若干空闲块链表;查找该链表找到能满足进程需求的最佳匹配块。
- 算法:
-首先将整个可用空间看作一块: $2^U$
假设进程申请的空间大小为 s,如果满足 $2^{U-1} < s <= 2^U$,则分配整个块
否则,将块划分为两个大小相等的伙伴,大小为 $2^{U-1}$ 一直划分下去直到产生大于或等于 s 的最小块
分配算法
当用户申请大小为 n 的内存请求,在可利用空闲表上寻找结点大小与 n 相匹配的表
- 表非空,分配表中第一个内存块
- 表空,从更大的非空表中查找,直到找到一个空闲块,切割出所需要大小的块
- 未分配部分,插入到相应的空闲表中
回收算法
判断伙伴是否为空闲块(回收算法需了解释放的块大小)
- 否,将释放的空闲块插入到相应表中;
- 是,找到伙伴,伙伴出队,合并
- 合并后,判断合并后的块的伙伴是否是空闲块,如果是,继续合并成更大的块。依次重复,直到归并后的块的伙伴不空闲。再插入到相应的空闲块表中。
优缺点
- 可以很快找到空闲块;
- 避免了外碎片问题;
- 申请内存总是以 2n 字节满足要求,存在内碎片;
- 申请/释放可能会导致连续切块/合并,影响系统效率;
3.哈希算法:
构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。
4.3.4 可重定位分区分配
1. 动态重定位的引入
解决碎片: 将内存中的所有作业进行移动,使它们全部邻接,这样可把原来分散的小分区拼接成大分区,这种方法称为“拼接”或“紧凑”。
缺点: 用户程序在内存中的地址发生变化,必须重定位。
2. 动态重定位的实现
内存紧缩(compaction): 将各个占用分区向内存一端移动。使各个空闲分区聚集在另一端,然后将各个空闲分区合并成为一个空闲分区。
优点: 消除外碎片。
缺点:
- 对占用分区进行内存数据搬移占用 CPU 时间;
- 重定位需要硬件支持。
紧缩时机:
- 每个分区释放后;
- 内存分配找不到满足条件的空闲分区时。
3. 动态重定位分区分配算法
动态重定位分区分配算法与动态分区分配算法基本相同,差别在于增加了紧凑的功能。
可重定位分区分配方式主要特点
- 可以充分利用存储区中的“零头/碎片”,提高主存的利用率。
- 但拼接/紧缩会使系统开销加大。
分区的存储保护
(1)界限寄存器方法
- 上下界寄存器方法
- 基址、限长寄存器方法
(2)存储保护键方法
- 给每个分区分配一个单独的保护键,它相当于一把锁。
- 进入系统的每个作业赋予一个保护键,它相当于一把钥匙。
- 当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行。
在可变分区管理方式下,为什么要采用移动技术?为什么在等待外设传输信息的作业不能移动?
- 采用移动技术可把分散的空闲区集中起来,以容纳新的作业。这样提高了主存的利用率,还能为作业动态扩充主存空间提供方便。
- 因为外设与主存储器之间的信息交换是按确定了的主存绝对地址进行传输的,如果这时改变了作业的存放区域,则作业就得不到从外围设备传送来的信息,或不能把正确的信息传送到外围设备。
内存“扩充”技术
- 内存紧缩技术(例如:可变分区)
- 覆盖技术 overlaying
- 交换技术 swapping
- 虚拟存储技术 virtual memory
覆盖技术
- 解决的问题 → 程序大小超过物理内存总和
- 程序执行过程中,程序的不同部分在内存中相互替代
→按照其自身的逻辑结构,使那些不会同时执行的程序段共享同一块内存区域
→要求程序各模块之间有明确的调用结构
- 程序员声明覆盖结构,操作系统完成自动覆盖
4.4 对换(Swapping)
多道程序环境下存在的问题:
- 阻塞进程占据大量内存空间
- 许多作业在外存而不能进入内存运行
所谓“对换”,是指把内存中暂时不能运行的进程或者暂时不用的程序和数据,调到外存上,以便腾出足够的内存空间,再把已具备运行条件的程序和数据,调入内存。
分类:
- 整体对换(或进程对换):以整个进程为单位
- 页面对换或分段对换:以页或段为单位
实现进程对换,系统必须具备的功能
- 对换空间的管理
- 进程的换出
- 进程的换入
对换空间的管理
进程的换出与换入
- 进程的换出
过程:系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,然后启动盘块,将该进程的程序和数据传送到磁盘的对换区。
- 进程的换入
系统应定时查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将换出最久的进程作为换入进程,将之换入。
什么是覆盖技术?什么是对换技术?
- 覆盖技术:把用户作业分成若干段,使主段成为作业执行过程中经常使用的信息,其他段不同时工作。作业执行时,把主段常驻主存区,其他段轮流装入覆盖区执行之。
- 对换技术:让多个用户作业轮流进入主存器(转入、转出)执行。
- 覆盖主要在同一个作业或同一个进程内进行。
- 对换主要是在进程或作业之间进行。覆盖只能覆盖那些与覆盖程序段无关的程序段。
练习题
1. 单连续存储管理时,若作业地址空间大于用户空间,可用(D)把不同时工作的段轮流装入主存区执行。
A. 对换技术
B.移动技术
C. 虚拟存储技术
==D. 覆盖技术==
2. 在采用分区存储管理技术的系统中,可采用什么技术(A)让多个用户作业轮流进入主存储器执行。
==A. 对换技术==
B.移动技术
C. 虚拟存储技术
D. 覆盖技术
3. 在早期的分时系统中,让多个用户的作业轮流进入主存储器执行。先把一个作业装入主存储器执行,当出现等待事件或用完一个时间片时,把该作业从主存换出,再把由调度程序选中的另一作业调到主存中。这种技术称为 (B)
A、覆盖技术
==B、对换技术==
C、移动技术
D、调度技术
4. 下列关于紧缩技术的叙述中,哪些是正确的?(ABCD)
==A.完成紧缩会增加处理器的开销==
==B.紧缩技术可以合并分散的小空闲区,以形成大的空闲区==
==C.紧缩技术不能解决内碎片问题==
==D.紧缩技术可用于可变分区存储管理方案==
E.内存中任意一个进程都可以随时移动
5. 下列关于地址重定位的叙述中,哪些是正确的?(ABCE)
==A.动态地址重定位是在进程执行过程中完成的==
==B.地址重定位又称为地址转换或地址映射==
==C.内存的地址是按照物理地址编址的==
D.静态地址重定位的完成过程必须有硬件支持
==E.用户进程中使用的是逻辑地址,且从 0 开始编址==
6. 最佳适应算法的空白区(B)
A.按大小递减顺序连接在一起
==B.按大小递增顺序连在一起==
C.按地址由小到大排列
D.按地址由大到小排列
7. 2.首次适应算法的空闲区是(A)
==A.按地址递增顺序连在--起;==
B.始端指针表指向最大空闲区
C.按大小递增顺序连在一起
D.寻找从最大空闲区开始
8. 在固定分区分配中,每个分区的大小是(C)
A.相同.
B.随作业长度变化
==C.可以不同但预先固定==
D.可以不同但根据作业长度固定
9. 15.在可变式分区分配方案中,某一作业完成后,系统收回其主存空间,并与相邻空闲区合并,为此需修改空闲区表,造成空闲区数减 1 的情况是(D)
A.无上邻空闲区,也无下邻空闲区
B.有,上邻空闲区,但无下邻空闲区
C.有下邻空闲区,但无上邻空闲区
==D.有上邻空闲区,也有下邻空闲区==
10. 设内存的分配情况如图 4. 18 所示。若要申请一块 40 K 字节的内存空间,若采用最佳适应算法,则所得到的分区首址为(C)
A.100 K
B.190 K
==C.330 K==
D.410 K
4.5 分页存储管理方式
4.5.1 分页存储管理的基本方法
- 将程序的逻辑地址空间划分为固定大小的页;
- 物理内存划分为固定大小的块(页架);
- 程序加载时,分配其所需的所有页,这些页不必连续。需要 CPU 的硬件支持。
优点:
- 没有外碎片,每个内碎片不超过页大小。
- 一个程序不必连续存放。
- 便于改变程序占用空间的大小。即随着程序运行而动态生成的数据增多,地址空间可相应增长。
缺点:
程序全部装入内存。
1.页面和物理块
- 分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片称为页,并为各页加以编号,从 0 开始。
- 同时把内存空间分成与页面相同大小的若干个存储块,称为块。
- 在为进程分配内存时,以块为单位将进程的若干个页分别装入到多个可以不相邻的物理块中。
- 进程的最后一页经常装不满而形成“页内碎片”。
2. 地址结构
划分是由系统自动完成的,对用户是透明的
页号与页内偏移的计算
若给定一个逻辑地址空间中的地址为 A,页面大小为 L,则:
页号: ==P=INT[A/L]==
页内地址: ==d=[A] MOD L==
练习题
1.设有一页式存储管理系统,向用户提供的逻辑地址空间最大为 16 页,每页 2048B,内存总共有 8 个存储块,试问逻辑地址至少应为多少位?内存空间有多大?
解:(1)页式存储管理系统的逻辑地址为:
其中页内地址表每页的大小即 2048B=2*1024B=211B,所以页内地址为 11 位。
其中页号表最多允许的页数即 16 页=24 页,所以页号为 4 位。
故逻辑地址至少应为 15 位。
(2)物理地址为:
其中块内地址表每块的大小与页大小相等,所以块内地址也为 11 位。
其中块号表内存空间最多允许的块数即 8 块=23 块,所以块号为 3 位。
故内存空间至少应为 14 位,即 214 =16KB
2. 设页式存储管理中的地址格式如下,则它的最大页号和最大页内地址是(B)。
A、256 和 65536
==B、255 和 65535==
C、256 和 65535
D、255 和 65536
4.5.2 地址变换机构
1. 基本的地址变换机构
实现从逻辑地址到物理地址的转换,其任务是借助于页表,将逻辑地址中的页号转换为内存中的物理块号。
- 页表可以由一组专门的寄存器来实现,一个页表项用一个寄存器。但寄存器成本高,系统页表可能很大,所以页表大多常驻内存。
- 在系统中只设置一个页表寄存器 PTR,在其中存放页表在内存中的始址和页表的长度。
- 在分页系统中,允许进程的每一页离散地存储在内存的任一存储块中,为方便查找,系统为每一进程建立一张页面映像表,简称页表。
- 页表实现了从页号到物理块号的地址映射。
- 在页表表项中常设置一存取控制字段,对存储块内容加以保护。
分页系统的地址变换机构
练习题
1. 在分页存储管理系统中,逻辑地址的长度为 16 位,页面大小为 4K;
第 0、1、2 页依此存放在物理块 5、10、11 中;
现有一逻辑地址为 2F6AH,问相应的物理地址是多少?
解答
由题目所给条件可知,逻辑地址结构如下图所示,
页号占 4 位,页表长度为 24=16。页号为 2,没有越界。
第 2 页存放在 11 物理块中,块号为 B,所以,物理地址为 BF6AH。
2. 某页式内存管理的用户编程空间共 32 个页面,每页为 1KB,内存为 64KB。假定某用户页表如下:
则逻辑地址 0A5C(H)所对应的物理地址是什么?要求:写出主要计算过程。
解答
- 逻辑地址 0A5C(H)所对应的二进制表示形式是:0000 1010 0101 1100;
- 后十位 10 0101 1100 是页内地址,00010 为页号,页号化为十进制是2;
- 查页表得知2对应的物理块号是11,11转换二进制是 1011,即可求出物理地址为: 0010 1110 0101 1100,化成十六进制为 2E5C(H) ;
- 即则逻辑地址 0A5C(H)所对应的物理地址是 2E5C(H) ;
地址转换步骤
1.当逻辑地址为十进制时:
求出逻辑地址的页号 = 逻辑地址 / 页面大小
求出页内偏移量 = 逻辑地址 % 页面大小
用页号查页表,得到块号;
求出物理地址 = 块号 * 页面大小 + 页内偏移
2.当逻辑地址为十六进制/八进制/二进制时:
把逻辑地址转为二进制;
按页的大小分离出页号和页内偏移量( 高位部分为页号,低位部分为页内偏移量 );
以页号查页表,得到物理地址的块号;
将逻辑地址的页内偏移量直接复制到物理地址的块内偏移量上;
把块号转为二进制,从而得出物理地址,再转回 16/8 进制。
练习题
1. 页式存储管理中,每次从主存中取指令或取操作数,要(B)次访问主存。
A、1 次
==B、2 次==
C、3 次
D、4 次
2.具有快表的地址变换机构
CPU 在每存取一个数据时,需要两次访问内存:
- 第一次:访问页表,找到指定页的物理块号,将块号与页内偏移量拼接形成物理地址。
- 第二次:从第一次所得地址中获得所需数据,或向此地址中写入数据。 处理速度降低!
解决方法:在地址变换机构中,增设一个具有并行查寻能力的特殊高速缓冲寄存器,称为“联想存储器”或“快表”。
4.5.3 有效访问内存的时间
T=a(λ+t)+ (1-a)( λ+2t )
=aλ+at+(1-a)(λ+t)+(1-a)t
=aλ+(1-a)(λ+t)+t
其中,a 为快表的命中率, λ为快表的访问时间, t 为内存的访问时间
例题
有一页式系统,其页表存放在主存中。
(1)如果对主存的一次存取需要 100ns,试问实现一次页面访问的存取时间是多少?
(2)如果系统加有快表,对快表的一次存取需要 20ns,若平均命中率为 85%,试问此时的存取时间为多少?
解:(1)页表放主存中,则实现一次页面访问需 2 次访问主存,一次是访问页表,确定所存取页面的物理块,从而得到其物理地址,一次根据物理地址存取页面数据。所以实现一次页面访问的存取时间为: 100ns*2=200ns
(2)系统加有快表,则实现一次页面访问的存取时间为:
0.85(20ns+100s)+(1-0.85)(20ns+2*100ns)=135ns
4.5.4 两级和多级页表
现代计算机系统都支持非常大的逻辑地址空间 $(2^{32}~2^{64})$,页表就非常大,需占用较大的地址空间。
1. 两级页表
2.多级页表
练习题
一、选择题
1. 在采用页式存储管理方案的系统中,逻辑地址用 32 位表示,内存页面大小为 212,则用户程序最多可划分为多少页?(A)
==A.220==
B.210
C.212
D.232
2. 以下有关外层页表的叙述中错误的是(A)。
==A 反映在磁盘上页面存放的物理位置==
B 外层页表是指向页表的页表
C 为不连续(离散)分配的页表再建立一个页表
D 有了外层页表则需要一个外层页表寄存器就能实现地址变换
3. 进程切换时,系统将即将运行进程的页表起始地址存放在(A)
==A.寄存器中==
B.磁盘中
C.内存中
D.快表中
二、判断题
1. 在采用页式存储管理方案的系统中,若进程处于就绪状态,则页表的起始地址保存在进程控制块 PCB 中。(√)
2. 页表由页表项组成,通过页表项可以得到逻辑页号对应的页框号,从而拼接出物理地址。(√)
3. 内存管理单元(MMU)是硬件机制,完成从逻辑地址到物理地址的转换工作。(√)
三、简答题
1. 为何引入多级页表?多级页表是否影响速度?
解答:
为了使得大页表也能够不连续存放;
减少大页表所占用的存储空间;
多级页表会降低地址映射的速度,但通过快表仍可以将效率保持在合理的范畴内。
2. 与传统页表相比,倒置页表有什么优势?
解答:
传统页表是面向进程逻辑地址空间的,即对应进程的每个逻辑页面设置一个表项,当进程的地址空间很大时,页表需占用很多的存储空间,造成浪费;
与经典页表不同,反置页表是面向内存物理块的,即对应内存的每个物理块设置一个表项,表项的序号就是物理块号 f,表项的内容则为进程标识 pid 与逻辑页号 p 的有序对;
系统只需设置一个反置页表,为所有进程所共用。
页的共享
(1)共享代码(数据)的实现方法
被各进程共享的一段代码(数据),由各进程相应的页表项指向相同物理块。
(2)页式存储管理系统提供了两种方式:
地址越界保护
在页表中设置保护位(定义操作权限:只读,读写,执行等)
(3)页共享带来的问题
若共享数据与不共享数据划在同一块中,则:
有些不共享的数据也被共享,不易保密
当共享数据较大时,页表项数同时大幅增加
实现数据共享的最好方法——段式存储管理。
4.6 分段存储管理方式
4.6.1 分段存储管理方式的引入
引入分段存储管理方式,主要是为了满足用户的一系列要求:
- 方便编程:按逻辑关系分为若干个段,每个段从 0 编址,并有名字和长度,访问的逻辑地址由段名和段内偏移量决定。
- 信息共享:共享是以信息为逻辑单位,页是存储信息的物理单位,段却是信息的逻辑单位。
- 信息保护:保护也是对信息的逻辑单位进行保护的。
- 动态链接:动态链接以段为单位。
- 动态增长:实际应用中,某些段(数据段)会不断增长,前面的存储管理方法均难以实现。
空间划分(分段)
将用户作业的逻辑地址空间划分成若干个大小不等的段(由用户根据逻辑信息的相对完整来划分)。各段有段名(常用段号代替),首地址为 0。
内存分配
在为作业分配内存时,以段为单位,分配一段连续的物理地址空间;段间不必连续。
ps:
1、整个作业的逻辑地址空间是二维的,其逻辑地址由段号和段内地址组成;物理地址空间是一维的。
2、需要 CPU 的硬件支持(地址变换机构)
4.6.2 分段系统的基本原理
页式管理把逻辑地址视为一维线性空间;
段式管理把逻辑地址视为二维空间。
将一个用户程序的所有逻辑段从 0 开始编号,称为段号;每一段内的所有单元从 0 开始编址,称为段内地址;
逻辑地址由段号和段内地址两部分组成。
段式管理将程序的地址空间划分为若干个段(segment),程序加载时,分配其所需的所有段(内存分区),这些段不必连续;物理内存的管理采用动态分区。需要 CPU 的硬件支持。
==程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段。==
可以分别编写和编译
可以针对不同类型的段采取不同的保护
可以按段为单位来进行共享,包括通过动态链接进行代码共享
优点:
没有内碎片,外碎片可以通过内存紧缩来消除。
便于改变进程占用空间的大小。
缺点: 进程全部装入内存。
段表
- 记录了段与内存位置的对应关系
- 段表常保存在内存中
- 段表的基址及长度由段表寄存器给出
- 访问一个数据/指令需访问内存 2 次(段表一次,内存一次),所以也出现内存访问速度降低的问题。
- 二维的逻辑地址:
- 许多编译程序支持分段方式,自动根据源程序的情况产生若干个段
练习题
1.采用段式存储管理的系统中,若地址用 24 位表示,其中 8 位表示段号,则允许段的最大长度是(B),一个作业最多可有(C)个段。
A.224
==B. 216
C. 28==
D. 232
分段地址变换机构
1.分段地址结构
由于整个作业的地址空间是分成多个段,因而是二维的,亦即,其逻辑地址由段号(段名)和段内地址所组成。
该地址结构允许一个作业最长有 64K 个段,每段的最大长度为 64KB。
2.段表
- 段表可以存放在寄存器中,但更多的是存放在内存中。
- 段表可以实现从逻辑段到物理内存区的映射。
所需表目
(1) 段表:每进程一个
(2) 总段表:系统一个
所需寄存器
(1) 段表首址寄存器:系统一个
(2) 段表长度寄存器:系统一个
(3) 快表:系统一组
3. 地址变换机构
在系统中设置段表寄存器,用于存放段表始址和段表长度,以实现从进程的逻辑地址到物理地址的变换。
注意:当段表存放在内存中时,每访问一个数据,都需访问两次内存,降低了计算机的速率。
解决方法:设置联想寄存器,用于保存最近常用的段表项。
段的动态链接和装配
所谓动态链接,是指在一个程序开始运行时,只将主程序装配好并调入内存,在程序运行过程中若要访问一个新的模块时,再装配此模块,并与主程序链接起来。
4.6.3 信息共享
在分段系统中,实现共享十分容易,只需在每个进程的段表中为共享程序设置一个段表项。
为什么说分段系统较之分页系统更易于实现信息共享和保护?
解答:
对分段式系统,被共享的程序或数据可作为单独的一段。在物理上它是一段,在不同的进程中,可以对应不同的逻辑段,相对来说比较易于实现。
对分页管理,则要困难的多。首先,必须保证被共享的程序或数据占有整数块,以便与非共享部分分开。其次,增加了进程的页表长度。
共享段表
进程段表(n)->共享段表(1)->共享段(1)
段的保护
(1) 段表的改进:
(2) 快表的改进:
分页和分段的主要区别
相似点:
采用离散分配方式,通过地址映射机构实现地址变换
不同点:
页是信息的物理单位,分页是为了满足系统的需要;段是信息的逻辑单位,含有一组意义相对完整的信息,分段是为了满足用户的需要。
页的大小固定且由系统确定,由系统把逻辑地址分为页号和页内地址,由机器硬件实现;段的长度不固定,取决于用户程序,编译程序对源程序编译时根据信息的性质划分。
分页的作业地址空间是一维的;分段的作业地址空间是二维的。
段式和页式存储管理的地址结构相似,它们有什么实质性差异?
页式存储管理提供连续的逻辑地址.由系统进行分页;
而段式存储管理中作业的分段是由用户决定的,每段独立编程,因此段间的逻辑地址是不连续的。
4.6.4 段页式存储管理
- 段式优于页式
便于共享和保护
- 页式优于段式
消除“外碎片”问题
- 段页式:结合二者优点
每个进程包含若干段
每个段包含若干页
1.基本原理
内存空间划分:(同页式)
静态等长,2i, 称为一块。
物理地址=(块号,块内地址)=(f,w)
进程空间划分:
一个进程<=>若干个段
一个段<=>若干个页
逻辑地址=(段号, 逻辑页号, 页内地址)=(s,p,w)
地址结构
2.地址变换
3.对应关系
所需表目
(1) 段表:每个进程一个
(2)页表:每个段一个
所需寄存器
(1)段表基址寄存器:保存正运行程度段表首址;
(2)段表限长寄存器:保存正运行程序段表长度。
(3)快表:一组联想寄存器 (快段表+快页表)
三次内存访问
第一次:访问内存中的段表,取得页表始址;
第二次:访问内存中的页表,取得该页所在的物理块号,将块号与页内地址形成物理地址;
第三次:访问上述地址,取出指令或数据。
缺点:访存次数增加
解决方法:增设高速缓冲寄存器-快表
问
**1. 对于如下存储管理方式来说,进程地址空间各是几维的?
(1)页式;(2)段式;(3)段页式**
答:
(1)页式存储管理中,进程地址空间是一维的;
(2)段式存储管理中,进程地址空间是二维的;
(3)段页式存储管理中,进程地址空间是二维的。
2.在页式存储管理中,页的划分对用户是否可见?在段式存储管理中,段的划分对用户是否可见?在段页式存储管理中,段的划分对用户是否可见?段内页的划分对用户是否可见?
答:
(1)在页式存储管理中,分页对于用户是透明的,一个进程由若干个页构成,所有页的长度相同;
(2)在段式存储管理中,分段对于用户是可见的,一个进程由若干个段构成,各个段的长度可以不同,一个段恰好对应一个程序单位;
(3)在段页式存储管理中,段的划分对用户是可见的,段内页的划分对用户是透明的,一个段由若干个页构成,所有页的长度相同。
3. 内部碎片和外部碎片有什么区别?固定分区、动态分区、页式、段式、段页式分别产生哪种碎片?
内存碎片分为:内部碎片和外部碎片。
- 内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间。
- 外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
- 固定分区产生内碎片,动态分区产生外碎片。
- 页式产生内碎片,段式产生外碎片,段页式产生内碎片。
3.简要比较各种存储管理方法的功能和实现特点
(1)连续分配:
指为一个用户程序分配一个连续的地址空间,包括单一连续分配方式和分区式分配方式;
分区式分配方式分为固定分区和动态分区,固定分区是最简单的多道程序的存储管理方式,由于每个分区的大小固定,必然会造成存储空间的浪费;
动态分区是根据进程的实际需要,动态地为之分配连续的内存空间;
常用四种分配算法: 首次适应算法 FF,该法容易留下许多难以利用的小空闲分区,加大查找开销;循环首次适应算法,该算法能使内存中的空闲分区分布均匀,但会致使缺少大的空闲分区;最佳适应算法,该算法也易留下许多难以利用的小空闲区;最差适应算法,优点是可以提高了查找速度、避免形成太多碎片,缺点是分割大的空闲区后,再遇到较大的申请时,无法满足的可能性较大。
(2)离散分配方式:
基于将一个进程直接分散地分配到许多不相邻的分区中的思想,分为分页式存储管理、分段存储管理和段页式存储管理;
分页式存储管理旨在提高内存利用率,满足系统管理的需要;
分段式存储管理则旨在满足用户(程序员)的需要,在实现共享和保护方面优于分页式存储管理;
存储管理的功能
- 存储分配和回收:分配和回收算法及相应的数据结构。
- 地址变换:
程序加载(装入)时的重定位技术
进程运行时硬件和软件的地址变换技术和机构
- 存储共享和保护:
代码和数据共享
越界保护、访问权限(读、写、执行)控制
- 存储器扩充:
由应用程序控制:覆盖;
由 OS 控制:交换(整个进程空间)。
评论