• 沒有找到結果。

操作系统原理及应用(Windows Server 2008) - 万水书苑-出版资源网

N/A
N/A
Protected

Academic year: 2021

Share "操作系统原理及应用(Windows Server 2008) - 万水书苑-出版资源网"

Copied!
45
0
0

加載中.... (立即查看全文)

全文

(1)第 4 章 存储管理. 存储管理是操作系统的重要组成部分,它负责管理计算机系统的存储器,存储 器可分成内存储器(简称内存,又称主存)和辅助存储器(简称辅存,又称外存) 两类。本章讨论内存储器的管理。 内存储器的存储空间一般分为两部分:一部分是系统区,存放操作系统以及标 准子程序、例行程序等;另一部分是用户区,存放用户的程序和数据等。存储管理 主要是对内存储器中的用户区域进行管理。. ¾ ¾ ¾ ¾ ¾ ¾. 存储管理的目的和功能 覆盖和交换技术 虚拟存储技术 缓冲存储器 存储管理机制 Windows Server 2008 的内存管理. 4.1 存储管理的目的和功能 程序在内存中的位置只有在装入执行时才能确定,因而在编写程序时不能使用绝对地 址,用户按逻辑地址编写程序,操作系统为程序分配一个内存空间时,逻辑地址和分配到的 内存空间的绝对地址不一致,而处理机执行指令按绝对地址进行,所以操作系统必须把逻辑 地址转换绝对地址,处理机才能得到指令的位置。把逻辑地址转换成绝对地址的过程称为地 址转换(又称重定位)。重定位有两种:静态重定位、动态重定位。静态重定位是指作业在 装入过程中进行的地址转换,需要由专门设计的重定位装入程序完成,不需要硬件地址变换 结构,实现起来比较简单,但要求给作业一个连续的存储空间,在作业执行期间不能移动, 难以实现内存共享和内存的扩充。动态重定位是指在作业执行过程中,当访问指令或数据 时才进行的地址变换,需要硬件地址变换机构实现,实现存储管理的软件算法比较复杂。 但动态重定位使内存的使用更加有效,便于实现动态链接,内存的共享和内存的扩充能够得 以实现。 当内存中存在多个程序时,为了防止程序访问和写入错误,多个程序间应进行保护,并 能用合理而有效的方法进行调度。.

(2) 程序和数据只有存放在 CPU 能直接访问的内存中,这个程序才能够执行。尽管 RAM 芯片的集成度不断提高,价格不断下降,但内存容量仍是计算机系统中的主要“瓶颈”资 源,为使用户编写程序时不受内存容量的限制,操作系统采用“扩充”技术使用户使用比实 际内存容量大的存储空间。 总之,存储管理的目的是尽可能地方便用户和提高内存的效率。存储管理主要完成如下 的四个功能。 (1)内存的分配和管理。程序执行时,向操作系统申请内存空间,由存储管理实施具 体的分配。存储管理使用分配记录表表示内存的使用情况和状态,根据程序申请内存的大小 按一定的策略分配给程序,并把使用情况记录在分配记录表中,从而完成内存的分配。如果 不能满足申请内存,则申请程序将等待,直到有足够的内存空间进行分配。 存储管理接受系统和程序释放的存储区,或主动回收不再使用的存储区,并修改分配记 录表,完成内存的回收。 (2)内存空间的共享。内存空间的共享是为了提高内存空间的利用效率,一方面使多 道程序能动态地共享内存,另一方面使多道程序能共同使用某些程序段和数据。 (3)存储保护。存储保护是保证多道程序都在自己所属的存储区内操作,互不干扰。 防止用户程序的错误破坏系统程序,也要防止多道程序之间的相互干扰和破坏。一般由硬件 提高保护功能,软件配合实现。 (4)存储扩充。存储扩充所指的扩充不是内存储器硬件上的扩充,而是利用存储管理 为用户提供一个比实际内存更大的存储空间。这样,用户编制程序时,不需考虑实际内存空 间的容量。就好像使用一个足够容量的内存储器一样,大大方便用户的使用。. 4.2 覆盖和交换技术 覆盖和交换技术都是实现“扩充”内存的存储管理技术,主要用来解决在较小的存储空 间中运行大作业时遇到的矛盾。既可用于一个作业内部,也可实施于多个作业之间,以达到 多道或分时运行的目的。它们通常和分区存储管理技术配合使用。 4.2.1 覆盖技术 当一个作业要求运行时,若它所需的存储空间得到满足,系统就一次把它装入内存,一 直在内存中驻留,直到运行结束。若它在内存中一次装不下,就需解决作业在内存中装不下 的问题,较早采用的一种方法是覆盖技术。 它是指一个作业的若干程序段,或几个作业的某些部分共享某一段存储空间。它不仅可 用于一个作业内部的覆盖处理,也可用于多道程序系统中各作业之间,下面以一个作业的内 部覆盖处理为例说明。 设一个作业由模块 A、B、C、D、E、F 组成,大小为 1900KB,其中 A 是主模块,其 余为子模块,A 调用 B 或 C,但不会同时调用,B、C 之间也不互相调用,B 只调用 F,C 调用 D 和 E,D、E 和 F 也不会同时被调用,也不互相调用,其模块调用结构如图 4-1 所 示。因此,模块 B 和 C 不用同时都在内存中,模块 D、E、F 也不必同时驻留在内存中。这 样,可建立如下的覆盖结构:把整个作业分成两部分,模块 A 为常驻内存部分,大小为 第4章. 存储管理. 141.

(3) 142. 操作系统原理及应用(Windows Server 2008). 200KB,其余为覆盖部分,大小为 900KB,覆盖部分又分成两个覆盖段,分别为 500KB 的 覆盖段 0 和 400KB 的覆盖段 1,覆盖段 0 由模块 B 和 C 组成,覆盖段 1 由模块 D、E、F 组 成,总共只需 1100KB 的内存。覆盖部分是以文件形式存储于辅助存储器上,在作业执行 时,当需要访问某个覆盖部分,才把它调入内存。 A 200KB. B 500KB. C 300KB. F 300KB. D 200KB 图 4-1. E 400KB. 模块调用结构. 当作业运行时,系统根据其覆盖结构,分配一段存储空间,其大小等于常驻部分和两 个覆盖区之和。覆盖区和覆盖段是一一对应的。覆盖区长度由相应覆盖段中最大模块的长 度确定。确定相应的存储空间后,把 A、B、F 首先装入内存中,当 A 运行到调用 C 时, 才将 C 装入到覆盖区 0,自动将 B 覆盖,同时也将 D 装入到覆盖区 1,自动将 F 覆盖。当 C 运行到调用 E 语句时,再把 E 装入到覆盖区 1,覆盖掉 D。其存储分配和覆盖结构如图 4-2 所示。 RAM. A 200KB 覆盖区 0 500KB. 覆盖区 1B 400KB. 图 4-2. C B. F. D. E. 存储分配和覆盖结构. 虽然可由操作系统完成自动覆盖,但要求作业各模块间有明确的调用结构,并要求用户 向系统指明其覆盖结构,即对用户不透明,增加了用户的负担。目前主要将这一技术用于小 型系统中的系统程序的内存管理上,主要因为系统程序的覆盖结构对系统软件设计者是已知 的。在 MS-DOS 系统中,也采用了覆盖技术。 4.2.2 交换技术 交换技术主要是用于解决内存不足的问题,广泛用于小型分时系统的存储管理中,在分.

(4) 时系统中,主机与多个终端用户相连,不可能将用户作业全部放入内存中,而是当调度程序 允许某一进程运行时,把该进程调入内存运行一个时间片。当时间片用完或进程等待时,从 内存中以文件的形式保存在辅助存储器中,让出 CPU 和内存空间,直到再次调用它时,才 重新进入内存运行,又需要把程序和数据调入内存。这种把一个作业装入内存之后仍能把它 交换出内存或再交换入内存的技术称为交换技术,也称滚入滚出。 交换技术可以保证合理的响应时间,并且可以利用辅存解决内存的不足,但却是以花费 处理机的时间为代价的。交换技术中的关键是如何减少交换的信息量,这样才能提高系统的 效率,对于分时系统来说,作业比较小,交换的信息量也少,系统的效率较高。对于大型作 业,如果每次交换出整个作业,则交换的信息量太大,系统的效率将大大降低。 与覆盖技术相比,交换技术的交换过程对用户是透明的,但交换技术需要较多的软件 支持。 交换技术的发展导致了虚拟存储技术的出现。. 4.3 虚拟存储技术 虚拟存储技术首先由英国曼彻斯特大学提出,1961 年用该校的 Atras 计算机实现了这 种技术。20 世纪 70 年代以来,该技术得到广泛使用,许多大型的计算机系统均采用了虚 拟存储管理技术,如 PDP-11/45、IBM370 系列等计算机就是使用虚拟存储管理技术。在微 型计算机系统中也广泛地使用虚拟存储管理技术,如采用分页技术的微型机有美国的 NS32032、日本的 V70,使用分段技术的有 Intel 80286,分段加分页的有 Intel 80386、Z8000 等。 4.3.1 虚拟存储器的基本概念 虚拟存储器是指以透明方式提供给用户一个比实际内存大得多的作业地址空间。它不是 一个实际的物理存储器,而是一个容量非常大的内存储器的逻辑模型。以处理机提供的逻辑 地址访问虚拟存储器,用户可在非常大的地址空间中安排程序和数据,就仿佛拥有这么大的 内存空间一样。 虚拟存储器提供比实际内存大得多的空间,作业运行时,就需要在虚拟地址和实际内存 地址之间建立对应关系,也就是虚拟地址要转换到实际内存地址上,处理机才能访问内存中 的指令和数据。这种转换是由动态地址映像机构来实现的。 当能够实现虚拟地址和实际地址转换后,还需确定用户作业所在的位置,以及内存和辅 存中的程序和数据如何进行交换等。下面来看一下实现虚拟存储器的主要问题。 4.3.2 虚拟存储器建立的主要问题 把作业的地址空间和实际内存空间明确地区分开,从而有了虚拟存储器的概念。但在具 体实现虚拟存储管理功能的时候,必须解决下面的三个主要问题。 1.虚拟空间放在系统何处 一般使用大容量的辅存(磁盘、磁鼓)来存放用户的虚拟空间的全部数据。所以作业的 虚拟地址空间不能无限增大,它受到两个条件的制约:一是指令中地址长度的限制,因为进 第4章. 存储管理. 143.

