第五章 内存管理
1. 存储体系构成
在计算机系统中层次化的存储体系是由寄存器、高速缓存、内存储器、硬盘存储器、磁带机和光盘存储器等装置构成的。
2. 存储保护
存储保护的目的在于为多个程序共享内存提供保障,使在内存中的各程序只能访问其自己的区域,避免各程序间相互干扰。
特别是当某一程序发生错误时,不至于影响其他程序的运行,更要防止破坏系统程序。
存储保护的内容包括:保护系统程序区不被用户有意或无意的侵犯;不允许用户程序读写不属于自己地址空间的数据,如系统区地址空间、其他用户程序的地址空间。
地址越界保护
① 如果进程在运行时所产生的地址超出其地址空间,则发生地址越界。
② 地址越界可能侵犯其他进程的空间,影响其他进程的正常运行;也可能侵犯操作系统空间,导致系统混乱;
③ 发生越界时产生中断,由操作系统进行相应处理。
权限保护
① 对于允许多个进程共享的公共区域,每个进程都有自己的访问权限。
② 对属于自己区域的信息,可读可写。
③ 对公共区域中允许共享的信息或获得授权可使用的信息,可读而不可修改。
④ 未获授权使用的信息,不可读、不可写。
存储保护一般以硬件保护机制为主,软件为辅;
当发生地址越界或非法操作时,由硬件产生中断,进入操作系统处理。
3. 静态重定位
在装入一个程序时,把程序中的指令地址和数据地址全部转换成绝对地址。
由于地址转换工作是在程序开始执行前集中完成的,所以在程序执行过程中就无须再进行地址转换工作,这种地址转换方式称为“静态重定位”。
4. 动态重定位
在装入程序时,不进行地址转换,而是直接把程序装入到分配的内存区域中。
在程序执行过程中,每当执行一条指令时都由硬件的地址转换机构将指令中的逻辑地址转换成绝对地址。
这种方式的地址转换是在程序执行时动态完成的,故称为“动态重定位”。
5. 分区存储管理
分区存储管理是能满足多道程序运行的最简单的存储管理方案。其基本思想是把内存划分成若干个连续区域,称为分区,每个分区装入一个运行程序。
分区的方式可以归纳成固定分区和可变分区两类。
1) 固定分区
① 固定分区是指系统先把内存划分成若干个大小固定的分区,一旦划分好,在系统运行期间便不再重新划分。
② 为了满足不同程序的存储要求,各分区的大小可以不同。
③ 由于每一分区的大小是固定的,就对可容纳程序的大小有所限制了。
④ 因此,程序运行时必须提供对内存资源的最大申请量;
⑤ 固定分区方案灵活性差,可接纳程序的大小受到了分区大小的严格限制。
2) 可变分区
① 可变分区是指系统不预先划分固定分区,而是在装入程序时划分内存分区,使为程序分配的分区的大小正好等于该程序的需求量,且分区的个数是可变的。
② 显然,可变分区有较大的灵活性,较之固定分区能获得更好的内存利用率。
③ 在可变分区管理方案中,随着分配和回收次数的增加,必然导致碎片的出现。
④ 解决碎片问题的办法是在适当时刻进行碎片整理,通过移动内存中的程序,把所有空闲碎片合并成一个连续的大空闲区且放在内存的一端,而把所有程序占用区放在内存的另一端,这一技术称为“移动技术”或“紧凑技术”或“紧缩技术”。
6. 空闲分区的分配策略
这里介绍操作系统查找和分配空闲区的四种分配算法。
1) 最先适应算法
最先适应算法,又称顺序分配算法。在这种分配算法中, 当接到内存申请时, 顺序查找分区说明表,找到第一个满足申请长度的空闲区,将其分割并分配。
l 此算法简单,可以快速做出分配决定。
2)最优适应算法
l 当接到内存申请时,查找分区说明表,找到第一个能满足申请长度的最小空闲区,将其分割
并分配。
此算法最节约空间,因为它尽量不分割大的空闲区;其缺点是可能会形成很多很小的空闲区域,称作碎片。
3) 最坏适应算法
当接到内存申请时,查找分区说明表,找到能满足申请要求的最大的空闲区。
基本思想:在大空闲区中装入信息后,分割剩下的空闲区相对也很大,还能用于装入其他程序。
优点: 可以避免形成碎片;
缺点: 分割了大的空闲区后, 如果再遇到较大的程序申请内存时,无法满足要求的可能性较大。
4) 下次适应算法
当接到内存申请时,查找分区说明表,从上一次分配的位置开始扫描内存,选择下一个大小足够的可用块。
7. 分区的回收 4 种可能
1) 回收分区的上邻分区是空闲的,需要将两个空闲区合并成一个更大的空闲区,然后修改空闲区表。
方法如下:
如果空闲区表中第 i 个登记栏中的“起始地址+长度”正好等于S,则表明回收区有一个上邻空闲区。这时要修改第 i 栏登记项的内容:起始地址不变,长度为原长度加上 L,即:度=原长度+L
2) 回收分区的下邻分区是空闲的,需要将两个空闲区合并成一个更大的空闲区,然后修改空闲区表。
方法如下:
如果 S+L正好等于空闲区表中某个登记的栏目(假定为第i栏)所示分区的起始地址,则表明回收区有一个下邻空闲区。这时只要修改第i栏登记项的内容:
起始地址=S 长度=原长度+L
则第 i 栏指示的空闲区是回收区与下邻空闲区合并后的一个大空闲区。
3) 回收分区的上邻分区和下邻分区都是空闲的,需要将 3 个空闲区合并成一个更大的空闲区,然后修改空闲区表。
如果 S =第 i 栏起始地址+长度
S+L=第 k 栏起始地址
则表明回收区既有上邻空闲区,又有下邻空闲区。此时,必须把这 3 个区合并成一个空闲区登记入空闲区表中,只需使用一个登记栏目。具体修改方法如下:
第 i栏起始地址不变;
第 i栏长度为“i 栏中原长度+k栏中长度+L”; 第 k 栏的标志应修改成“空”状态。
于是,第t 栏中登记的空闲区就是合并后的空闲区, 而第 k 栏成为空表目了。
4) 回收分区的上邻分区和下邻分区都不是空闲的,则直接将空闲分区记录在空闲区表中。
这时,应找一个标志为“空”的登记栏, 把回收区的起始地址和长度登记入表, 且把该栏目中的标志位修改成“未分配”,表示该登记栏中指示了一个空闲区。
8. 覆盖技术
覆盖技术是指一个程序的若干程序段或几个程序的某些部分共享某一个存储空间。
未执行的程序段先保存在磁盘上,当有关程序段的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段。
覆盖技术不需要任何来自操作系统的特殊支持,可以完全由用户实现;
覆盖可以从用户级彻底解决内存小装不下程序的问题。
覆盖技术利用相互独立的程序段之间在内存空间的相互覆盖,逻辑上扩充了内存空间,从而在某种程度上实现了在小容量内存上运行较大程序的目的。
覆盖技术主要用于系统程序的内存管理上。
9. 交换技术
交换技术又称对换技术。在分时系统中,用户的进程比内存能容纳的数量要多,这就需要在磁盘上保存那些内存放不下的进程。在需要运行这些进程时,再将它们装入内存。
进程从内存移到磁盘并再移回内存称为交换。
交换技术是进程在内存与外存之间的动态调度,是由操作系统控制的。
系统可以将那些不在运行中的进程或其一部分调出内存,暂时存放在外存上的一个后备存储区(称为盘 交换区 Swapping Area)中,以腾出内存空间给现在需要内存空间的进程,后者可能需要从外存换入内存,以后再将换出的进程调入内存继续执行。
交换技术多用于分时系统中。
交换技术利用外存来逻辑地扩充内存,它的主要特点是,打破了一个程序一旦进入内存便一直运行到结束的限制。
10. 页式存储管理
页式存储器提供编程使用的逻辑地址由两部分组成:页号和页内地址。其格式为:
页号 | 页内地址 |
页式存储的地址结构确定了内存分块的大小,也就决定了页面的大小。
假定地址用 m 个二进制表示, 其中页内地址部分占用 n 个二进制位,那么, 每一个块的长度就是,也就是每一页有 2n 个字节。这时,页号部分占用了 m-n 位,所以,最大的程序可允许有 2 ( m - n ) 个页面。
从地址结构来看,逻辑地址是连续的。
11. 存储空间的分配与回收
页式存储管理分配内存空间以物理页面为单位;
简单的内存分配表可以用一张“位示图”构成。
位示图中的每一位与一个内存块对应,每一位的值可以是 0 或 1, 0 表示对应的内存块为空闲, 1 表示已占用。
在进行内存分配时,先查看空闲块数是否能满足程序要求。若不能满足,则不进行分配,程序就不能装入内存;若能满足, 则根据需求从位示图中找出一些为 0 的位, 把这些位置成 1,并从空闲块数中减去本次分配的块数,然后按照找到的位计算出对应的块号。
当找到一个为 0 的位后, 根据它所在的字号、位号, 按如下公式就可计算出对应的块号:
块号=字号 ×字长+位号
l 把程序装入到这些内存块中,并为该程序建立页表。
12. 页式存储管理的地址转换
为实现页式存储管理,系统要提供页表起始地址寄存器和页表长度寄存器以及要高速缓冲存储器的支持。
页表指出该程序逻辑地址中的页号与所占用的内存块号之间的对应关系;
页表的长度由程序拥有的页面数而定;
页表是硬件进行地址转换的依据,每执行一条指令时按逻辑地址中的页号查页表。若页表中无此页号,则产生一个“地址错”的程序性中断事件。若页表中有此页号, 则可得到对应的内存块号, 按计算公式可转换成访问的内存的物理地址。
l 物理地址的计算公式为:
物理地址=内存块号 ×块长+页内地址
l 根据二进制乘法运算的性质,一个二进制数乘以 2n 结果实际上是将该数左移 n 位。所以,实际上是把内存块号作为绝对地址的高位地址,而页内地址作为它的低地址部分。
13. 页表
1) 多级页表
当系统支持 32 位的逻辑地址空间时, 若页面大小为 4KB, 则页表将包含 1M 个表项。假设每个表项由 4 字节组成, 那么仅仅是为了存储页表就要为每个进程分配 4MB 的物理地址空间。假设用户地址空间为 2GB, 页面大小为 4KB,则一个进程最多可以有 219 页。若用 4 字节表示一页的物理页号, 则页表本身就占用 2MB, 即需要 512 个页面存放。
l 存放页表的页面为页表页。一般来说,页表页可以不连续存放,因此需要对页表页的地址进行索引。
l 在大多数操作系统中采用二级页表,即由页表页和页目录一起构成进程页表。第一级表示页目录,保存页表页的地址;第二级表示页表页,保存物理页面号(即内存块号)。
在 Windows 操作系统中, 页目录被称为页目录项( Page Directory Entry,PDE), 页表被称为页表项( Page Table Entry, PTE)。
2) 散列页表
当地址空间大于 32 位时, 一种常见的方法是使用以页号为散列值的散列页表。其中每个表项都包含一个链表,该链表中元素的散列值都指向同一个位置。
这样,散列页表中的每个表项都包含3 个字段:(a)虚拟页号,(b)所映射的页框号,(c)指向链表中下一个元素的指针。
3) 反置页表
在反置页表中,每个物理页框对应一个表项,每个表项包含与该页框相对应的虚拟页面地址以及拥有该页面进程的信息。
因此,整个系统中只存在一个页表,并且每个页框对应其中一个表项。
由于一方面系统中只有一个页表,而另一方面系统中又存在着多个映射着物理内存的地址空
间,因此需要在反置页表中存放地址空间标志符。这样就保证了一个特定进程的逻辑页面可以映射到相应的物理页框上。
14. 快表
为了提高存取速度,在地址映射机制中增加一个小容量的联想寄存器(相联存储器), 它由高速缓冲存储器组成。
利用高速缓冲存储器存放当前访问最频繁的少数活动页面的页号,这个高速缓冲器被称为“快表”, 也称为转换检测缓冲器(Translation Lookaside Buffer, TLB)。
快表只存放当前进程最活跃的少数几页,随着进程的推进,快表的内容动态进行更新。
更新原理:当某一用户程序需要存取数据时,根据该数据所在的逻辑页号在快表中找出对应的内存块号,然后拼接页内地址,以形成物理地址;如果在快表中没有相应的逻辑页号,则地址映射仍然通过内存中的页表进行; 在得到内存块号后需将该块号填到快表的空闲单元中;若快表中没有空闲单元,则根据置换算法置换某一行,再填入新得到的页号和块号。
查找快表和查找内存页表是并行进行的,一旦发现快表中有与所查页号一致的逻辑页号就停止查找内存页表,而直接利用快表中的逻辑页号。
例: 假定访问内存的时间为 200ns,访问高速缓冲存储器的时间为 40ns, 高速缓冲存储器为 16 个单元时,查快表的命中率为 90%。于是, 按逻辑地址转换成绝对地址进行存取的平均访问时间为:
(200+4 0 ) × 9 0 % +(200+200)×10%=256(ns)
不使用快表需两次访问内存的时间为 200×2=400ns。可见使用快表与不使用快表相比,访问时间下降了 36%。
15. 虚拟存储器
实现虚拟存储器需要以下的硬件支持:
① 系统有容量足够大的外存。
② 系统有一定容量的内存。
③ 最主要的是,硬件提供实现虚-实地址映射的机制。
④ 缺页中断处理程序
⑤ 页表
在一个虚拟存储系统中,决定虚拟存储空间最大容量的要素是计算机系统地址位宽。
虚拟存储技术是动态的扩充内存容量。
虚拟存储器的工作原理如下:
① 当进程开始运行时,先将一部分程序装入内存,另一部分暂时留在外存;
② 当要执行的指令不在内存时,由系统自动完成将它们从外存调入内存的工作;
③ 当没有足够的内存空间时,系统自动选择部分内存空间,将其中原有的内容交换到磁盘上,并释放这些内存空间供其他进程使用。
16. 页表增加项
在使用虚拟页式存储管理时需要在页表中增加以下的表项: 页号——页面的编号。
l 有效位——又称驻留位、存在位或中断位,表示该页是在内存还是在外存。
l 页框号——页面在内存中时所对应的内存块号。
l 访问位——又称引用位或参考位,表示该页在内存期间是否被访问过。
修改位——表示该页在内存中是否被修改过。
保护位——是否能读/写/执行。
禁止缓存位——采用内存映射 I/O 的机器中需要的位。
其中,访问位和修改位可以用来决定置换哪个页面,具体由页面置换算法决定。
17. 缺页中断
若在页表中发现所要访问的页面不在内存,则产生缺页中断。
当发生缺页中断时,操作系统必须在内存中选择一个页面将其移出内存,以便为即将调入的页面让出空间。
整个缺页处理过程简单阐述如下:
① 根据当前执行指令中的逻辑地址查页表的驻留位,判断该页是否在内存。
② 该页标志为“0”, 形成缺页中断。保留现场。中断装置通过交换 PSW 让操作系统的中断处理程序占用处理器。
③ 操作系统处理缺页中断,寻找一个空闲的页面。
④ 若有空闲页,则把磁盘上读出的信息装入该页面中。
⑤ 修改页表及内存分配表,表示该页已在内存。
⑥ 如果内存中无空闲页,则按某种算法选择一个已在内存的页面,把它暂时调出内存。若在执行中该页面已被修改过,则要把该页信息重新写回到磁盘上,否则不必重新写回磁盘。当一页被暂时调出内存后,让出的内存空间用来存放当前需要使用的页面。页面被调出或装入之后都要对页表及内存分配表作修改。
⑦ 恢复现场,重新执行被中断的指令。当重新执行该指令时,由于要访问的页面已被装入内存, 所以可正常执行下去。
18. 页面调度 3 个策略
虚拟存储器系统通常定义 3 种策略进行页面调度: 调入策略, 置页策略和置换策略。
1) 调入策略
虚拟存储器的调入策略决定了什么时候将一个页由外存调入内存之中。
在虚拟页式管理中有两种常用调入策略:
① 请求调页( Demand Paging):只调入发生缺页时所需的页面。实现简单, 但易产生较多的缺页中断,容易产生抖动现象。
② 预调页( Prepaging):在发生缺页需要调入某页时, 一次调入该页以及相邻的几个页。
2) 置页策略
当线程产生缺页中断时,内存管理器还必须确定将调入的虚拟页放在物理内存的何处。用于确定最佳位置的一组规则称为“置页策略”。选择页框应使 CPU 内存高速缓存不必要的震荡最小。
3) 置换策略
如果缺页中断发生时物理内存已满,“置换策略” 被用于确定哪个虚页面必须从内存中移出, 为新的页面腾出空位。
固定分配局部置换(Fixed Allocation,Local Replacement)。
① 可基于进程的类型,为每一进程分配固定的页数的内存空间,在整个运行期间都不再改变。
② 采用该策略时,如果进程在运行中出现缺页,则只能从该进程的 W 个页面中选出一个换出,然后再调入一页,以保证分配给该进程的内存空间不变。
可变分配全局置换(Variable Allocation,Global Replacement)。
① 采用这种策略时,先为系统中的每一进程分配一定数量的物理块,操作系统本身也保持一个空闲物理块队列。
② 当某进程发生缺页时,由系统的空闲物理块队列中取出一物理块分配给该进程。
③ 但当空闲物理块队列中的物理块用完时,操作系统才从内存中选择一块调出。
④ 该块可能是系统中任意一个进程的页。
可变分配局部置换(Variable Allocation,Local Replacement)。
① 同样基于进程的类型,为每一进程分配一定数目的内存空间。
② 但当某进程发生缺页时,只允许从该进程的页面中选出一页换出,这样就不影响其他进程的运行。
③ 如果进程在运行的过程中频繁地发生缺页中断,则系统再为该进程分配若干物理块,直到进程的缺页率降低到适当程度为止。
19. “抖动” 现象
如果刚被调出的页面又立即要用,因而又要把它装入,而装入不久又被选中调出,调出不久又被装入,如此反复,使调度非常频繁。这种现象称为“抖动”或称“颠簸”。
20. 先进先出页面置换算法(First-In First-Out,FIFO)
FIFO 算法简单, 容易实现。
把装入内存的那些页面的页号按进入的先后次序排好队列,每次总是调出队首的页,当装入一个新页后,把新页的页号排入队尾。
由操作系统维护一个所有当前在内存中的页面的链表,最老的页面在表头,最新的页面在表尾。
当发生缺页时,置换表头的页面并把新调入的页面加到表尾。
21. 最近最少使用页面置换算法(Least Recently Used,LRU)
LRU 页面置换算法: 在缺页发生时, 首先置换掉最长时间未被使用过的页面;
最近最少使用页面置换算法总是选择距离现在最长时间内没有被访问过的页面先调出。
实现这种算法的一种方法是在页表中为每一页增加一个“计时”标志, 记录该页面自上次被访问以来所经历的时间,每被访问一次都应从“0”开始重新计时。
当要装入新页时,检查页表中各页的计时标志,从中选出计时值最大的那一页调出( 即最近一段时间里最长时间没有被使用过的页),并且把各页的计时标志全置成“0”,重新计时。
当再一次产生缺页中断时,又可找到最近最久未使用过的页,将其调出。
22. 举例说明页面置换算法
A:某程序在内存中分配 3 个页面,初始为空,所需页面的走向为 4, 3, 2, 1, 4,3, 5, 4, 3,2,1,5,采用 FIFO 算法,请计算整个缺页次数。
下面用“时间长-页”表示在内存时间最长的页面,“时间中-页”其次,“时间短-页” 表示在内存时间最短的页面。x 表示缺页, √表示不缺页。
页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
时间段-页 | 4 | 4 | 2 | 1 | 4 | 3 | 5 | 5 | 5 | 2 | 1 | 1 |
时间中-页 |
| 4 | 3 | 2 | 1 | 4 | 3 | 3 | 3 | 5 | 2 | 2 |
时间长-页 |
|
| 4 | 3 | 2 | 1 | 4 | 4 | 4 | 3 | 5 | 5 |
| x | x | x | x | x | x | x | √ | √ | x | x | √ |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
| 8 | 9 |
|
① 开始时,内存中 3 个页面初始为空, 故产生第 1 个缺页中断, 需要把页面 4 调入。同样产生第 2
个缺页中断,需要把页面 3 调入。产生第 3 个缺页中断, 需要把页面 2 调入。
② 此时 3 个内存页面全满。在需要页面 1 时,发现页面4 时间最长, 故产生第 4 个缺页中断, 把页面 4 换出,页面1调入。接着又需要页面 4,于是产生第5个缺页中断,把页面 3换出,页面4调入。后面又需要页面3,于是产生第 6个缺页中断,把页面 2换出,页面3调入。接着又需要页面 5,于是产生第7 个缺页中断,把页面1换出,页面5调入。
③ 下面需要页面 4,正好在内存。接着需要页面 3, 也正好在内存。后面需要页面 2,于是产生第 8 个缺页中断,把页面 4 换出,页面2 调入。接着需要页面 1,于是产生第9 个缺页中断, 把页面 3 换出,页面1 调
入。最后需要页面 5,正好在内存。整个操作结束, 共产生缺页中断 9 次。
B:在上述例子中采用 LRU 算法, 请计算整个缺页次数。
同样,用“时间长-页”表示未使用时间最长的页面, “时间中-页”其次,“时间短-页”表示未使用时间最短的页面。
页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
时间段-页 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
时间中-页 |
| 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 |
时间长-页 |
|
| 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 |
| x | x | x | x | x | x | x | √ | √ | x | x | x |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
| 8 | 9 | 10 |
共缺页中断 10 次。
C:在上述例子中采用 OPT 算法, 请计算整个缺页次数。
最长时间以后才会用到的页面,用“时间长-页”表示,“时间中-页”其次,“时间短-页”表示最短时间会用到的页面。
| 页面走向 | 4 | 3 | 2 | 1 | 4 | 3 | 5 | 4 | 3 | 2 | 1 | 5 |
|
时间段-页 | 4 | 3 | 2 | 1 | 1 | 1 | 5 | 5 | 5 | 2 | 1 | 1 | ||
时间中-页 |
| 4 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 5 | 5 | 5 | ||
时间长-页 |
|
| 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | ||
| x | x | x | x | √ | √ | x | √ | √ | x | x | √ | ||
| 1 | 2 | 3 | 4 |
|
| 5 |
|
| 6 | 7 |
|
共缺页中断 7 次。
23. 贝莱迪异常
当分配给进程的物理页面数增加时,缺页次数反而增加。这一现象称为贝莱迪异常(BeladyAnomaly) 现象, FIFO 页面置换算法会产生异常现象。
24. 缺页中断率
假定一个程序共有 n 页, 系统分配给它的内存块是 w 块( m、n 均为正整数, 因此, 该程序最多有 m 页可同时被装入内存。如果程序执行中访问页面的总次数为 1 其中有 F 次访问的页面尚未装入内存,故产生了 F 次缺页中断。现定义:
f= F/ A
把 f 称为“缺页中断率”。
显然,缺页中断率与缺页中断的次数有关。因此,影响缺页中断率的因素如下:
① 分配给程序的内存块数
② 页 面 的 大 小
③ 程 序 编 制 方 法
④ 页 面 置 换 算 法
2 5. 虚 拟 存 储 管 理 的 性 能 问 题
引入虚拟存储管理,把内存和外存统一管理,其真正目的,是把那些访问概率非常高的页放入内存,减少内外存交换的次数。
在虚存中,页面可能在内存与外存之间频繁地调度,有可能出现抖动或颠簸。
颠簸是由于缺页率高而引起的。
此外,一般进程在一段时间内集中访问一些页面,称为“活动”页面, 这是与程序的局部性有关的。如果分配给一个进程的内存物理页面数太少,使得该进程所需要的“活动”页面不能全部装入内存, 则进程在运行过程中可能会频繁地发生缺页中断,从而产生颠簸。
采用工作集模型,可以解决颠簸问题。
26. 段式存储管理
系统将内存空间动态划分为若干个长度不同的区域,每个区域称作一个物理段。每个物理段在内存中有一个起始地址,称作段首址。
将物理段中的所有单元从 0 开始依次编址, 称为段内地址。
用户程序的逻辑地址由段号和段内地址两部分组成。
内存分配时,系统以段为单位进行内存分配,为每一个逻辑段分配一个连续的内存区(物理段)。逻辑上连续的段在内存中不一定连续存放。
段式存储管理是为程序的每一个分段分配一个连续的内存空间。
空闲区的分配也可以采用首先适应算法、最佳适应算法、最坏适应算法。
在进行动态地址转换时,硬件提供段表起始地址寄存器、段表长度寄存器等支持。
27. 页表项内容
在虚拟页式存储管理系统中,每个页表项中必须包含的是:
①有效位:用于指明表项对地址转换是否有效;
②读写位:如果等于 1,表示页面可以被读、写或执行。如果为 0,表示页面只读或可执行;
③访问标志:处理器只负责设置该标志,操作系统可通过定期地复位该标志来统计页面的使用情况;
④修改位:当处理器对一个页面执行写操作时,就会设置对应页表项的 D 标志。处理器并不会修改页目录项中的 D 标志。
28. 页式分配的优点
①由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。
②动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加。这既提高了主存的利用率,又有利于组织多道程序执行。
29. 请求分页的外存
在请求分页的外存(磁盘)分为两部分:
用于存放文件的文件区和用于存放对换页面的对换区。
由于与进程有关的文件都放在文件区,故凡是未运行的页面都应该从文件区调入。
30. 内存管理方案
要能与虚拟存储技术结合使用的内存管理方案必须具有如下特性:
一是使用动态内存地址,内存中的进程要是可以移动的;
二是不能要求全部程序加载入内存,进程才能运行的。
31. 管理空闲内存方法
通常用于管理空闲物理内存的方法有:空闲块链表法、位示图法、空闲页面表。
32. 程序局部性
程序局部性原理是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域。
空间局部性是指一旦程序访问了某个存储单元,其附近的存储单元也将被访问,程序代码执行具有顺序性。
时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问, 则不久之后该数据可能再次被访问,也就是说程序中存在大量的循环。
33. 移动技术
移动技术可以集中分散的空闲区,提高内存的利用率,便于作业动态的扩充内存。采用移动技术要注意以下问题:
①移动技术会增加系统的开销;
②移动是有条件的。
在采用移动技术时应该尽可能减少需要移动的作业数和信息量。
在内存中可以将进程从低地址区域移到高地址区域,可以将进程从高地址区域移到低地址区域。
34. 链接
链接是指把所有编译后得到的目标模块连接装配起来,再与函数库相连接成一个整体的过程。
35. 页式存储管理
页式存储管理将内存空间划分成等长的若干区域,每个区域的大小一般取 2 的整数幂,称为页框。
系统将程序的逻辑空间按照同样大小也划分成若干页面,称为逻辑页面也称为页,大小与页框相同。
虚拟页面在物理空间上不要求连续存放。