内存的大小随着计算机硬件的飞速发展,也在不断增长,但仍然满足不了将所有用户进程和系统所需要的全部程序与数据放入内存中,因此,操作系统必须对内存空间进行合理的划分和有效的动态分配。
有效的内存管理不仅可以方便用户使用存储器、提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。内存管理的功能有:
内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。 地址转换。在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。 内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。 存储保护。保证各道作业在各自的存储空间内运行,互不干扰。
程序运行过程
程序在系统中运行,必须先将程序和数据装入内存,将源程序转变为可在内存中执行的程序,通常需要以下几个步骤:
编译。由编译程序将用户源代码编译成若干目标模块。 链接。由链接程序将编译后形成的一组目标模块及所需的库函数链接在一起,形成一个完整的装入模块。 装入。由装入程序将装入模块装入内存运行。
如下图所示,显示了由源程序转变为可在内存中执行的三步过程。

链接方式
根据不同的链接时间,可将链接分为三种方式:
静态链接。在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。 装入时动态链接。将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式。 运行时动态链接。对于某些目标模块的链接,是在程序执行时需要该目标模块时才进行的。其优点是便于修改和更新,便于实现对目标模块的共享。
装入方式
装入模块在装入内存时,有如下三种装入方式:
绝对装入。在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生物理地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改。绝对装入方式只适用于单道程序环境。另外,程序中所用的物理地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为物理地址。 可重定位装入。在多道程序环境下,用户程序编译所形成的若干个目标模块的起始地址通常都从 0 开始,程序中的其他地址都是相对于起始地址计算的,此时应采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。装入时对目标程序中指令和数据地址的修改过程称为重定位,地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位,如下图(a)所示。静态重定位的特点是,一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够足够的内存,则不能装入该作业。此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能在申请内存空间。 动态运行时装入,也称动态重定位。程序在运行过程中,它在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存中,并不立即把装入模块中的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址仍是逻辑地址。为使地址转换不影响指令的执行速度,需要一个重定位寄存器的支持。如下图(b) 所示。动态重定位的特点是,可以将程序分配到不连续的存储区中,在程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