(5) 144. 操作系统原理及应用(Windows Server 2008). 程访问的虚拟地址应限制在指令中地址长度所表示的范围内,即不能超过逻辑地址字长所表 示的范围,而逻辑地址字长是由机器的硬件结构决定的;二是辅助存储器大小的限制,用户 的虚拟空间不能超过辅存的容量,随着处理机功能的强大,制约最大虚拟空间的往往是辅存 的容量。 2.何时和如何进行内存、辅存的对换 在分页、分段、段页式实现的虚拟存储管理中,内存和辅存对换时机、策略稍有不同, 但一般都是以软、硬件相结合的方式进行对换,而且对用户是透明的。如请求分页方式中, 实现内存、辅存的对换是以页为单位,在作业运行过程中执行一条不在内存中页的指令而引 发,并由缺页中断实现页的调入和调出。 3.虚拟地址和实际地址的转换 作业的逻辑地址,在虚拟存储系统中被称为虚拟地址,而处理机可直接访问的内存空间 地址被称为实际地址。作业的欲执行部分必须装入到实际地址空间中去,并建立虚拟地址和 实际地址的映射关系。这就是虚拟地址和实际地址的转换。 虚拟地址和实际地址都是由处理机提供的。只不过虚拟地址是形式地址,通常由处理机 的寻址方式和指令格式决定,由处理机内部的一些寄存器的某种组合来表达。因此,虚拟地 址的字长通常与处理机内部数据总线的宽度有关。处理机提供的虚拟地址仅用于用户编程。 实际地址则不然,它是处理机直接驱动的。因此,实际地址的字长通常由 CPU 芯片的地址 引脚个数或计算机系统的地址总线宽度决定。处理机提供的实际地址用于完成实际存储单元 的具体存取操作。如 Intel 80286 有 24 位地址线,其实际地址空间最大范围为 16MB。Intel 80286 采用分段存储管理技术,每个段的最大段长为 64KB,两个地址控制寄存器,两个 8K 的描述符表,其虚拟地址空间为 2*8K*64KB=1024MB。. 4.4 缓冲存储器 处理机能够直接存取的是内存,处理机的速度比内存的速度快很多,处理机从内存中存 取指令和数据时,就需要等待把内存中的数据存取出来。为了提高内存的存取数据速度,使 它与处理机的速度相匹配,许多计算机系统都采用了缓冲存储器解决内存的速度与处理机的 速度不匹配的矛盾。 缓冲存储器在处理机和内存之间形成这种三级存储结构,由于缓冲存储器的速度比较 快,又称为高速缓冲存储器。其不参与存储器编址,对用户是透明的。 目前有许多计算机采用缓冲存储器,如 MC68020、Z8000、Intel 80386、Intel 80486、 Intel 80586 等,缓冲存储器的大小从 2KB 到 256KB 不等。缓存技术不属于内存扩充技术。 4.4.1 缓冲存储器的结构 缓存读双字指令的速度为 120ns,内存的速度为 1100ns,处理机的速度为 150~300ns。 缓存的速度比内存高一个数量级,同处理机的速度相匹配。这样,缓存在处理机和内存之间 起到了缓冲的目的。 处理机、缓存和内存形成了三级存储结构,其关系如图 4-3 所示。.

(6) 处理机. 缓冲存储器 图 4-3. 内存. 处理机、缓存和内存的关系. 缓冲存储器由缓冲存储器、缓存目录和缓存控制器三部分构成。通常缓冲存储器和内存 都分为若干块,我们以 4KB 的缓存为例,假设每块的大小为 64 字节,把缓存分为 2 个区, 每区 2KB,每区有 32 个块,同一区中的各块用列号来表示,如图 4-4 所示。 区号. 列号 0. 1. ……. 2. 30. 31. 0 1 图 4-4 4KB 缓存的区块形式. 4KB 缓存的缓存目录有 32 个表目,对应缓存的 0~31 的列号,缓存目录的表目分为两 个区,对应于缓存的两个区 0~1。这样缓存中的每一块都对应一个固定的表目。每个表目 包括内存地址行号和状态位,另外,两区的每个表目对应一个标志位。表目的内存地址行号 表示缓存块的内容所对应的内存地址所在的行。状态位有三种:有效位、修改位、故障 位。当有效位为 1 时,表示该表目对应的缓存块中的数据已经是无效的;为 0 时,则对应 是有效的。 当修改位为 1 时,表示该表目对应的缓存块中的数据已经被修改过;为 0 时,则没有修 改过。 当故障位为 1 时,表示该表目对应的缓存块有故障,否则无故障。标志位表示最近访问 了两区中的哪一区,以作为选择淘汰块使用。缓存目录的结构形式如图 4-5 所示。 区号. 列号 0. 0. 内存地址行号. 1. 2. ……. 30. 31. 状态位 1. 内存地址行号 状态位 标志位 图 4-5 4KB 缓存目录的结构形式. 同样,内存和缓存一样也分成 64 字节的块,每行有 32 列,大小为 2KB,行号的大小由 内存的大小来确定。其形式如图 4-6 所示。 行号. 列号 0. 1. 2. ……. 30. 31. 0. 1. 图 4-6. 内存的划分形式 第4章. 存储管理. 145.

(7) 146. 操作系统原理及应用(Windows Server 2008). 这样,在编写内存地址的时候,就可以用行号、列号、每块的字节数的格式来表示。例 如,80386 的编址形式为行号(17 位) ,列号(10 位),字节数(5 位)。 4.4.2 缓冲存储器的工作原理 由于处理机在进行读取和写入时,缓冲存储器的工作过程不同,分别描述如下。 (1)读取指令或数据。当处理机要读取指令或数据时,缓存控制器就自动查找缓存目 录,以确定包含指令或数据的内存块是否在缓存中。它是根据指令或数据地址的列号部分查 找缓冲目录表目的列号,然后把对应列号表目中分属区 0 和区 1 的内存地址行号与指令或数 据地址的行号部分进行比较。如果匹配,并且状态位中的有效位为“0”,则把匹配表目所对 应的缓存块中的内容直接送给处理机,且把标志位表示成对应块最近已被访问过。若两个区 的对应表目中的内存地址行号都不与之匹配,则说明该块不在缓存。需要从内存中把该块内 容送给处理机,同时该块内容也被送到缓存中的相应列的某块内。 (2)写入数据。当处理机要求写入数据到某内存单元时,也是首先由缓存控制器查找缓 存目录,如包含此单元地址的内存块已经在缓存中,则处理机把在缓存中的该块内容加以写 入,并把缓存目录中相应表目中的修改位置为“1” 。这里是不是直接写入内存,有两种方法: 惰性方法和立即存方法。惰性方法是指数据写入缓存时,不立即修改相应内存块中的内容,而 是直到该缓存块中的内容被淘汰出缓存时,才把该缓存块写入内存相应块中。立即存方法是指 对缓存和内存的相应块同时写入。若该块不在缓存中,则先把该块从内存读入缓存,然后再写 入缓存中。 (3)通道读取指令或数据。当通道(I/O 处理机)从内存读取指令或数据时,则查找缓 存目录,假若包含该指令或数据地址的块在缓存中,则从缓存中把该块送往通道。若不在缓 存中,则从内存读出,但不把该块放入缓存中。 (4)通道写入数据。当通道向内存某单元写入数据时,该数据只写入内存中。但缓存 控制部件同时查找缓存目录。如果不在缓存中,则不进行任何操作。若该内存单元所在的块 在缓存中,则相应表目的状态位中的有效位被置成“1”,使该数据块无效。 缓冲存储器的设置,使 CPU 所需的指令与数据绝大多数来自缓存,而不通过总线去访 问内存,避免了处理机的等待,大大提高了系统的吞吐率,是发挥处理机能力的有效方法。. 4.5 存储管理机制 存储管理的功能有四个:内存的分配与管理,内存空间的共享,存储保护和存储扩充。 各种计算机系统的结构、性能和实现目的不同,它们采用的操作系统一般也不同,各种操作 系统之间最明显的区别之一,一般在于它们所采用的存储管理方案不同。操作系统发展到现 在,出现了成百上千种,存储管理方案也出现了很多,大致把存储管理方案概括成四种:分 区管理、分页管理、分段管理和段页式管理。下面介绍各个方案的基本思想和实现技术。 4.5.1 分区存储管理 分区管理是能满足多道程序的最简单的存储管理方案。它是将内存划分为若干个连续的 区域,称为分区。每个分区存储一个程序,而且程序只能在它所在的分区中运行。.

