读书频道 > 系统 > windows > Windows内核原理与实现
4.1.4 Windows内存管理概述
2013-05-18 15:10:18     我来说两句 
收藏    我要投稿   

本文所属图书 > Windows内核原理与实现

本书从操作系统原理的角度,详细解析了Windows如何实现现代操作系统的各个关键部件,包括进程、线程、物理内存和虚拟内存的管理,Windows中的同步和并发性支持,以及Windows的I/O模型。在介绍这些关键部件时,本...  立即去当当网订购

以上介绍了现代计算机体系结构支持的两种虚拟内存管理机制以及操作系统在管理内存时涉及的算法和概念,这一节我们来看一看Windows 内核中的内存管理器如何有效地管理系统的物理内存以及每个进程中的虚拟内存。

首先,Windows 采用了页式内存管理方案,在Intel x86 处理器上,Windows 不使用段来管理虚拟内存,但是,Intel x86 处理器在访问内存时必须要通过段描述符,这意味着Windows 将所有的段描述符都构造成了从基地址0 开始,且段的大小设置为 0x80000000、0xc0000000 或0xffffffff ,具体取决于段的用途和系统设置。所以,Windows 系统中的代码,包括操作系统本身的代码和应用程序代码,所面对的地址空间都是线性地址空间。这种做法相当于屏蔽了处理器中的逻辑地址概念,段只被用于访问控制和内存保护。

正如我们在第 2 章中所讲,Windows 使用了两种特权级别:0 和3,其中特权级 0 称为内核模式,特权级3 称为用户模式。当处理器执行内核模式代码时,它们处于系统地址空间,位于 0x80000000~0xffffffff ,所有的进程共享此空间;当处理器执行用户模式代码时,它们处于进程地址空间,位于 0x00000000~0x7fffffff,这部分空间是进程私有的。用户模式代码只能访问进程自身的数据,而内核模式代码不仅可以访问当前进程的数据,也可以访问系统地址空间中的数据。所有的进程,一旦进入到内核模式,则共享同样的系统地址空间。

其次,在Windows 的每个地址空间中,虚拟地址的分配和回收都必须按照严格的规则进行。Windows 规定,应用程序在使用内存以前必须先申请,所以,操作系统内部可以根据应用程序的申请和释放操作来维护好整个虚拟地址空间的内存分配情况。而且,Windows 也采用了按需分配的策略,也就是说,只有当一段虚拟内存真正被使用的时候,系统才会为它分配页表和物理页面。每个进程的虚拟地址空间的分配情况通过一组虚拟地址描述符(VAD,Virtual Address Descriptor )记录下来,这些描述符构成了一棵平衡二叉树,以便于快速地定位到一个指定虚拟地址的描述符上。

在Windows 内存管理器中,除了虚拟地址空间的管理,另一重要职责是管理物理页面,以及实现进程页面的换入和换出过程。在Windows 中,页帧编号数据库(Page Frame Number Database,简称 PFN 数据库)描述了物理内存各个页面的状态。PFN 数据库实际上是一个结构数组,每个页面对应有一个PFN 项,记录了该页面的使用情况,包括它的状态、对应页表项的地址等信息。此外,操作系统还维护了一组链表,分别将相同类型的页面链接起来,比如,所有空闲的页面都插入到一个空闲链表中,所以,操作系统可以快速地从该链表中获得一个空闲的物理页面。页面也会随着其状态的变化,以及被进程的使用情况,而在不同的链表中流动,或者不属于任何一个链表。Windows 的页面替换算法也正是在这些数据结构的基础上实现的。

虽然Intel x86 定义了虚拟地址与物理地址之间的转换方式,但是页目录和页表需要操作系统来维护,Windows 定义了PDE 和PTE ,并且小心地维护好这些数据结构,以便处理器能够正确地转译虚拟地址。我们在上一章的KPROCESS数据结构中看到的DirectoryTableBase域正是指向进程页目录的指针,所以,操作系统在创建每个进程时,都需要为这个进程建立一套页目录和页表数据结构,从而建立起该进程的地址空间。在4.3.1节,我们将会看到一个地址空间是如何建立起来的。

地址空间建立起来以后,并不等于所有的页面都分配好了,Windows 采用的是按需换页的策略,当进程或系统使用某个尚未得到物理页面的虚拟地址时,处理器会触发页面错误(page fault )异常,所以,操作系统可以在页面错误的异常处理例程中为其分配页面,并设置好页表项和页面之间的逻辑关系。这一异常的发生对于使用此虚拟地址的代码而言是不可见的,一旦异常处理例程完成,则原来的代码指令继续执行,就好像此换页过程什么也没有发生一样。

什么时候页面被换出呢?当系统认为内存紧缺,或者一个进程由于工作集的限制而不允许拥有更多的物理页面时,Windows 会替换工作集中的页面。这项工作是由一个称为工作集管理器(working set manager )的组件来完成的,它运行在一个称为平衡集管理器(balance set manager)的系统线程中。工作集缩减的过程称为修剪(trim )。Windows 实现了全面的工作集模型,包括控制进程的工作集,以及与页面替换算法结合起来管理物理内存的全局分配。

至此,我们已经理解了 Windows 操作系统中内存管理的基本概况,下面列出在Windows 内存管理中一些比较重要的组件

执行体层提供了一组内存管理服务,用于分配、释放和管理虚拟地址。执行体也包括一个堆管理器(heap manager ),提供动态小内存块的管理。

页面错误异常处理器(或称为页面错误例程)。负责分配物理页面,或者把磁盘上的数据读入到页面中。

一组系统线程,负责维护操作系统的内存,其中包括:

平衡集管理器,它包括工作集管理器,每1 s 被调用一次,工作集管理器负责实施一些全局性的内存管理策略,比如工作集修剪。

进程/ 栈交换器。当系统需要执行换入或换出操作时,通知此线程完成这些任务。第3 章介绍线程状态转移时,我们曾经看到,如果一个进程的所有线程都处于等待状态,则它有可能被换出内存,即线程进入转移状态,以后该进程满足特定条件时再换回内存。此换入换出过程正是由进程/ 栈交换器来完成的。

修改页面写出器。它负责将脏页面写回到映射文件或页面文件中。在WRK中,写到映射文件和写到页面文件是分别由两个线程来完成的。

零页面线程。它运行的优先级为0,负责将空闲链表上的页面清零(即内存零化),以便当系统需要零页面时可以满足其要求。

系统地址空间包含了全局的系统代码和数据结构,并且对于所有的进程都是可见的,操作系统在初始化过程中首先建立起系统地址空间。因此,我们接下来先从系统地址空间的内存管理开始介绍。为简化起见,在本章的讲解中,我们不考虑 3 GB进程地址空间选项,以及对PAE 和大页面(页面大小为4 MB)的支持。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:4.1.3 内存管理算法介绍
下一篇:4.2.1 系统地址空间初始化
相关文章
图文推荐
3.4.4 进程生命期管
3.4.2 Windows应用商
3.4.1 Windows应用商
3.4 进程生命期管理
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站