• 沒有找到結果。

Windows Server 2008 标准版的存储管理主要包括两个方面:一方面是转换或映射进程的 虚拟地址空间到实际的物理内存,这样当线程读取或写入虚拟地址空间时,能保证访问正确 的物理地址。另一方面当内存使用不足时,调度内存中的一些内容到磁盘上,并且在需要的 时候再把它调入到物理内存中。

除了提供 64 位虚拟内存管理外,而且提供内存保护、共享内存、写时复制内存的功 能,以及对应用程序使用大量的、稀疏的地址空间的支持。首先来研究 Windows Server 2008 内存管理器的结构和功能。

4.6.1 内存管理器的结构和功能

Windows Server 2008 的内存管理程序是 Windows Server 2008 执行体的主要组成部分之 一,是 Windows Server 2008 的基本存储管理系统,位于 Ntoskrnl.exe 文件中。

1.内存管理器的结构

内存管理器提供了一系列服务,来完成对内存的管理,内存管理器由以下组件构成:

(1)一组执行体系统服务程序,用于虚拟内存的分配、释放和管理。这些服务大多数 都是以 Win32 API 或核心驱动程序接口形式出现。

(2)一个变换无效和访问错误陷阱处理程序,用于解决硬件检测到的内存管理异常事 件,并代表进程将虚拟页面装入内存。

(3)运行在 6 个不同内核模式系统线程的描述表中的几个关键组件。

工作集管理器:优先级为 16,它每秒运行一次,当空闲内存低于某一界限时,便驱动 所有的内存管理规则,例如工作集的维护和已修改页的写入。它与系统线程联合来执行实际 的工作。

进程/堆栈交换程序:优先级为 23,用于执行进程和内核线程堆栈的换入和换出操作。

在需要执行换入和换出操作时,通过内核中平衡设置管理器和在内核中的线程调度代码可以 唤醒这个程序。

已修改页面写入器:优先级为 17,把修改列表中的无用的页写回到相应的页面调度文 件中。当需要减少修改链表的大小时,将唤醒这个线程。

映射页面写入器:优先级为 17,把映射文件中无用的页写到磁盘。当需要减少修改链 表的大小,或映射文件中某些页面在修改链表中超过了 5 分钟时,它将被唤醒。

废弃段线程:优先级为 18,负责系统高速缓存和页面文件的增加和减少。

零页线程:优先级为 0,使空闲列表内的页面清零,以便有足够的零页面满足将来的零 页面需求。

2.内存管理器的功能

内存管理器提供了一组系统服务来分配和释放虚拟内存、在进程间共享内存、映射文件 到内存、刷新虚拟页到磁盘、恢复关于虚拟页面范围的信息、更改它们的保护和把它们锁入 内存。

像其他的 Windows Server 2008 执行体服务一样,内存管理服务允许它们的调用程序提 供进程句柄,以指示其虚拟内存将被操作的特殊进程。这样,调用程序就可以操作它自己的 内存或操作另一个进程的内存。在一个进程中,可以创建另一个进程,并给自己操作子进程 的虚拟内存的权利。因此父进程可以通过调用虚拟内存服务并以参数的形式传递句柄到子进 程中来代表子进程分配、释放、读取和写入内存。子系统使用这个特性来管理它们的进程的 内存,同时这个特性对于执行调试程序也很关键,因为调试程序必须能够读取和写入被调试 进程的内存。

内存管理器提供的功能具体来说,包括如下五个方面:

(1)保留和提交虚拟内存。

Windows Server 2008 提供了一个可选择的两阶段方法来分配内存,应用程序可以首先保 留地址空间,然后提交在那个地址空间的存储器到页面调度文件或映射一个映射文件的视 口。保留内存是一种简单的方法,线程保留虚拟地址的一个范围以供将来使用。访问保留内 存将导致一个访问侵犯,因为在内存中提交的内存没有包含数据。提交的内存是内存管理器 使用的对应于磁盘存储器的内存,访问提交的内存,如果它没在物理内存中,页面将被调入 到物理内存中,然后再进行访问。

164 操作系统原理及应用(Windows Server 2008)

进程地址空间中的页面可以是空闲、保留或提交的。可以回收或释放地址空间,回收和 释放的差别在于,回收的内存仍然是保留的,但是释放的内存既不是提交的,也不是保留 的,它是空闲的。

分两步保留和提交内存能够减少页面文件的使用。在 Windows Server 2008 下,保留内 存是一种又快又占用资源少的操作,因为它不消耗任何页面文件空间或进程页面文件配额。

所以需要被更新或构造的是相对较小的代表进程地址空间的数据结构。