(8) 如果是单道批处理系统,对内存的用户程序区域不再划分,采用单一连续区存储管理方 案,是将内存的一部分固定分配给操作系统,其余部分分配给一个作业使用。一些单用户单 任务的微型计算机系统采用单一连续区存储管理方案。 在多道批处理系统中,为允许多个作业共享内存和处理机,可以采用分区存储管理方 案。把内存划分成若干个分区,每个分区分配一道作业。 分区存储管理的划分方式有很多,可以归纳为两大类:固定式分区和可变式分区。 1.固定式分区 固定式分区是指在处理作业之前,存储器被划分成若干个分区。关于分区的说明,可由 系统操作员或由操作系统实现。除操作系统本身占用一个分区外,其余的每一个分区可分配 一道作业。当划分好后,在系统运行期间不再重新分区。因此,又称为静态式分区。 根据欲处理作业的不同规模,一般将内存的区域划分成大小不同的区域。系统建立 一个分区说明表,说明分区的大小、起始地址和是否已分配的标志。分区说明表如图 4-7 所示。 区号. 大小. 起始地址. 标志. 1. 16K. 20K. 已使用. 2. 32K. 36K. 已使用. 3. 64K. 68K. 未分配. 图 4-7. 分区说明表. 由于每一个分区的大小是固定的,故每个注册的作业必须说明所要求的最大容量。在调 度作业时,由存储管理程序根据作业所需内存空间,在分区说明表中找出一个足够大的空闲 分区分配给它,然后用重定位装入程序将此作业装入。若找不到,则通知作业调度模块,另 外选择一个作业。图 4-8 表示某一时刻,作业 A,B 分别被分配到 1,2 两个分区,第三分区 尚未分配,操作系统永久占据内存低地址区 20KB 的内存分配情况。一个作业结束时,系统 又调用存储管理程序查找分区说明表,把所占分区的使用标志修改为未分配状态。 0K 操作系统 20K. 作业 A. 第 1 分区. 36K 作业 B. 第 2 分区. 68K 第 3 分区 132K 图 4-8. 内存分配图 第4章. 存储管理. 147.

(9) 148. 操作系统原理及应用(Windows Server 2008). 采用这种技术,虽使多个作业共驻内存,但一个作业的大小不可能正好等于某个分区的 大小,于是在分配的分区中总有一部分被浪费。有时这种浪费还相当严重。尤其是,在如图 4-8 所示的内存使用情况下,第 2 分区的未分配部分和第 3 分区已是物理上的一个连续区 域,可是若有一个大小为 65KB 的作业申请内存则将被系统拒绝。因为分区的大小是预先划 分的,分区说明表中指出,只有第 3 分区是未分配的,它的大小是 64KB,小于 65KB,所 以系统不能分配。 固定式分区实现技术简单,但内存利用率不高,适用于作业的大小及多少事先比较清楚 的系统中。 2.可变式分区 可变式分区指存储空间的划分是在装入作业时进行的,且分区大小正好适应作业的需 要。分区的个数和大小不是事先划分,而是根据作业大小进行调整,因此又称动态式分区。 这种存储管理技术是固定式分区的改进,可获得较大灵活性而提高内存利用率。 系统初启时,内存中除常驻的操作系统外,其余的是一个完整的大空闲区。随后,对 调入的若干作业接连划分几个大小不等的分区分配给它们。但是,系统运行一段时间后, 随着作业的撤除且相应分区的释放,原来一整块的存储区会形成空闲分区和已分配分区相 间的局面。 可变分区在分配时,首先找到一个足以容纳该作业的空白分区,如果这个空闲区比所要 求的大,则将它分成两部分:一部分成为已分配的分区,剩下一部分仍为空闲区。如果没有 足够大的区域,将拒绝进行分配。 在回收撤除作业所占分区时,要检查回收的分区是否与空闲区邻接,若是则加以合并, 使之成为一个连续的大空闲区。 实现可变式分区的方法很多,一般需要登记内存占用的情况,另外能实现内存分配和回 收。记录内存分配情况的数据结构主要有两种,一种是表格形式,另一种是空闲区链形式。 分配算法一般有两种:一种是最佳适应法,它从全部空闲区中找出能满足作业需求的容量最 小的空闲区分配;此方法能使碎片(不连续的小空闲区)尽量小。另一种是最先适应法,它 按序查找,把最先找到的满足需求的空闲区分配,以减少查找时间。 记录内存分配情况的表,一般是两张表,一张表说明已分配的分区,称为 P 表;另一张 表说明空闲的分区,称为 F 表。两表的登记状况对应某一时刻内存分配情况。表项的数目要 足够,一些暂时未使用的表项称为空表目。说明两个表的情况如图 4-9 所示。 对于空闲分区说明表来说,它的表项排序方法与所采用的算法相适应。采用最佳适应法 时,空闲分区按由小到大排序。采用最先适应法时,空闲分区按起址由低到高排序。对于已 分配分区说明表,则不需要排序。 采用空闲区链数据结构的可变式分区存储管理,其实现方法是把每个空闲区的起始若干 个字节分为两部分:一部分是链指针,指向下一空闲区的起始地址;另一部分表明本空闲区 的大小。系统用一固定单元作为链的头指针,指向第一个空闲区的起始地址。最后一个空闲 区的链指针中放着链尾标志。这样使用链指针把所有空闲分区链接在一起,构成了一条空闲 区链。还有一种实现方法是采用双向链数据结构,它分成三部分:向后链接指针、向前链接 指针和本空闲区的大小。它形成一个循环链,分配和回收时,查找起来比较方便。.

(10) 序号 P. 大小. 起址. 状态. 1. 8K. 20K. 已分配. 2. 32K. 28K. 已分配. 3. —. —. 空表目. 4. 120K. 92K. 已分配. 5. —. —. 空表目. …. …. …. …. 序号 F. 大小. 起址. 状态. 1. 32K. 60K. 空闲. 2. 300K. 212K. 空闲. 3. —. —. 空表目. 4. —. —. 空表目. 5. —. —. 空表目. …. …. …. …. 图 4-9. 可变式分区说明表. 可变式分区管理有零头问题。零头是不连续的小块空闲区。可能所有零头的总和大于作 业的容量要求,但由于不连续无法进行分配。解决零头的方法是移动已分配的作业,使零散 的小空闲区连成一个大的连续空闲区,进行分配。这种方法需要对作业重新定位,系统代价 太高。 3.分区的保护措施 为了防止一个作业有意或无意破坏操作系统或其他作业,分区管理的存储保护采用两种 方法。一种是界地址法,另一种是保护键法。 界地址法是指操作系统设置一对上、下界寄存器,来限制当前运行作业的工作地址范 围。当选中某个作业运行时,先将它的上、下界地址装入寄存器中,每一次访问存储器的地 址时都要同这两个寄存器进行比较,若超出这个范围,便产生越界保护性中断。 保护键法是指操作系统给每个存储块都分配一个单独的保护键,它相当于一把锁。在 程序状态字中设置有保护键字段,对不同的作业赋予不同的代码,相当于一把钥匙。当程 序进行读、写访问时,程序状态字中的保护键字段内容必须与被访问存储块的保护键相一 致,才可进行读写访问,否则不能进行读写。当作业运行时产生非法访问,系统将产生保 护性中断。 4.分区存储管理的优缺点。 分区管理的主要优点是:实现了内存的共享;在进行分区分配时,系统占用存储量较 少,算法也比较简单;分区保护的方法比较简单,实现比较容易。 分区管理的主要缺点是:内存不能充分利用,存在严重的零头问题;不能实现对内存的 “扩充”;要求一个作业执行之前必须全部装入内存;较难实现几个作业间共享某一程序段 或数据段。 第4章. 存储管理. 149.

