分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
页之所以是一维的,原因在于分页的大小是固定的,且页码之间是连续的,操作的时候只需给出一个地址,就能够根据所给地址的大小与页面大小计算出在页码和页内地址,粗略举例,比如页面大小是4KB,给一个地址为5000,可以算出所在页码是2,页内地址是5000-4000=1000,即在第二页的第1000个位置。
而分段的因为每段的长度不一样,必须给出段码和段内地址;
分页 分段都需要两次访问内存;
段页式 需要三次访问内存;
习题解答:
- 考虑下述存储管理方式中,进程空间和逻辑空间的编址情况:
(1)界地址存储管理方式,进程空间的首地址;
(2)页式存储管理,进程空间的首地址;
(3)段式存储管理,进程空间各段的首地址;
(4)段页式存储管理,进程空间各段的起始地址。
答:(1)界地址存储管理方式,进程空间的首地址从0开始编址;(2)页式存储管理,进程空间的首地址从0开始编址;(3)段式存储管理,进程空间各段的首地址从0开始编址;(4)段页式存储管理,进程空间各段的起始地址从0开始编址。
- 对于如下存储管理方式来说,进程地址空间各是几维的?
(1)页式;(2)段式;(3)段页式
答:(1)页式存储管理中,进程地址空间是一维的;(2)段式存储管理中,进程地址空间是二维的;(3)段页式存储管理中,进程地址空间是二维的。
- 在页式存储管理中,页的划分对用户是否可见?在段式存储管理中,段的划分对用户是否可见?在段页式存储管理中,段的划分对用户是否可见?段内页的划分对用户是否可见?
答:(1)在页式存储管理中,分页对于用户是透明的,一个进程由若干个页构成,所有页的长度相同;(2)在段式存储管理中,分段对于用户是可见的,一个进程由若干个段构成,各个段的长度可以不同,一个段恰好对应一个程序单位;(3)在段页式存储管理中,段的划分对用户是可见的,段内页的划分对用户是透明的,一个段由若干个页构成,所有页的长度相同。
- 为什么空闲页面链适合管理内存空间,而不适合管理外存空间?
答:空闲页面链是将所有的空闲页面连成一个链,分配时可取链头的页面,去配时可将被释放的页面连入链头。此种方法适用于内存页面的分配,但对于外存页面的分配因分配和去配均需执行一次I/O传输,速度较慢。特别是当要申请多个页面时,需要进行多次I/O传输,分配效率太低。
- 在某些虚拟页式存储管理系统中,内存永远保持一个空闲页面,这样做有什么好处?
答:在内存没有空闲页架的情况下,需要按照置换算法淘汰一个内存页架,然后读入所缺页面,缺页进程一般需要等待两次I/O传输。若内存总保持一个空闲页架,当发生页故障时,所缺页面可以被立即调入内存,缺页进程只需等待一次I/O传输时间。读入后立即淘汰一个内存页面,此时可能也需执行一次I/O传输,但对缺页进程来说不需等待,因而提高了响应速度。
- 为何引入多级页表?多级页表是否影响速度?
答:早期的内存空间和进程空间都比较小,一个进程的页表长度也较小,可以在内存分配一个连续的存储区域保存进程的页表。但随着内存空间和进程空间的快速增长,页表越来越大,单级页表的存放遇到困难。 例如: 对于长度为232的逻辑地址空间,页面长度定义为212(4kB),则一个进程最多可以拥有220个页面,也就是说系统需要提供长度为220的连续页表存储区,这是困难的。 为此常将页表分为多级进行存放,例如对于上述例子,将220分为210′210两级,一级称为外页表,另一级称为内页表,此时外页表和内页表的长度都在210以内。可以很自然地把二级页表扩展为多级页表.显然,多级页表会降低地址映射的速度,但通过快表仍可以将效率保持在合理的范畴内.例如对于四级页表,假定快表的命中率为98%,快表与内存的访问时间分别为20(ns)和100(ns),有效访问时间为:
EAT= 98%′(20+100)+2%′(20+500) = 128(ns)
额外的开销是(128-100)=28ns。
- 与传统页表相比,倒置页表有什么优势?
答:传统页表是面向进程虚拟空间的,即对应进程的每个逻辑页面设置一个表项,当进程的地址空间很大时,页表需占用很多的存储空间,造成浪费。与经典页表不同,反置页表是面向内存物理页架的,即对应内存的每个物理页架设置一个表项,表项的序号就是物理页架号f,表项的内容则为进程标识pid与逻辑页号p的有序对。系统只需设置一个反置页表,为所有进程所共用。
- 允许进程空间逻辑页号不连续带来的好处是什么?
答:可以给同一进程内的多个线程预留足够的栈空间,而又不浪费实际内存页架。
- 比较段式存储管理与页式存储管理的优点和缺点.
答:页式存储管理优缺点:(1)静态等长存储分配简单,有效地解决了内存碎片问题;(2)共享和保护不够方便。段式存储管理优缺点:(1)动态异长存储分配复杂,存在碎片问题;(2)共享与保护方便;(3)可以实现动态链接和动态扩展。
- 举例说明段长动态增长的实际意义.
答:允许段长动态增长对于那些需要不断增加或改变新数据或子程序的段来说很有好处。例如,分配给进程的栈空间大小,通常预先无法准确估计,若分配过少可能不够用,分配过多则造成浪费。在栈可以动态增长的情况下,系统开始可以为进程分配一个基本长度的栈空间,这个长度浪费很小。若进程运行时发生栈溢出,通过中断可以进行动态扩展。
- 在段式存储管理中,段的长度可否大于内存的长度?在段页式存储管理中呢?
答:在段式存储管理中,段的长度不能大于内存的长度,因为一个独立的段占用一段连续的内存空间,内存分配是以段为单位进行的,如果一个段的长度大于内存的长度,那么该段将无法调入内存。在段页式存储管理中,段的长度可以大于内存的长度,因为内存分配的单位是页,一个段内逻辑上连续的页面,可以分配到不连续的内存页面中,不要求一个段的所有逻辑页都进入内存。
- 共享段表的用途何在?
答:共享段表的用途主要有如下两个:(1)用来寻找共享段:根据进程首次访问某段的名称在共享段表中查找,可以得知该段是否已在内存;(2)确保一个共享段只有一组描述信息:共享段的地址、长度等信息在共享段表中仅记录一次,防止在多个进程段表中重复登记所带来的维护困难。共享段表用来实现段的共享和保护,该表中记录所有共享段。多个进程共享同一段时,这些进程段表中的相应表目指向共享段表中的同一个表目,共享段表形式如下。
段名 | 共享记数 | 段长度 | 段首址 | 其它 |
表中“段名”用来识别和查找共享段,“共享计数”记录当前有多少个进程正在使用该段,当其值为0时为空闲表项。当一个共享段最初被使用时,它被登记在共享段表中,共享计数置为1。以后其它进程访问此段时,其共享计数加1。当一个进程结束对于某一共享段的访问时,其共享计数减1,当减到0时表示没有进程再使用该段,可释放所占用的存储空间。
- 具有两级页表的页式存储管理与段页式存储管理有何差别?
答:具有两级页表的页式存储管理的地址空间依然是一维的,两级页的划分对于进程来说都是透明的。而段页式存储管理的地址空间是二维的,段的划分用户能感觉到。
- 何谓请调?何谓预调?为何在预调系统中必须辅以请调?
答:所谓请调是当页故障发生时进行调度,即当被访问页面不在内存时由动态调页系统将其调入内存。显然,采用纯请调策略,被移入内存的页面一定会被用到,即不会发生无意义的页面调度。但是,请调也有一个缺点:从缺页中断发生到所需页面被调入内存,这期间对应的进程必须等待,如此将会影响进程的推进速度。预调也称先行调度。是当页故障发生前进行调度,即当一个页面即将被访问之前就由动态调页系统将其调入内存。易见,预调可以节省进程因页故障而等待的时间。预调通常根据程序的顺序行为特性而作出:如某进程当前正访问第12页,则接下来很可能会访问第13页、第14页,此时可将第13页甚至第14页预先调入内存。这样当该进程访问第13页以至第14页时它们已经在内存中,不会发生缺页故障,从而提高进程的推进速度。预调不一定是百分之百准确的:由于程序中存在转移语句,第13页用完后可能需要访问第10页,而该页目前可能不在内存。也就是说,预先调入的页面可能有的未被用到,预先未调入的页面可能有的会被用到。当访问到预先未调入内存的页面时,仍会发生缺页中断。因而,在采用预调的系统中,必须辅以请调的功能。
- 段的动态连接给共享带来什么问题?如何解决?
答:动态连接提高了系统的效率,但也带来一些问题,主要是对于段共享的影响。代码段共享的必要条件是该段在运行过程中不修改自身,即要求是“纯代码”(pure code),而动态连接需要修改连接字,这与共享的要求相矛盾。解决这个问题的一种方法是将代码段分为“纯段”和“杂段”两个部分,即将连接字等可修改的内容存放在“杂段”中,而将其它内容放在“纯段”中。“杂段”不共享,“纯段”可共享。
- 在虚拟段页式存储管理中,考虑段的共享与段长度的动态变化,连接中断如何处理?
答:由段名查本进程的段名—段号对照表及共享段表,经判断可分为如下三种情形:
(1) 所有进程都未连接过(共享段表、段名-段号对照表均无): 查文件目录找到该段; 为该段建立页表,将该段由文件全部读入swap空间,部分读入内存,填写页表;为该段分配段号,填写段名-段号对照表;如该段可共享,填写共享段表,共享记数置1;填写段表;根据段号及段内地址形成无障碍指示位的一般间接地址。(2) 其它进程连接过但本进程未连接过(共享段表有,段名-段号对照表无): 为该段分配段号;填写段名-段号对照表,填写段表(指向共享段表),共享段表中共享记数加1;根据段号及段内地址形成无障碍指示位的一般间接地址。(3) 本进程已连接过(共享段表无,段名-段号对照表有): 根据段号及段内地址形成无障碍指示位的一般间接地址。这里,段内地址由两部分构成,即逻辑页号和页内地址。
- 伙伴堆内存分配算法的特点是将连续的物理页架分给进程,这样做的动机是什么?为何能提高效率?
答:尽管从地址映射的角度来看,页式存储管理并不要求一个进程所分得的页面在物理上连续,但DMA传输是在没有地址映射的条件下进行的,因而跨页的DMA传输要求页面在物理上是连续的,而连续物理页面分配要求所带来的问题是可能产生外碎片(external fragmentation)。伙伴算法是针对外碎片问题而提出的一种稳定、高效的分配策略。它将所有空闲页面分为10个块组,块组编号为i (i=0~9),块组i中记载长度为2i个页面的连续区域,即第1组中块的大小均为20(1页),第2组中块的大小均为21(2页),…,第10组中块的大小均为29(512页)。这样每一组中块的大小是相同的,并且勾成一个双向链表。
对于长度为128页的请求,在第8组中取一块。若第8组已空,取第9组中一块,分配其中的128页,并将剩余的128页记入第8组。若第9组也空,取第10组中一块,进行两次分割,分配128块,将剩余的128块和256块分别记入第8组和第9组。
释放是上述操作的逆过程,此时需要考虑与伙伴的合并,两个块为伙伴的条件是:(1)两个块的大小相同,如b个页面;(2)两个块的物理地址连续;(3)位于后面块的最后页面编号必须是2b的整数倍。与传统的非连续多页面分配算法相比,Buddy heap算法具有速度快的明显特点,同时解决了外碎片问题。