保留,然后提交,对于需要大量和连续的内存缓冲区的应用程序是非常有用的。地址空 间可以被保留,然后在需要的时候再提交,而不是为整个区域提交页面文件存储器。在创建 线程时,就保留一个地址空间,大约 1MB,然后再提交两个页面,仅 4KB,一个用于初始 页面,另一个作为保护页,并能够自动扩展。

(2)共享内存。

共享内存指对一个以上的进程使用同一段物理内存。例如,如果两个进程编译 C 程序,

很明显编译器只被装入内存一次,这样当另外一个进程要调用它时,只需把第二个进程的虚 拟地址映射到编译器所占据的物理页块就可以了。

在内存管理器中用于执行共享内存的基本单元称作“区域对象”。区域对象在内存管理 器中用来把虚拟地址映射到磁盘页面上,不管它是在页面文件中还是在应用程序将要访问的 其他文件中,它就像是在内存中。一个区域对象可以被一个进程或多个进程打开。区域对象 可以被连接到在磁盘上已打开的文件或一串页面调度文件上。

区域对象可以引用比进程地址空间能够容纳的文件大得多的文件,这样,要访问区域对 象,进程可以只映射它需要的区域对象的一部分,称为区域的一个视口,然后指定映射的范 围。一个视口提供了进入这个共享的内存区的一个窗口,不同进程可以映射一个区域对象的 不同视口。

用映射一个区域对象的一些视口可使进程访问很大的一些内存,否则该进程也许没有足 够的虚拟地址空间来映射它们。例如我们可能使用一个很大的数据库,当使用该数据库时,

就可以创建一个区域对象来包含整个数据库。当一个用户进程查询该数据库时,把该区域对 象的视口映射到进程的虚拟地址空间,从中获得数据。查询完该视口,然后映射该对象的另 一个视口。实际上 Windows Server 2008 通过区域对象和视口的方法每次打开一个窗口,从 而可从数据库的每一部分获得数据,而不会超出进程虚拟地址空间。

内存管理器通过区域对象的不同视口的方法,使进程像在内存中访问一个大数组那样 存取文件,这称为映像文件 I/O 活动。应用程序可使用映像文件方便地完成到文件的输入/

输出。

(3)内存保护。

Windows Server 2008 为进程和操作系统本身提供内存保护,这样就没有用户进程在无意 中破坏其他进程或操作系统的地址空间。通过以下四种主要的方法提供这种保护。

1)所有系统范围内的在内核模式下的组件使用的数据结构和内存交换区只能在内核模 式下被访问,用户模式线程不能访问这些页面。如果它们试图这样做,硬件将产生错误,内 存管理器会报告线程访问侵犯。

2)每一个进程都有一个独立的、专用的地址空间,禁止其他进程的任何线程访问,

除非使用共享内存,在这种情况下只有共享页面能够被一个以上的进程查看。每次线程引

用一个地址,虚拟内存硬件和内存管理器共同工作,干预并变换虚拟地址到物理地址。通 过控制虚拟地址如何变换,能够确保在一个进程内运行的线程不会错误地访问属于其他进 程的页面。

3)除了提供虚拟地址到物理地址变换的隐含保护外,Windows Server 2008 所支持的所 有处理机都提供了某些形式的硬件控制的内存保护,如读/写,只读等,这种保护的具体细 节因处理机的不同而不同。例如,在进程地址空间内的代码页面被标记为只读,这样就禁止 了用户线程对它们的修改。

4)共享内存区中的区域对象具有标准的访问控制列表(ACL),当进程试图打开共享内 存的区域对象时会检查 ACL,这样就把对共享内存的访问限制在那些有适当权限的进程之 内。当线程创建一个区域来包含一个映射文件时,安全性就会起作用。要创建该区域,线程 必须至少对此文件具有读的访问权限,否则该操作将失败。

一旦线程成功为区域对象打开了句柄,它仍将服从前面所说的内存管理和基于硬件的页 面保护。如果对页面级保护的更改不违反区域对象在 ACL 中的权限,线程就可以在区域内 更改对虚拟页面的页面级保护。例如,内存管理器允许线程把只读区域的页面改变为具有写 时复制访问权限,但不能具有读/写访问权限。允许写时复制权限是因为它不影响其他进程 共享数据。

这四种主要的保护机制使 Windows Server 2008 成为坚固的、可靠的操作系统,使它不 受应用程序错误的影响,并可以从应用程序错误中恢复。

(4)写时复制。

写时复制页面保护是内存管理器用来节约物理内存的优化技术。当进程映射包含读/写 页面的区域对象的写时复制视口,不是在映射视口时同时制作进程专用副本,而是内存管理

写时复制页面保护是内存管理器用来节约物理内存的优化技术。当进程映射包含读/写 页面的区域对象的写时复制视口,不是在映射视口时同时制作进程专用副本,而是内存管理

相關文件