(11) 150. 操作系统原理及应用(Windows Server 2008). 4.5.2 分页存储管理 在分区存储管理中,一个作业总要求占用一个连续的内存区,因而产生了零头问题。即 使所有零头的总和超过一个作业要求的总量,但因为零头之间不连续,也无法分配给作业。 如果可以允许一个作业存放在不连续的内存中而又能保证作业连续地得以运行,就可解决零 头问题。这就是分页存储管理的由来,分页存储管理有两种:简单页式存储管理和请求页式 存储管理。 1.简单页式存储管理 简单页式管理是指系统把内存的存储空间等分成大小相同的存储块,称为块。同样,作 业的地址空间也分成大小与块相同的部分,称为页。当一个有 m 个页的作业运行时,为该 作业分配 m 个块,这些块可以是不连续的。 (1)简单页式管理的基本概念。 块:把内存划分成相同大小的存储块,称为块。对于一个特定的计算机系统来说,块的 大小通常是固定不变的,并给各个块从零开始依次编号。块的大小一般是 1K~4K。 页:把一个作业的逻辑地址空间划分成若干个与块大小相同的部分,每部分称为页。并 给各个页从零开始依次编号。这样,在分页系统中,每一个逻辑地址用一个数对(p,d)来表 示,其中 p 是页面号,d 是在页面号中的相对地址,称为页内地址。 页表:为了解决作业的逻辑地址转换为实际物理地址的问题,在内存中为每个作业建立 一个页面映像表,称为页表。页表包括两部分:页号和块号。页号是从 0 开始连续编号,表 示作业各页的序号。块号指出该页在内存中的位置。 当作业调度程序调入作业时,为该作业建立进程,系统为进程建立页表。在撤消进程时 清除其页表。除此之外,系统还设置一个页表地址寄存器指出当前运行的进程的页表起始地 址和页表的长度。 进程的逻辑地址是用一个数对(p,d)来表示,那么这个数对在机器指令的地址场中又如何 表示?通常将该地址分为两部分:一部分表示该地址所在页面的页号 p,另一部分表示页内 地址 d。页号和页内地址所占位数,取决于页的大小。如 IBM370 的指令地址域长度为 24 位,页的大小为 2KB,则页内地址部分占 11 位。 机器指令的地址域中的地址由硬件机构自动转换成对应的页号和页内地址。 (2)直接映像的页地址转换。 当进程被调度到处理机上运行时,操作系统自动将该进程的页表起始地址装入页表地址 寄存器中,当进程要访问某个逻辑地址时,则分页的地址映像硬件自动按页面大小将地址域 从某位截成两部分:页号和页内地址(p,d)。这时以页号 p 在页表中查找,具体过程为:加法 器将页表地址寄存器内容与页号相加,得到该页在页表中的表目地址,该表目中包含有该页 对应的块号 q,然后地址映像硬件又自动将块号 q 与页内地址拼成了实际内存的绝对地址, 实现了地址映像。如图 4-10 所示。 直接映像的分页系统对系统的性能有很大的影响,处理机执行指令的速度降低为原来的 二分之一。主要因为 CPU 至少访问两次内存才能得到所要的数据。第一次查页表以找出对 应的块号,第二次访问所需数据。为了提高查表的速度,可以采用更快的地址转换方法,即 相关映像页地址转换法。.

(12) 页表地址寄存器 L. b b 页号. p +. 页内地址. p. b+p b. 逻辑地址. d. 页表. q. 图 4-10. q. d. 实际地址. 直接映像的地址转换. (3)相关映像页地址转换。 为了提高页地址转换速度,在地址变换机构中加入一定数量的高速半导体相关存储器。 半导体存储器的存取速度比一般存储器高一个数量级,而且具有并行查询能力。其中存 放着正在运行进程中的最常用的部分页面的页号和它的相应块号。构成一张“快表”。其地 址转换过程为:当运行进程要访问逻辑地址时,硬件机构将地址截成页号 p 和页内地址 d。 地址转换机构首先以页号 p 和相关存储器中各表目同时进行比较,以确定该页是否在相关存 储器中。若在其中,则相关存储器即送出相应的块号,并与页内地址一起拼成绝对地址,然 后访问内存。若该页不在相关存储器中,则使用直接映像方法查找进程的页表,找出其块号 q 与页内地址拼成绝对地址,然后访问内存。同时将该页的页号及对应的块号一起送入相关 存储器的空闲表目中。如无表目,一般将最先装入的表目淘汰,腾出表目位置。在地址转换 过程中,相关映像和直接映像是同时进行的,当相关映像成功时,就自动停止直接映像工 作。相关映像的地址转换过程如图 4-11 所示。 由于程序运行中有局部性的特点,即刚被访问过的单元在很短的时间内还将被访问(时 间局部性)和刚被访问的单元的邻近的单元也将被访问(空间局部性)。所以使用一定数量 的高速寄存器作相关存储器,从相关存储器中找到所需页号的概率将达到 90%左右。如果继 续增加高速寄存器的数量,其概率还将提高。从这里看出,使用相关映像的地址转换方法将 大大提高系统的性能。 (4)简单页式管理的分配方法。 为了实现分页存储管理,操作系统需建立和管理一些基本的数据库:页表、进程表和存 储分配表。. 第4章. 存储管理. 151.

(13) 152. 操作系统原理及应用(Windows Server 2008). 页表地址寄存器 L. b. 页号. 页内地址. p. b p. 逻辑地址. d. 快表. + b+p b. 页表. p. q. q. q. d. 实际地址. 图 4-11 相关映像的地址转换. 进程表是整个系统的进程控制表的集合,记录每个进程的运行情况。其中与存储管理有 关的信息是页表起始地址和页表长度。当某作业被调度进入内存时,操作系统将其信息登入 该进程的进程控制表,当进程运行时,操作系统的调度程序从此表中将页表起始地址和页表 长度装入页表地址寄存器中。 存储分块表是整个系统的一个,用来记录内存每个存储块的状态,指出该块的状态是已 分配还是空闲。 简单页式存储管理的分配和回收方法是:作业的逻辑空间和内存的地址空间分成页和块 后,作业运行时,判断内存的块数是否满足作业的需要,而且是整个作业的需要,如果空闲 块数不够,则拒绝装入,否则就分配内存给作业,以满足其运行需要。回收时,将该作业所 占的存储块在存储分块表中记为空闲状态,同时把进程表中的该作业的表目改为空表目。简 单页式管理的分配算法流程如图 4-12 所示。 简单页式存储管理虽然消除了分区间的零头问题,但一个作业的地址空间不一定是页的 整数倍,最后一个块一般是不满的。这种最后一块内的空闲部分称为内零头。内零头的平均 大小为半页左右。为减少内零头所造成的浪费,可把页的长度变小,但又增大了页表的长 度,降低查找的速度。 简单页式管理与分区存储管理一样,作业的地址空间不能超过内存的实际地址空间。 为了解决这个问题,引入了虚拟存储技术,发展出一种新的页式存储管理:请求页式存储 管理。 2.请求页式存储管理 请求页式存储管理的基本思想是:当运行一个作业时,并不要求把该作业的全部程序和 数据都装入内存,可以只把目前要执行的几页调入内存的空闲块中,其余仍保存在辅存中, 以后根据作业运行的需要再调入内存。.

(14) 请求装入一个作业. 计算所需块数 N. 有 N 个空闲块?. 没有 本次无法分配. 有 在进程表中找空表目 状态=已分配 页表长度=N 页表起址=由进程号计算. 分配 N 个空闲块,将块号添 入页表相应项. 返回 图 4-12. 简单页式管理的分配流程. 请求页式管理在作业执行时只装入部分页在内存中,那么在实际处理的时候,就会出现 新的问题:作业的页表应登记哪些页已在内存中,哪些在辅存中,这需要扩充页表的项目; 当需要从辅存中调入页时,进行缺页中断处理。另外,当欲调入页而内存中无空闲块时,如 何进行处理,涉及淘汰算法方面的问题。 (1)页表项目的扩充。 在简单页式管理中,页表只包括页号和块号,在请求页式管理中,只有这两项是不够 的,还需要表示出该页的状态,是否在内存中,是否被修改过,是否被访问过,如果不在内 存中在辅存的地址是多少等信息。具体来说,除了页号和块号项外,请求页式管理中的页表 包括如下几项: 状态项:一般有三种状态。“断开”状态,表示该页不在内存;“连接”状态,表示该页 已分配块号,但正在进行数据的输入输出操作,此时,CPU 对该页不能进行访问,但通道可 以对它访问; “可寻址”状态,表示该页已分配块号,CPU 可以访问它。 修改位:该位为 0 时,表示该页中的数据未被修改过。该位为 1 时,表示该页中的数据 被修改过。 访问位:表示该页在最近期间是否被 CPU 访问过。该位为 0 时,表示该页未被访问 过。为 1 时,表示该页最近被访问过。用于页面淘汰策略中。 辅存地址:指出该页在辅存中的地址,以便用来调入。 (2)请求页式管理的地址变换和缺页中断处理。 进程访问的是逻辑地址,进程通过处理机执行程序,处理机只能访问在内存中的物理地 址,那么在请求页式管理中逻辑地址到物理地址的转换是由软硬件共同来完成的。由三部分 第4章. 存储管理. 153.