地址空间
程序在编译后,每个目标模块都从 0 号单元开始编址,这称为该目标模块的逻辑地址。当链接程序将各个模块链接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从 0 号单元开始编址的逻辑地址空间。用户程序和程序员只需知道逻辑地址,而内存管理的具体机制则是完全透明的,只有系统编程人员才会涉及。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到主存的不同位置。
物理地址空间是指内存中物理单元的集合,它是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,这个过程称为地址重定位。
内存保护
内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户的影响。内存保护可采取两种方式:
在 CPU 中设置一对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当 CPU 要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。 采用重定位寄存器(或基址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。每个逻辑地址值必须小于界地址寄存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元,如下图所示。

当 CPU 调度程序选择进程执行时,派遣程序会初始化重定位寄存器和界地址寄存器。每个逻辑地址都需要与这两个寄存器进行核对,以保证操作系统和其他用户程序及数据不被该进程的运行影响。
重定位寄存器是用来
加
的,逻辑地址加上重定位寄存器中的值就能得到物理地址;界地址寄存器是用来比
的,通过比较界地址寄存器中的值与重定位寄存器加上逻辑地址的值来判断是否越界。
覆盖
早期的计算机,主存容量小,放不下用户进程的现象经常发生,覆盖技术可以用来扩充内存,解决主存容量下的问题。覆盖的基本思想如下所示。
由于程序运行时并非任何时候都要访问程序及数据的各个部分,因此可把用户空间分成一个固定区和若干覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。
覆盖技术的特点打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,因此,内存中能够更新的地址只有覆盖区的段,不在覆盖区中的段会常驻内存。
覆盖技术用于同一个程序或进程中,但是,覆盖技术要求给出程序段之间的覆盖结构,使得其对用户和程序员不透明,所以对于主存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术来解决的,覆盖技术则已成为历史。
交换
交换技术也可用于扩充内存,解决内存超载的方法,即把处于等待状态或在 CPU 调度原则下被剥夺运行权利的程序从内存移到辅存,把内存空间腾出来,这一过程又称换出;把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程又称换入。中级调度采用的就是交换技术。
例如,有一个 CPU 采用时间片轮转调度算法的多道程序环境。时间片到,内存管理器将刚刚执行过的进程换出,将另一进程换入刚刚释放的内存空间。同时,CPU 调度器可以将时间片分配给其他已在内存中的进程。每个进程用完时间片都与另一进程交换。在理想情况下,内存管理器的交换过程速度足够快,总有进程在内存中可以执行。
但交换也有以下几个问题需要注意:
交换需要备份存储,通常是快速磁盘。它必须足够大,并提供对这些内存映像的直接访问。 为了有效使用 ,需要使每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间比所交换的内存空间成正比。 若换出进程,则必须确保该进程完全处于空闲状态。 交换空间通常作为磁盘的一整块,且独立于文件系统,因此使用起来可能很快。 交换通常在有许多进程运行且内存空间吃紧时开始启动,而系统负荷降低就暂停。 普通的交换使用不多,但交换策略的某些变体在许多系统中仍发挥作用。
交换技术主要在不同进程或作业之间进行,在现代操作系统中仍具有较强的生命力。
连续分配
连续分配方式是指为用户程序分配一个连续的内存空间,即程序中代码或数据的逻辑地址相邻,体现在内存空间分配时物理地址的相邻。连续分配方式主要包括单一连续分配、固定分区分配和动态分区分配。
单一连续分配
单一连续分配内存管理方式把内存分为系统区和用户区,系统区仅供操作系统使用,通常放在内存的低地址部分;用户区是为用户程序提供的、除系统区之外的内存空间。这种方式无须进行内存保护。因为内存中永远只有一道程序,因此肯定不会因为访问越界而干扰其他程序。
这种方式的优点是简单、无外部碎片,可以采用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。
固定分区分配
固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。
固定分区分配在划分分区时有两种不同的方式,如下所示。

分区大小相等。指所有的内存分区大小相等。用于利用一台计算机去控制多个相同对象的场合,但缺乏灵活性,会造成内存空间的浪费。 分区大小不等。划分为若干个大小不等的分区,增加了分配的灵活性。通常,会把内存区划分成多个较小的分区、适量中等的分区及少量的大分区,并根据程序的大小,分配适当的分区。
为便于内存分配,通常将分区按大小排队,并为之建立一张分区说明表,其中各表项包括每个分区的始址、大小以及状态是否已分配,如下图 (a) 所示。当有用户程序要装入时,便检索该表,以找到合适的分区给予分配并将其状态置为 “已分配”;未找到合适分区时,则拒绝为该用户程序分配内存。存储空间分配情况如下图 (b) 所示。

固定分区分配可用于多道程序系统的最简单的存储管理方式,无外部碎片,但不能实现多进程共享一个主存区,且每个分区的大小固定,程序小于固定分区也会占用一个完整的内存分区,会造成存储空间的浪费,这种现象称为内部碎片。固定分区分配很少用于现在通用的操作系统中,但在某些用于控制多个相同对象的控制系统中仍发挥着一定的作用。
动态分区分配
动态分区分配又称可变分区分配,是根据进程的实际需要,动态划分内存的分区方法。这种分区方法不预先划分内存,而是在进程装入内存时,根据进程的大小动态地建立分区,使分区的大小正好适合进程的需要,并且使用相应的空闲分区表或空闲分区链来描述空闲分区和已分配分区的情况。因此,系统中分区的大小和数目是可变的。
如下图所示,系统有 64MB 内存空间,其中低 8MB 固定分配给操作系统,其余为用户可用内存。开始时装入前三个进程,它们分别分配到所需的空间后,内存只剩下 4MB,进程 4 无法装入。在某个时刻,内存中没有一个就绪进程,CPU 出现空闲,操作系统就换出进程 2,换入进程 4。由于进程 4 比进程 2 小,这样在主存中就产生了一个 6MB 的内存块。之后 CPU 又出现空闲,而主存无法容纳进程 2,操作系统就换出进程 1,换入进程 2。

动态分区在开始分配时是很好的,但之后会导致内存中出现许多小的内存块。随着时间的推移,内存中会产生越来越多的碎片,内存的利用率随之下降。这些小的内存块称为 外部碎片,指在所有分区外的存储空间会变成越来越多的碎片,这与固定分区中的内部碎片正好相对。
一个系统或用户程序必须被装入一片连续的内存空间中。当一台计算机运行了一段时间后,它的内存空间将会被分割成许多小的分区,而缺乏大的空闲空间。即使这些分散的许多小分区的容量总和大于要装入的程序,但由于这些分区不相邻,也无法把该程序装入内存。
克服外部碎片可以通过紧凑技术来解决,即将内存中运行的程序或数据进行移动和整理,把原来分散的多个空闲小分区合并。但这种解决方式每次都必须对移动的程序或数据进行重定位,因此需要重定位寄存器的支持,用它来存放程序或数据在内存中的起始地址。
为把一个新作业装入内存,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。由于内存分配算法对系统性能有很大的影响。
内存分配算法会根据程序或数据的大小从空闲分区表或空闲分区表中选出适当的分区分配给程序或数据使用,这就是动态分区的分配策略。通常有以下几种算法:
首次适应(first fit,FF)算法。空闲分区链以地址递增的次序链接。分配内存时顺序查找,直至找到大小能满足要求的空闲分区为止。 循环首次适应算法(Next Fit)算法。由首次适应算法演变而成。不同之处是,分配内存时从上次结束位置的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区为止。 最佳适应(best fit,BF)算法。空闲分区按容量递增的方式形成分区链,找到第一个能满足要求的空闲分区。 最坏适应(Worst Fit)算法。又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序链接。查找时,只要找到第一个能满足要求的空闲分区即可,即挑选出最大的分区。
上述几种方法中,首次适应算法不仅是最简单的、而且通常也是最好和最快的。该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区。为以后分配大内存空间创造了条件。其缺点是低址部分不断被划分,会留下许多难以利用的、很小的空闲分区,称为碎片。而每次查找又都是从低址部分开始,增加查找可用空闲分区时的开销。
循环首次适应算法,通过设置一起始查寻指针,来实现下一次起始查寻,并采用循环查找方式,如果最后一个仍不满足,则从第一个空闲分区从新开始。找到后,应调整起始查寻指针。该算法使内存中的空闲分区分布得更均匀,减少了查找空闲分区时的开销,但会缺乏大的空闲分区。
最佳适应算法的性能通常很差,每次分配后留下的剩余部分总是最小,从而在内存中产生许多难以利用的外部碎片。
最坏适应算法与最佳适应算法相反,它选择最大的空闲分区,从中分割一部分存储空闲,看起来使剩下的空闲分区不至于太小,不容易产生碎片,但是却把最大的连续内存划分开,以至于没有可用的大内存块,因此性能也非常差。
非连续分配
连续分配方式会形成许多碎片,虽然可通过紧凑方式将许多碎片拼接成可用的大块空间,但会付出很大的开销。而非连续分配方式允许程序分散地装入到不相邻的内存分区中,可以充分地利用内存空间,但这需要额外的空间去存储分散区域的索引,使得非连续分配方式的存储密度低于连续存储方式。非连续分配方式根据分区的大小是否固定,分为分页存储管理方式和分段存储管理方式。
分页存储
分页存储方式将内存空间分为若干个固定大小的区域,区域相对较小,称为页或页面,作为内存的基本单位。也将内存空间分为若干个物理块或页框,页和块的大小相同。这样可将用户程序的任一页放入任一物理块中。
每个进程也以页为单位进行划分,进程在执行时,以页为单位逐个申请主存中的页空间。进程中的块称为页,内存中的块称为页框或页帧。外存也以同样的单位进行划分,直接称为块。进程在执行时需要申请主存空间,即要为每个页面分配主存中的可用页框,这就产生了页和页框的一一对应。
在分页系统中,页面太小会减小内存碎片,提高内存利用率,但会使进程页面数过多,页表过长,占用大量内存,并且增加硬件地址转换的开销,降低页面换进换出的效率;页面太大可以减少页表长度,提高页面换进换出的效率,但又会使页内碎片增多,降低内存的利用率。所以页面大小要适中,并在空间和时间效率之间权衡。为方便地址转换,页面大小是 2 的整数幂。
分页地址结构
分页存储管理的 逻辑地址结构 包含两部分,如下图所示。

页号 P。 位偏移量 W,即页内地址。
地址长度为 32位,其中 0~11 位为页内地址,即每页大小为 4KB;12~31 位为页号,地址空间最多允许 页。
页表
为保证能在内存中找到进程的每个页面所对应的物理块,系统为每个进程建立了一张页面映像表,简称 页表。页表一般存放在内存中。
页表由页表项组成,它记录相应页在内存中对应的物理块号,页表项与地址由两部分构成,第一部分都是页号,但页表项的第二部分是物理内存中的块号,而地址的第二部分是页内偏移;页表项的第二部分与地址的第二部分共同组成物理地址。
在配置页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见,页表的作业是实现从页号到物理块号的地址映射,如下图所示。

分页式地址变换
地址变换机构用于将逻辑地址转换为内存中的物理地址,并且借助于页表来实现。下图给出了分页存储管理系统中的地址变换机构。

在系统中设置一个页表寄存器 PTR,存放页表在内存的始址和页表长度。进程未执行时,页表的始址和长度存放在进程控制块中,当进程执行时,才将页表始址和长度存入页表寄存器。设页面大小为 L,逻辑地址 A 到物理地址 E 的变换过程如下:
计算页号 P(P = A/L)和页内偏移量 W(W = A%L)。 比较页号 P 和页表长度 M,若 ,则产生越界中断,否则继续执行。 页表中页号 P 对应的页表项地址 = 页表始址 F + 页号 P x 页表项长度,取出该页表项内容 b,即为物理块号。 计算 E = b x L + W,用得到的物理地址 E 去访问内存。
具有快表的分页式地址变换
由于页表是存放在内存中的,若每存取一个数据都至少要访问两次内存。第一次是访问页表,确定所存取的数据的物理地址;第二次是根据该地址存取数据。但这种方法比通常的执行速度慢了一半。
快表,又称联想寄存器 TLB,用于存放当前访问的若干页表项,是为了提高地址变换速度而在地址变换机构中增设的一个具有并行查找能力的高速缓冲存储器,以加速地址变换的过程。主存中的页表常称为慢表,具有快表的地址变换机构如下图所示。

地址变换过程如下所示:
CPU 给出逻辑地址后,由硬件进行地址转换,将页号送入高速缓存寄存器,并将此页号与快表中的所有页号进行比较。 若其中有与此相匹配的页号,便表示所要访问的页表项在快表中,则直接从快表中读出该页所对应的物理块号,并送到物理地址寄存器中。 若未找到,还需访问内存中的页表,找到后,把从页表项中读出的物理块号送往地址寄存器,并同时将其存入快表中,以方便后面再次访问。如果快表已满,则需要按照一定的算法对旧的页表项进行替换。
一般情况下,从快表中能找到所需页表项达到 90% 以上,就可以将分页带来的速度损失可减少到 10% 以下。
多级页表
引入页表后,进程在执行时不需要将所有页调入内存,只需将保存有映射关系的页表调入内存,但当进程过多,页表过大时且连续存放,肯定会降低内存利用率。
为了提高内存空间利用率,引入多级页表,将页表进行分页,使每个页表的大小与内存物理块的大小相同,为它们进行编号,然后离散地将各个页面分别存放在不同的物理块中,避免把全部页表一直保存在内存中,并为离散分配的页表再建立一张页表,称为外层页表,用于存储页表的映射关系。
例如,在 32位和页大小 4KB 的环境下,页内偏移地址为 位,页号部分为 20 位,单页表中光页表就要占用 页,大大超过了许多进程自身需要的页面,对于内存资源来说是非常浪费的,而且查询页表也变得十分不便。若不把页表放在连续的空间里,就需要一张索引表来解决查找页表的问题,只在需要时才调入,而不用把全部页表都调入内存,从而解决占用内存空间过大的问题。
使用二级页表,索引页表只有 1 个页表,可以容纳 个页表项,占用的地址位数为 位,页内偏移地址占用 12 位,因此一个 32 位的逻辑地址空间剩下 10 位,正好使得二级页表的大小在一页之内,并得到逻辑地址空间的格式,如下图所示。

二级页表实际上是在原有页表结构上再加上一层页表,示意结构如下图所示。

建立多级页表的目的在于建立索引,以便不用浪费主存空间去存储无用的页表项,也不用盲目地顺序式查找页表项。
分段存储
引入分段存储管理方式的目的,主要是为了满足用户在编程、信息保护和共享、动态增长及动态链接等多方面的需求,提高内存的利用率。
段式管理方式按照用户进程中的自然段划分逻辑空间,简称 分段。例如,用户进程由主程序、两个子进程、栈和一段数据组成,于是可以把这个用户进程划分为 5 段,每段从 0 开始编址,并分配一段连续的地址空间。段的长度由相应的逻辑空间决定,因此每段的长度是不固定的。整个作业的地址空间被分成多个段,呈现出二维特性,即每个段既包含了一部分地址空间,又标识了逻辑关系。
分段地址结构
分段存储管理的 逻辑地址结构 包含两部分,如下图所示。

段号 S。 段内偏移量 W,即段内地址。
地址长度为 32 位,16~31 为段号,0~15 为段内偏移量,因此一个作业最多有 段,最大段长为 64KB。
在页式系统中,逻辑地址的页号和页内偏移量对用户是透明的,但在段式系统中,段号和段内偏移量必须由用户显式提供,在高级程序设计语言中,这个工作由编译程序完成。
段表
为每个进程建立一张逻辑空间与内存空间映射的段映射表,简称段表,其中每个段表项对应进程中的一段,记录了该段在内存中的起始地址和段长度。段表的内容如下图所示。

配置段表后,执行中的进程可通过查找段表,找到每段所对应的内存区。可见,段表是用于实现从逻辑段到物理内存区的映射的,如下图所示。

分段式地址变换
分段存储管理的地址变换过程如下图所示,为了实现进程从逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址 F 和段表长度 L。

从逻辑地址 A 到物理地址 E 之间的地址变换过程如下:
从逻辑地址 A 中得到段号 S 和段内地址 W。 比较逻辑地址中的段号 S 和段表长度 L,若 ,访问越界,产生越界中断,否则继续执行。 根据段表的始址 F 和该段的段号 S,计算出该段对应的段表项的段长 C = F + S x 段表项长度,比较段表项的长度 C 与段内地址 W,若 ,则产生越界中断,否则继续执行。 取出段表项中该段的始址 b,计算 E = b + W,用得到的物理地址 E 去访问目标内存单元。
共享与保护
在分段系统中,段的共享是通过两个作业的段表中相应表项指向被共享的段的同一个物理副本来实现的。当一个作业正从共享段中读取数据时,必须防止另一个作业修改此共享段中的数据。可重入代码又称为纯代码,是一种允许多个进程同时访问并绝对不允许在执行时有任何修改,它不属于临界资源,这样的代码和不能修改的数据可以共享,而可以修改的代码和数据不能共享。
与分页管理类似,分段管理的保护方法主要有两种:一种是存取控制保护,另一种是地址越界保护。地址越界保护将段表寄存器中的段表长度与逻辑地址中的段号比较,若段号大于段表长度,则产生越界中断,再将段表项中的段长和逻辑地址中的段内位移进行比较,若段内位移大于段长,也会产生越界中断。分页管理中的地址越界保护只需要判断页号是否越界,页内偏移是不可能越界的。
段页式存储
分页存储管理能有效地提高内存利用率,而分段存储管理能反映程序的逻辑结构并有利于段的共享。结合两者管理方式的优点,形成了段页式存储管理方式。
段页式管理方式结合分段与分页的原理,将作业的地址空间被分成若干逻辑段,每段都有自己的段号,然后将每段分成若干大小固定的页。
段页式地址结构
段页式管理方式中 逻辑地址 分为三部分,即段号、页号和页内偏移量,如下图所示。

段页式管理方式中实现从逻辑地址到物理地址的变换,需要为每个进程建立一张段表,每个分段有一张页表。段表表项中至少包括段号、页表长度和页表始址,页表表项中至少包括页号和块号。此外,系统中还应有一个段表寄存器,指出作业的段表始址和段表长度。段表寄存器和页表寄存器的作用有两个,一是在段表或页表中寻址,二是判断是否越界。

一个进程中只有一个段表,但页表可能有多个。
段页式地址变换
段页式的地址变换过程如下图所示,为了实现进程从逻辑地址到物理地址的变换功能,需配置一个段表寄存器,用于存放段表始址 F 和段表长度 L。

从逻辑地址 A 到物理地址 E 之间的地址变换过程如下:
根据逻辑地址得到段号 S、页号 P、页内偏移量 W。 利用段号 S 与段长 L 比较,若 ,则产生越界中断,否则继续执行。 根据段表始址 F 和该段的段号 S,计算出段表项的存放地址 D = F + S x 段表项长度,从中得到该段的页表始址 SP,比较页表始址 SP 与页表长度 PL,若 ,则发生越界中断,否则继续执行。 根据逻辑地址中的段内页号 SP 获得对应页表项位置,从中读出该页所在的物理块号 b。 根据物理块号 b、页内变异量得到最终的物理地址并访问目标内存单元。
在段页式管理方式中,一次访问实际需要三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中取出指令或数据。
为提高执行速度,使用快表来加快查找速度,其关键字由段号、页号组成,值是对应的页帧号和保护码。