(15) 154. 操作系统原理及应用(Windows Server 2008). 共同完成地址转换:分页地址变换硬件部分;中断处理硬件部分;缺页中断处理程序。其中 缺页中断处理是软件。 其中分页地址变换硬件是主要的部分,它独立完成正常的地址变换工作。其余两部分只 有在发生缺页情况下才协助分页地址变换硬件进行工作。 在程序执行时,请求页式管理的地址变换过程是这样的: 1)将逻辑地址由硬件自动截成页号 p 和页内地址 d。 2)硬件自动查找页表中该页状态位,看该页是否在内存中,如果在内存中,则继续进 行第 3 步;如果不在内存中,则执行第 5 步。 3)硬件将页表中的该页所对应的块号与页内地址拼成物理地址。 4)硬件完成地址转换,准备转换下一个逻辑地址。返回第 1 步。 5)硬件使“缺页中断触发器”被触发,并由中断处理硬件继续工作。 6)当触发的缺页中断被接受后,中断处理硬件自动进行处理机状态的切换。即把处理 机的状态保存起来,并把对 CPU 的控制权转给缺页中断处理程序。 7)缺页中断处理程序保存断点现场。 8)在存储分块表中判断是否有足够的空闲块,如果有,从辅存中调入所需的页面;如 果没有,根据“淘汰”策略选择淘汰页面,调整页表,使其有空闲块进行分配,如果淘汰页 面被修改过,则应写回辅存中相应分页。 9)根据分配情况,调整页表。 10)恢复现场,返回断点执行,即返回第 2 步执行。 3.淘汰策略 在缺页中断处理时,欲调入的某页,但内存无空闲块,就需要把在内存中的某一页调出 内存。应该调出哪一页?这就是淘汰问题。 如果淘汰的策略不合理,有可能刚被调出的页立即又要求被调入。内存和辅存之间这种 频繁地来回调入调出页面的现象称为抖动。这是在确定淘汰策略时应避免的情况。 常见的淘汰策略主要有以下三种: (1)先进先出法:指先调入内存的页面先淘汰,即总选择驻留内存时间最长的页面进 行淘汰。因为最早调入的页面其不再使用的可能性比最近调入的要大。 (2)最近很久未用法:指最近很长时间未被访问过的页面被淘汰。因为如果某页刚被访问 过,可能最近还被访问;相反,若某页最近很长时间未被访问,则最近被访问的可能性极小。 (3)最不经常使用法:指选择最不经常使用的页面淘汰。它实现起来比较简单,只需 为每页设一个计数器。 4.页的共享 在多道程序系统中,特别在分时系统中,数据共享是很重要的。在分页系统中,各个共 享进程应能访问共享数据的页。共享的方法是使这些共享进程的逻辑空间中的页指向具有共享 数据的相同的块号。这样,同一个块号就对应多个进程中的多个页号,从而,实现页的共享。 页面共享中必须处理好共享页中的信息保护问题。当一个进程正从共享页中读取数据 时,要防止另一进程修改该页中的数据。在大多数执行共享的系统中,将程序分为过程区和 数据区。不可被修改的过程称为纯过程,它是可以共享的。私用的可修改的数据和过程是不 可被共享的。.

(16) 4.5.3 分段存储管理 前面介绍的各种存储管理技术中,为作业的逻辑地址空间是一个一维的线性地址空间。 而一个作业常常由大量的标准和非标准的程序模块和数据段组成。如果作业运行前,将其所 需的各程序段和数据段连成一维的线性地址空间,这浪费机时,特别是在程序和数据共享 时,不便于实现。因此编程人员希望把信息按其内容或函数关系分成段,每段有自己的名 字,可以根据段名访问相应的数据和程序段。内存也按段进行分配。这样,就有了分段存储 管理技术。 1.分段存储管理的基本概念 (1)进程的逻辑地址空间:一个段可定义为一组逻辑信息,如子程序、数组或工作 区。这样,每个进程的地址空间按照程序的自然逻辑关系划分成若干个段,每段都有自己的 名字,且都是一段连续的地址空间。所以整个作业的逻辑地址空间是二维的。每个逻辑地址 由两部分组成:段名和段内地址。如分段 A,其逻辑地址范围 0~3K。一个作业的分段情况 如图 4-13 所示。分段经过编译或汇编后,通常为每一段分配一个编号,称为段号,每个段 的地址空间编成连续的地址空间,于是经过编译后的逻辑地址由两部分组成:表示段名的唯 一段号和段内相对地址。 0K. 0K. 0K. 0K. 3K 5K 20K. 分段 MAIN (主程序). 分段 P (子程序). 图 4-13. 分段 A (数组). 6K. 分段 B (工作区). 分段的地址空间. (2)程序的地址结构:每个逻辑地址用段号 s 和段内相对地址 w 来说明,可以表示成 (s,w),指令的地址域也用段号 s 和段内相对地址 w 来表示逻辑地址。一旦段号和段内相对地 址的长度确定了,一个作业的地址空间允许的最多段数及段内长度也就确定了。假设某机器 指令的地址部分为 24 位,规定其中 8 位表示段号,其中 16 位表示段内相对地址,这个地址 结构可允许的最多的段数为 256 个段,最大的段长为 64KB。 (3)段表:当系统执行某个进程时,为其建立一个段映像表,简称段表。段表中包 括以下内容:段号、段长(段的长度)、段在内存中的起始地址等。段表按段号从小到大 的顺序排列,当作业调度程序调入该作业时为其进程建立段表,在撤消进程时,清除此进 程的段表。 系统还使用一个段表地址寄存器表示段表在内存中的起始地址和段表的长度。它是在进 程运行之前,操作系统从进程控制表中将这两项装入到段表寄存器中,从而保证地址的动态 转换。 2.分段管理中的地址转换 分段存储管理是指管理由若干个分段组成的作业,并且按分段进行存储分配。实现分段 第4章. 存储管理. 155.

(17) 156. 操作系统原理及应用(Windows Server 2008). 管理的关键在于,如何把分段的二维地址空间中的一个作业,在线性的存储空间中正确运 行。也就是如何把分段地址结构转换成一个线性的地址结构。和分页管理一样,采用动态重 定位技术,通过与分页管理类似的地址变换机构来实现。当进程运行时,由系统将该进程的 段表地址和段表长度装入段表地址寄存器中,当进程访问某逻辑地址(s,w)时,系统按如下步 骤进行地址转换(如图 4-14 所示): 段表地址寄存器 L. b b 段号. s +. 段内地址. s. b+s b. 逻辑地址. w. 段表. e. e. w. 实际地址 图 4-14. 分段地址转换. (1)根据段表地址寄存器的内容找到段表地址。 (2)利用逻辑地址中的段号 s 在段表中找到该表目的入口地址,得到该段在内存中的 起始地址 e。 (3)将段内相对地址 w 与该段的起始地址 e 相加,即得到访问单元在内存的物理地 址,并进行访问。 以上三步是由硬件自动完成的。与分页中类似,CPU 执行指令的速度降低为原来的二分 之一。为了提高地址转换速度可以采用高速相关存储器技术。 由于分页和分段管理的地址转换机构十分相似,所以常常把它们搞混。其实,它们在概 念上是完全不同的,分页的作业地址空间是一个单一的线性地址空间,而分段的作业地址空间 是二维的。页和块对应,是信息的物理单位,大小固定,分页活动是看不见的,仅仅用于对内 存的管理。段是信息的逻辑单位,它是有意义的一组信息,其长度不定。分段对用户是可见 的,可以在用户编程时确定,也可以在编译程序对源程序编译时根据信息的性质来划分。 3.分段的虚拟存储管理 分段存储管理,也可按类似请求页式管理来处理,为用户提高一个比内存空间大得多的 地址空间,即为作业提供一个虚拟存储器。同样,虚拟存储器的容量由计算机的地址结构确 定。在一个系统中可以建立多个虚拟存储器,每个作业存于一个虚拟存储器中。虚拟存储器 和内存物理地址之间的映射由各自的段表实现。.

(18) 段式虚拟存储管理在作业执行时只装入部分段在内存中,在执行过程中访问到不在内存 的段时再把它们装入。在段表中必须说明哪些段已在内存中,存放在什么位置,段长是多 少,哪些在辅存中,位置在哪里,还需要设置该段是否被修改过,是否能移动,是否可被扩 充等,这需要扩充段表的项目;当需要从辅存中调入段时,进行缺段中断处理。 (1)段表项目的扩充。 在前面介绍的段表中,只包括段号、段长和段在内存的起始地址,在段式虚拟存储管理 中,只有这两项是不够的,需要把段表扩充为如下几项: 段号、段长和段在内存中的起始地址。 状态项:该位为 0 时,表示该段不在内存;该位为 1 时,表示该段在内存。 修改位:该位为 0 时,表示该段中的数据未被修改过。该位为 1 时,表示该段中的数据 被修改过。 访问位:表示该段在最近期间是否被 CPU 访问过。该位为 0 时,表示该段未被访问 过;该位为 1 时,表示该段最近被访问过,用于段的淘汰策略中。 存取位:表示该段是否可以进行读写,或者是否可以执行。 扩充位:表示该段是否可以进行扩充。 辅存地址:指出该段在辅存中的地址,以便用来调入。 (2)段式虚拟管理的地址转换。 在作业执行中访问某段时,由硬件的地址转换机构查段表,若该段不在内存,则硬件发 出一个缺段中断,操作系统找出一个足够大的连续区域以容纳该分段。如果找不到一个足够 大的连续区域,则检查空闲区的总和,如果空闲区总和能满足该分段要求,那么进行适当移 动后,将该分段装入内存。若空闲区总和不能满足要求,则调出一个或几个分段到辅存中, 再将该分段调入内存中。如果该段在内存中,则判断欲访问的地址是否超出段长,如果超 出,则硬件产生一个越界中断,操作系统处理这个中断时,先判断该段的“扩充位”标志是 否可以扩充,若可以扩充,则增加段的长度。如果该段不允许扩充,那么这个越界中断就表 示程序出错。最后,还需要判断该段的“存取位”与访问的方式是否符合,如果不符合,则 产生保护中断。若符合,则改变该段的“访问位”和“修改位”。然后,把该段在内存的起 始地址和段内相对地址相加,得出应该访问的内存地址。段式虚拟存储管理的地址变换过程 如图 4-15 所示。 4.分段的动态连接 一个作业是由许多程序模块和数据段组成的,无论是分区存储管理还是分页存储管理技 术,为了程序正确地运行,必须由连接装配程序把一个作业所调用的各个子程序和数据段连 接成一个可运行的目标模块,即将其连接装配成一个一维的线性连续地址空间。在连接装配 过程中,既要把所需的子程序从各个程序库中找出来,并且要重定位,把它们组成一个统一 编址的相对地址空间。这个过程称为运行程序的“静态连接过程”。 这种连接装配过程既复杂又费时间,有时连接过程所花费的机时比该作业的执行时间还 长。有时连接装配好的模块在程序运行过程中根本用不到,造成机时和内存空间的浪费。因 此,最好能采用当运行到某段时,再连接该段的方法,这种方法称为“动态连接”方法。它 是指在程序运行开始时,只将主程序段装配好并调入内存。其他各段的装配是在主程序段运 行中逐步进行的。每当需要调用一个新段时,再将这个新段装配好,并与主程序段连接。在 第4章. 存储管理. 157.

(19) 158. 操作系统原理及应用(Windows Server 2008). 分段存储管理中,由于逻辑地址空间是二维的,每段有自己的段名,因而实现动态连接比较 容易。而在分页存储管理中动态连接是难以实现的。 访问 s 段 w 单元. 否. 段 s 在内存?. 缺段中断. 是 否 w≤段长?. 越界中断. 是 否 符合存储方式?. 保护中断. 是 置访问位=1,如写访问,置 修改位=1. 计算访问内存地址=内存起 址+段内相对地址 w. 返回 图 4-15. 段式虚拟存储管理的地址变换过程. 实现动态连接需要两个附加的硬件设施:间接编址和连接中断位。间接编址指指令中的 地址部分不是存取数据的直接地址,而是间接地址,即存放这个直接地址的那个单元地址。 那个包含直接地址的字称为间接字。连接中断位设在间接字中。直接编址和间接编址类似于 机器指令的直接地址和间接地址,例如,直接地址 LOAD 1000 表示装入地址 1000 中的内容 500;间接编址 LOAD * 1000 表示以 1000 中的内容 500 为地址,装入地址 500 中的内容 30,如图 4-16 所示。 直接编址 LOAD. 1000. 数据 1000. 间接编址 LOAD. 1000. 500. 间接字 1000 图 4-16. 500. 直接编址和间接编址. 数据 500. 30.

(20) 在实现动态连接时,把间接字的第 0 位作为连接中断位,以 L 来表示。当 L=1 时,表 示需要进行连接,发出连接中断信号,转操作系统处理,进行连接工作。当 L=0 时,表示不 需要连接。间接字的格式为: 直接地址. L. 通过一个示例说明间接编址指令的执行过程。当一个分段(如 3 段)对另一分段(如 4 段)产生符号形式的调用(如 LOAD 1,[X]|[Y]),那么编译程序或汇编程序就产生一个间接 编址的指令来代替,且将间接字中的连接中断位设为 1,直接地址指向代表符号调用的字符 串(7"[X]|[Y]")的所在位置。 分段 3 执行到 LOAD * 1,3|100 指令时将产生连接中断,操作系统对连接中断的处理过 程如下(如图 4-17 所示) : 段表. 分段 3 …. 内存地址. 0 …. 60. LOAD 1,[X]|[Y]. LOAD *1,3|100 …. 1 2. …. 100. 3. 3. 108. …. (a)汇编前. 1. 4. 7"[X]|[Y]". 108 …. …. …. …. (b)汇编后,连接前 段表. 分段 3 …. 内存地址. 0. 60. 1. LOAD *1,3|100 …. 2 100. 3. 0. 4. 120. …. 4. 7"[X]|[Y]". 108 …. …. …. …. 分段 4 … 120. [Y]:12100 …. (c)连接后 图 4-17. 分段的动态连接 第4章. 存储管理. 159.

(21) 160. 操作系统原理及应用(Windows Server 2008). (1)从 3 段 100 单元取出间接字。 (2)取出间接字中的直接地址 3 段 108 单元。 (3)按直接地址取出要连接段的符号名[X]|[Y],按定义给它分配段号(设[X]=4, [Y]=120)。 (4)查[4]段是否在内存,若不在则从辅存中把它调入内存,并登记段表。 (5)修改间接字,置连接中断位为 0,且使直接地址为连接的分段地址,即 4 段 120 单元。 (6)重新启动被中断的指令执行。 当指令重新执行时,由于 100 单元处的连接中断位为 0,不再引起中断,且直接地址就 是要连接的地址 4 段 120 单元,于是可从 4 段 120 单元读出所需的数据装入到 1 号寄存器。 5.分段的共享 段式虚拟存储管理利用分段的动态连接功能很容易实现分段的共享,由于不能事先知道 什么时候调用共享段,且段号可在动态连接时分配,因此不可能事先规定共享段的段号,这 样一个共享段对不同的调用者可以规定不同的段号。例如,对公共子程序 COS,在作业 1 调 用时具有段号 6,而在作业 2 调用时可以用段号 2。 (1)共享段表:为了实现段的共享,需要设置一个共享段表来记录段的共享情况,共 享段表一般包括段名、状态、在内存的起始地址、段长、调用该段的作业数、作业名和作业 定义的段号等信息。 (2)分段共享的实现原理:当某个作业首次调用某个段产生一个连接中断后,进行动 态连接,如果连接的是共享段,则在共享段表和该作业的段表中填写必要的项目。当共享段 被调出内存后,应在共享该段的每个作业的段表中表示该段不在内存;当它被移动后,要修 改共享段的每个作业的段表中所指示的地址;如果让作业段表的共享段的表目指向共享段 表,就可减少修改表目的工作量,在移动、调出和再装入时,只要修改共享段表即可。显 然,如果采用直接地址方式,共享段的移进移出所引起的共享段表和各作业的段表的调整是 十分复杂的。因此利用分段的动态连接,比较容易实现段的共享。 6.分段的保护 实现信息的共享必须解决共享信息的保护。在分段存储管理一般采取如下三种措施实现 存储保护: (1)在段表设置段长指示值,以表明段的长度。当存储访问时,段地址中的相对地址 与段长相比较,如超过段长,便发出越界中断。这样,每个作业被限制在自己的地址空间中 运行,于是这些段表便把各个作业互相分开了,因为一个作业的所有存储访问都是通过段表 来变换的,所以它们只涉及自己的地址空间,不存在一个用户作业破坏另一个用户地址空间 的危险。 (2)设置存取控制:在段表的每个表目中,除指明段长外,再增加“存取位”项。这 种段的保护,对于非共享段来说,主要是用来指示程序设计的错误。而对于共享段来说,如 果是过程,则必须禁止任何作业修改它,若是数据段,只允许各作业去读它,而不能去写。 当试图对过程进行读写或对数据段进行写时,系统将发出段保护中断。 (3)采用存储保护键:由于 I/O 通道对存储器的访问不经过段表,因此,除段保护 外,还采用存储键保护。就是系统为每道作业设置一个保护键,为某作业分配内存时,根据.

(22) 它的保护键在相应的段表中建立键标志,程序执行时将程序状态字中的键与访问段的键进行 核对,相符时才可访问该段。 4.5.4 段页式存储管理 分段存储管理不仅具有逻辑上的清晰性和完整性,而且便于扩充、动态连接和实现共 享。但它有一个缺点就是每个分段必须占据内存的连续空间,即一个分段不能比内存实际容 量大。而分页存储管理在管理存储空间时,可以给作业一个比内存实际地址大得多的虚拟地 址空间。这样,兼用分段和分页两种方法,即采用段页式存储管理。段页式存储管理是用分 段的方法来分配和管理虚拟存储器,用分页的方法来分配和管理内存。这样,一方面可以保 持分段地址空间所带来的优点,如允许分段动态扩展,可实现分段的动态连接,分段的共享 和实施段的保护等;另一方面,内存分区的拼接问题,辅助存储器的管理以及分段大小的限 制等问题都可得到解决。 1.段表和页表 段页式管理是将用户作业按逻辑意义分段,每个段再划分为大小相同的页,而内存空间 则划分成与页大小相同的存储块,并以块为单位分配内存。这样可以允许一个分段在内存中 不必连续存放,也不必一次全部装入。作业地址空间的逻辑地址分为段号 s、页号 p 和页内 地址 d 三部分,如下所示: 段号. 页号. 页内地址. s. p. d. 用户编写自己的作业仍使用段名和段内相对地址,即逻辑地址仍反映的是二维地址空 间。由系统的地址变换机构,根据页的大小把段内相对地址变换成页号和页内地址,这个过 程对用户是透明的。 为实现动态地址变换,对于每个作业都设立一个段表和若干个页表,段表中一般指出每 段的状态、页表的起始地址和页表的长度。页表的长度是由段长和页面大小决定的,当页面 大小确定后则由段长决定。页表一般包括状态、页号和块号。状态指明该页是否在内存中。 块号说明该页所对应在内存中的块。另外,还有一个段表地址控制寄存器来指明段表的起始 地址和段表长度。段表和页表的关系如图 4-18 所示。 段表 0 段 状态. 页表长. 0 段页表 页表始址. 状态. 块号. 0页 1页. 1段. …. …. 2段 1 段页表 状态. 块号. 0页 1页. 段表和页表的关系. …. 图 4-18. 第4章. 存储管理. 161.

(23) 162. 操作系统原理及应用(Windows Server 2008). 2.段页式存储管理的地址转换 当作业运行时,欲访问虚拟地址(s,p,d),在没有相关存储器的情况下,地址转换过程 如下: (1)地址转换硬件将段表地址控制寄存器与指令地址域中的段号 s 相加,得到欲访问 段 s 在该作业的段表中表目入口地址。 (2)从该表的表目中得到该段的页表起始地址,并将其与地址场中的页号 p 相加后得 到欲访问页 p 在该段的页表中的表目入口地址。 (3)从该页表的表目中取出其对应的块号与指令地址场中的页内地址 d 拼成内存的实 际地址。 在使用相关存储器的情况下,相关存储器的表目中应包括如下内容:段号、页号、块 号、该段页表长以及存取控制信息等。每次地址转换时,同时进行直接映像和相关映像的地 址转换工作。当相关映像地址转换成功即自动停止直接映像工作。相关映像的地址转换过程 如下: (1)以段号、页号为索引同时对相关存储器的各表目进行比较。 (2)如果匹配,则比较页表长度和存取控制信息以判断访问的合法性。若不合法,则 停止地址转换工作,发出相应的中断信号。 (3)取出块号和页内地址 d 拼成内存的实际地址,然后对该地址进行访问。 (4)如果在相关存储器中查找不到该表目,则通过直接映像来找出块号,完成对内存 的访问,同时将有关信息装入到相关存储器中。 段页式存储管理是分段存储管理和请求页式存储管理的结合,因此它具有两者的全部优 点:提供虚拟存储器的功能;没有紧缩问题,也没有页外的碎片存在;便于处理变化的数据 结构,分段可动态增长;容易实现共享;便于实现动态连接;提供更好的存取保护。 段页式存储管理的主要缺点是:增加了软件的复杂性和管理的时间;需要的硬件支持也 增加了;系统存在着抖动的危险;和分页管理一样,存在页内碎片。 段页式存储管理对大、中型计算机来说是使用的最广泛最灵活的一种存储管理方法。. 4.6 Windows Server 2008 的内存管理 Windows Server 2008 标准版的存储管理主要包括两个方面:一方面是转换或映射进程的 虚拟地址空间到实际的物理内存,这样当线程读取或写入虚拟地址空间时,能保证访问正确 的物理地址。另一方面当内存使用不足时,调度内存中的一些内容到磁盘上,并且在需要的 时候再把它调入到物理内存中。 除了提供 64 位虚拟内存管理外,而且提供内存保护、共享内存、写时复制内存的功 能,以及对应用程序使用大量的、稀疏的地址空间的支持。首先来研究 Windows Server 2008 内存管理器的结构和功能。 4.6.1 内存管理器的结构和功能 Windows Server 2008 的内存管理程序是 Windows Server 2008 执行体的主要组成部分之 一,是 Windows Server 2008 的基本存储管理系统,位于 Ntoskrnl.exe 文件中。.

(24) 1.内存管理器的结构 内存管理器提供了一系列服务,来完成对内存的管理,内存管理器由以下组件构成: (1)一组执行体系统服务程序,用于虚拟内存的分配、释放和管理。这些服务大多数 都是以 Win32 API 或核心驱动程序接口形式出现。 (2)一个变换无效和访问错误陷阱处理程序,用于解决硬件检测到的内存管理异常事 件,并代表进程将虚拟页面装入内存。 (3)运行在 6 个不同内核模式系统线程的描述表中的几个关键组件。 工作集管理器:优先级为 16,它每秒运行一次,当空闲内存低于某一界限时,便驱动 所有的内存管理规则,例如工作集的维护和已修改页的写入。它与系统线程联合来执行实际 的工作。 进程/堆栈交换程序:优先级为 23,用于执行进程和内核线程堆栈的换入和换出操作。 在需要执行换入和换出操作时,通过内核中平衡设置管理器和在内核中的线程调度代码可以 唤醒这个程序。 已修改页面写入器:优先级为 17,把修改列表中的无用的页写回到相应的页面调度文 件中。当需要减少修改链表的大小时,将唤醒这个线程。 映射页面写入器:优先级为 17,把映射文件中无用的页写到磁盘。当需要减少修改链 表的大小,或映射文件中某些页面在修改链表中超过了 5 分钟时,它将被唤醒。 废弃段线程:优先级为 18,负责系统高速缓存和页面文件的增加和减少。 零页线程:优先级为 0,使空闲列表内的页面清零,以便有足够的零页面满足将来的零 页面需求。 2.内存管理器的功能 内存管理器提供了一组系统服务来分配和释放虚拟内存、在进程间共享内存、映射文件 到内存、刷新虚拟页到磁盘、恢复关于虚拟页面范围的信息、更改它们的保护和把它们锁入 内存。 像其他的 Windows Server 2008 执行体服务一样,内存管理服务允许它们的调用程序提 供进程句柄,以指示其虚拟内存将被操作的特殊进程。这样,调用程序就可以操作它自己的 内存或操作另一个进程的内存。在一个进程中,可以创建另一个进程,并给自己操作子进程 的虚拟内存的权利。因此父进程可以通过调用虚拟内存服务并以参数的形式传递句柄到子进 程中来代表子进程分配、释放、读取和写入内存。子系统使用这个特性来管理它们的进程的 内存,同时这个特性对于执行调试程序也很关键,因为调试程序必须能够读取和写入被调试 进程的内存。 内存管理器提供的功能具体来说,包括如下五个方面: (1)保留和提交虚拟内存。 Windows Server 2008 提供了一个可选择的两阶段方法来分配内存,应用程序可以首先保 留地址空间,然后提交在那个地址空间的存储器到页面调度文件或映射一个映射文件的视 口。保留内存是一种简单的方法,线程保留虚拟地址的一个范围以供将来使用。访问保留内 存将导致一个访问侵犯,因为在内存中提交的内存没有包含数据。提交的内存是内存管理器 使用的对应于磁盘存储器的内存,访问提交的内存,如果它没在物理内存中,页面将被调入 到物理内存中,然后再进行访问。 第4章. 存储管理. 163.

(25) 164. 操作系统原理及应用(Windows Server 2008). 进程地址空间中的页面可以是空闲、保留或提交的。可以回收或释放地址空间,回收和 释放的差别在于,回收的内存仍然是保留的,但是释放的内存既不是提交的,也不是保留 的,它是空闲的。 分两步保留和提交内存能够减少页面文件的使用。在 Windows Server 2008 下,保留内 存是一种又快又占用资源少的操作,因为它不消耗任何页面文件空间或进程页面文件配额。 所以需要被更新或构造的是相对较小的代表进程地址空间的数据结构。 保留,然后提交,对于需要大量和连续的内存缓冲区的应用程序是非常有用的。地址空 间可以被保留,然后在需要的时候再提交,而不是为整个区域提交页面文件存储器。在创建 线程时,就保留一个地址空间,大约 1MB,然后再提交两个页面,仅 4KB,一个用于初始 页面,另一个作为保护页,并能够自动扩展。 (2)共享内存。 共享内存指对一个以上的进程使用同一段物理内存。例如,如果两个进程编译 C 程序, 很明显编译器只被装入内存一次,这样当另外一个进程要调用它时,只需把第二个进程的虚 拟地址映射到编译器所占据的物理页块就可以了。 在内存管理器中用于执行共享内存的基本单元称作“区域对象”。区域对象在内存管理 器中用来把虚拟地址映射到磁盘页面上,不管它是在页面文件中还是在应用程序将要访问的 其他文件中,它就像是在内存中。一个区域对象可以被一个进程或多个进程打开。区域对象 可以被连接到在磁盘上已打开的文件或一串页面调度文件上。 区域对象可以引用比进程地址空间能够容纳的文件大得多的文件,这样,要访问区域对 象,进程可以只映射它需要的区域对象的一部分,称为区域的一个视口,然后指定映射的范 围。一个视口提供了进入这个共享的内存区的一个窗口,不同进程可以映射一个区域对象的 不同视口。 用映射一个区域对象的一些视口可使进程访问很大的一些内存,否则该进程也许没有足 够的虚拟地址空间来映射它们。例如我们可能使用一个很大的数据库,当使用该数据库时, 就可以创建一个区域对象来包含整个数据库。当一个用户进程查询该数据库时,把该区域对 象的视口映射到进程的虚拟地址空间,从中获得数据。查询完该视口,然后映射该对象的另 一个视口。实际上 Windows Server 2008 通过区域对象和视口的方法每次打开一个窗口,从 而可从数据库的每一部分获得数据,而不会超出进程虚拟地址空间。 内存管理器通过区域对象的不同视口的方法,使进程像在内存中访问一个大数组那样 存取文件,这称为映像文件 I/O 活动。应用程序可使用映像文件方便地完成到文件的输入/ 输出。 (3)内存保护。 Windows Server 2008 为进程和操作系统本身提供内存保护,这样就没有用户进程在无意 中破坏其他进程或操作系统的地址空间。通过以下四种主要的方法提供这种保护。 1)所有系统范围内的在内核模式下的组件使用的数据结构和内存交换区只能在内核模 式下被访问,用户模式线程不能访问这些页面。如果它们试图这样做,硬件将产生错误,内 存管理器会报告线程访问侵犯。 2)每一个进程都有一个独立的、专用的地址空间,禁止其他进程的任何线程访问, 除非使用共享内存,在这种情况下只有共享页面能够被一个以上的进程查看。每次线程引.

(26) 用一个地址,虚拟内存硬件和内存管理器共同工作,干预并变换虚拟地址到物理地址。通 过控制虚拟地址如何变换,能够确保在一个进程内运行的线程不会错误地访问属于其他进 程的页面。 3)除了提供虚拟地址到物理地址变换的隐含保护外,Windows Server 2008 所支持的所 有处理机都提供了某些形式的硬件控制的内存保护,如读/写,只读等,这种保护的具体细 节因处理机的不同而不同。例如,在进程地址空间内的代码页面被标记为只读,这样就禁止 了用户线程对它们的修改。 4)共享内存区中的区域对象具有标准的访问控制列表(ACL),当进程试图打开共享内 存的区域对象时会检查 ACL,这样就把对共享内存的访问限制在那些有适当权限的进程之 内。当线程创建一个区域来包含一个映射文件时,安全性就会起作用。要创建该区域,线程 必须至少对此文件具有读的访问权限,否则该操作将失败。 一旦线程成功为区域对象打开了句柄,它仍将服从前面所说的内存管理和基于硬件的页 面保护。如果对页面级保护的更改不违反区域对象在 ACL 中的权限,线程就可以在区域内 更改对虚拟页面的页面级保护。例如,内存管理器允许线程把只读区域的页面改变为具有写 时复制访问权限,但不能具有读/写访问权限。允许写时复制权限是因为它不影响其他进程 共享数据。 这四种主要的保护机制使 Windows Server 2008 成为坚固的、可靠的操作系统,使它不 受应用程序错误的影响,并可以从应用程序错误中恢复。 (4)写时复制。 写时复制页面保护是内存管理器用来节约物理内存的优化技术。当进程映射包含读/写 页面的区域对象的写时复制视口,不是在映射视口时同时制作进程专用副本,而是内存管理 器延迟到页面被修改后才制作页面的副本。 在内存共享时,如果页面被标记为写时复制,那么任何一个进程中的线程写入该页面, 就会产生内存管理错误。内存管理器观察到写操作是作用于写时复制页面,因此它不是以访 问侵犯报告该错误,而是在物理内存中分配一个新的读/写页面,复制原始页面的内容到新 页面,更新在这个进程中相应的页面映射信息来指向新的位置并取消异常,这样就产生错误 的指令重新被执行。此时就可以成功地进行写操作,新复制的页面是进行写操作的进程专用 的,并且对仍然共享写时复制页面的其他进程是不可见的。每个写到那个相同共享页面的进 程都将得到它的专用副本。 写时复制被用于实现调试程序中的断点支持。例如,在默认状态下,代码页在开始时是 只读的。然而程序员在调试程序时设置一个断点,调试程序就必须把断点指令添加到代码 中。要完成这项工作,它首先要更改页面的保护为写时复制,然后更改指令。内存管理器立 即为要在其线程中设置断点的进程创建代码页的专用副本,而其他的进程仍然继续使用未更 改的页面。 写时复制是怠惰计算的一个例子,怠惰计算是内存管理器经常使用的。怠惰计算算法避 免执行昂贵的操作,除非是在绝对需要时,否则如果不需要此项操作,在它上面就不会浪费 任何时间。 (5)堆管理。 堆是一个或多个页面的区域,通过堆管理器提供一组函数可以把这个区域分开并分配成 第4章. 存储管理. 165.

(27) 166. 操作系统原理及应用(Windows Server 2008). 较小的块。每个进程以一个默认进程堆开始,一般是 1MB,这个大小只是初始保留值,在 需要的时候,它可以自动扩展。进程可以创建另外的专用堆。当进程不再需要专用堆的时 候,可以恢复为虚拟地址空间。 为了从默认堆中分配内存,线程必须得到它的句柄。有了堆句柄以后,线程就可以从堆 中分配和释放内存。堆管理器也为每个堆进行串行化分配和回收,这样多线程同时调用堆函 数而不会破坏数据结构。 4.6.2 地址空间分布 虚拟存储管理实现了一个复杂而有效的虚拟存储系统,它为每个进程提供了一个很大的 虚拟地址空间。为了做到这一点,Windows Server 2008 抛弃了所有基于 Intel 芯片的早期个 人计算机都使用的分段模式所造成的每段 64K 的局限性,因为这个局限使得 32 位计算机难 以发挥它的全部性能。同时 Windows Server 2008 的设计者认为,虚拟空间的线形模式比分 段模式更与内存的实际结构相吻合,所以采用“请求分页的虚拟存储管理技术”,每个页面 的大小是 4KB。 Windows Server 2008 的进程都有 4GB 大的虚拟地址空间,这 4GB 的地址空间被等分成 两部分,虚拟地址空间中高地址的 2GB 空间保留给操作系统使用,而低地址的 2GB 空间为 用户存储区,可被用户进程使用。地址空间的分布情况如图 4-19 所示。 用户地址空间 00000000H 页交换区. 7FFFFFFFH 系统地址空间 80000000H. C0000000H. 直接映射区 页交换区. C0800000H 固定页面区 FFFFFFFFH 图 4-19. 虚拟地址空间分布. 用户地址空间主要为应用程序代码、用户数据、每个线程的堆栈和动态连接库(DLL) 代码等提供地址空间,范围是 00000000H~7FFFFFFFH,大小是 2GB,其中 00010000H~ 7FFEFFFFH 是进程地址空间,其余 192KB 的地址空间为线程环境块、进程环境块和地址保 护区等使用。另外,系统提供系统变量来表示用户地址空间,也可以使用进程性能计数器获 得进程的地址空间使用情况。 可以使用“性能监视器”检查不同进程的内存性能计数器,也可以使用其他的实用程序 来查看进程的物理和虚拟内存使用情况。.

參考文獻

相關文件

初中科技教育學習領域課程資源 課題六 單利息、複利息和金錢的時間值 策略和管理—延伸學習元素.. 單元 E4

如何運用多元教學策略推行幼小銜接 ──. 校本基礎識字課程

Rebecca Oxford (1990) 將語言學習策略分為兩大類:直接性 學習策略 (directed language learning strategies) 及間接性學 習策略 (in-directed

從地理位置上作一觀察,中國可說是「東盟」最親密的近鄰。「東盟」對中國的外交政 策,大致上分為兩個重要發展階段。第一階段從 1990

初中科技教育學習領域課程資源 課題: 商業、營商環境和全球一體化 策略和管理— 核心學習元素.. 單元 K7

政府禁毒策略與

電子學習 教學 教學 教學 教學 聲情教學 聲情教學 聲情教學 聲情教學.. 策略 策略

在整個學與教過程中,教師按不同因素(如課程和學習目標、學生的興趣、能力和需要等)運 用適切的學與教策略 [