Windows内存管理机制.doc

上传人:豆**** 文档编号:23974348 上传时间:2022-07-03 格式:DOC 页数:50 大小:260.50KB
返回 下载 相关 举报
Windows内存管理机制.doc_第1页
第1页 / 共50页
Windows内存管理机制.doc_第2页
第2页 / 共50页
点击查看更多>>
资源描述

《Windows内存管理机制.doc》由会员分享,可在线阅读,更多相关《Windows内存管理机制.doc(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateWindows内存管理机制Windows内存管理机制Windows 2000/XP内存管理机制冯秋2004-9-271概述12地址空间的布局13地址转换机制24用户空间内存分配方式45系统内存分配56缺页处理57工作集68物理内存管理79其他内存相关机制81 概述l Windows 2000/XP内存管理器位于Ntoskrnl.exe文件中,硬件抽象层中没有内存管理器

2、的任何部分。l 内存管理器是完全可重入的,支持多进程并发执行。l 内存管理器组成部分:1) 一组执行体系统服务程序:用于虚拟内存的分配、回收和管理。2) 一个转换无效和访问错误陷阱处理程序:用于解决硬件检测到的内存管理异常,并代表进程将虚拟页面装入内存。3) 运行在六个不同的核心态系统线程上下文中的几个关键组件:工作集管理器:优先级16,每秒钟被平衡集管理器(一个内核创建的系统线程)调用一次。进程/堆栈交换程序:优先级23,完成进程和内核线程堆栈的换入和换出操作。已修改页面写入器:优先级17,将修改链表上的脏页写回到适当的页文件。映射页面写入器:优先级17,将映射文件中脏页写回磁盘。废弃段线程

3、:优先级18,负责系统高速缓存和页面文件的扩大和缩小。零页线程:优先级0,将空闲链表中的页面清零。2 地址空间的布局l Win32环境下,32位的地址空间转化为4GB的虚拟内存。默认情况下,将一半(2GB)分配给用户进程,另一半(2GB)分配给操作系统。l Windows 2000/XP Advanced Server版本和Windows 2000/XP Data Center版本支持一个引导选项(Boot.ini中通过/3GB标识激活),允许用户拥有3GB地址空间,留1GB给操作系统。l 对于要访问整个3GB地址空间的进程,进程映像文件必须在映像头设置IMAGE-FILE-LARGE-ADD

4、RESS-AWARE标识,否则系统将保留第3个GB的地址空间。可以通过指定链接标识/LARGEADDRESSAWARE来设置该标识。如果与此链接程序开关相链接,则可以使用3GB用户方式地址空间。l 2GBWindows 2000/XP用户地址空间分布NULL指针分配的分区:0x00xFFFF进程私有地址空间:0x100000x7FFEFFFF64KB拒绝访问区域:0x7FFF00000x7FFFFFFF,阻止线程跨过用户/系统边界传送缓冲区。l Windows 2000/XP用户地址空间系统变量MmHighestUserAddress:描述最高用户地址(对于x86 2GB用户空间为0x7FFE

5、FFFF)MmUserProbeAddress:描述最高用户地址1l 性能计数器:Windows 2000/XP中可利用性能计数器得到系统虚拟内存的使用信息,和单个进程地址空间的使用情况。l x86系统地址空间分布0x800000000x9FFFFFFF:引导系统(Ntoskrnl.exe和Hal.dll)和非分页缓冲池初始部分的系统代码。0xA00000000xA3FFFFFF:系统映射视图(如Win32k.sys)或者会话空间。0xA40000000xBFFFFFFF:附加系统页表项(PTE)或附加系统高速缓存。0xC00000000xC03FFFFF:进程页表和页目录,描述虚拟地址映射的

6、结构。0xC04000000xC07FFFFF:超空间和进程工作集列表。0xC08000000xC0BFFFFF:未使用区域,不可访问。0xC0C000000xC0FFFFFF:系统工作集链表,描述系统工作集的工作集链表数据结构。0xC10000000xE0FFFFFF:系统高速缓存,用来映射在系统高速缓存中打开的文件的虚拟空间。0xE10000000xEAFFFFFF:分页缓冲池,可分页系统内存堆。0xEB0000000xFFBDFFFF:系统页表项和非分页缓冲池。0xFFBE00000xFFFFFFFF:系统性故障转储信息和硬件抽象层(HAL)使用区域。l 会话空间:用来映射一个用户的会话

7、信息。进程创建时,会将会话空间映射到属于该进程会话的页面。会话是由进程和其他系统对象组成,每个会话有私有的GUI数据结构,以及Win32子系统进程(Csrss.exe)和登录进程(Winlogon.exe)的拷贝。会话管理器进程(Smss.exe)负责创建新的会话。3 地址转换机制l 用户应用程序以32位虚拟地址方式编址,每个虚拟地址与一个称作“页表项”(PTE)的结构有关,它包含了虚拟地址映射的物理地址。1 虚拟地址变换l x86系统利用二级页表结构实现虚拟地址向物理地址的变换。l x86系统中,32位虚拟地址分成三个部分:页目录索引(10 bit)、页表索引(10 bit)、字节索引(12

8、 bit)。l 虚拟地址变换的基本步骤:内存管理的硬件设备定位当前进程的页目录;页目录索引指出页目录项在页目录中的位置,页目录项中的页框号描述了映射虚拟地址所需页表的位置;页表索引指出页表项在页表中的位置,页表项描述了虚拟页面在物理内存的位置;当页表项指向的页面有效时,字节索引指明物理页内所需数据的地址;若所指页面无效,则交由内存管理器的故障处理程序处理。2 页目录l 每个进程都有一个单独的页目录,用来映射进程所有页表的位置,其物理地址被保存在核心进程(KPROCESS)块中。l 进程切换时,操作系统设置一个专用的CPU寄存器来通知硬件设备新进程页目录所在地址。l 页目录是由页目录项(PDE)

9、组成,每个页目录项4字节。x86中,描述4GB虚拟地址空间需要1024张页表,因此页目录索引10位。3 进程页表与系统页表l 进程页表是每个进程私有的,而系统页表被所有进程共享。l 当进程创建时,系统空间的页目录项初始化为指向现存的系统页表,但各个进程的系统空间不完全相同。当系统页表更新时,内存管理器不会立刻更新所有进程页目录,而是当进程访问新的虚拟地址时才更新进程页目录。l 性能监视器中的空闲系统页表项计数器表示了可用系统页表项的数目,也可在HKLMSYSTEMCurrentControlSetControlSessionManagerMemoryManagementSystemPages中

10、设置需要的页表项数量。4 页表项l 有效的页表项有两个主要的域:(1)包含数据的物理页面的页框号,或内存中某页面的物理地址的页框号;(2)一些描述页的状态和保护限制的标志位。访问位:某页首次被读写时,置为“1”修改位:某页首次被写时,置为“1”写位:为0时,对应页只读,为1时,对应页可读写多处理器的x86系统中,有个附加的由软件实现的写位,用来表示某页已经被一个运行在多个处理器上的线程写入。l x86中(非PAE系统),映射4GB地址空间需要1024张页表,每个页表含1024个页表项,每个页表项4字节,因此页表索引为10 bit。5 快表TLBl x86提供了关联存储器数组形式的高速缓存,称为

11、快表。它是一个向量,其存储单元能被同时读取并与目标值比较。l 快表中每个项的标志符部分保存了虚拟地址的一部分,数据部分保存了物理页号及对应页的保护类型和状态。l 将常用的虚拟地址记录在快表项中,减少了对内存的访问,加快了虚拟地址到物理地址的变换。l 如果一个虚拟地址不在快表中,它可能仍在内存中,需要对内存多次访问来找到它。当一个页表项由无效变为有效时,内存管理器会调用内核例程将新页表项装入快表,x86中,装入快表不需要软件干预。4 用户空间内存分配方式首先介绍两个与内存分配相关的数据结构(虚拟地址描述符和区域对象),然后介绍三种管理应用程序内存的方法。1 虚拟地址描述符l 虚拟地址描述符(VA

12、D)用来描述哪些虚拟地址已经在进程地址空间中被保留。对个进程,内存管理器都维持一棵虚拟地址描述信息树,用来描述进程地址空间状态。l 当进程保留地址空间,或映射一个内存区域时,就创建一个VAD来保存分配请求所提供的信息。当线程首次访问一个地址时,需找到一个包含被访问地址的VAD,利用所得信息填充页表项。2 区域对象l 区域对象在Win32中也称文件映射对象,表示可以被两个或多个进程共享的内存块,也可被映射到页文件或外存文件。l 主要作用将可执行映像装入内存访问高速缓存文件中的数据将文件映射到进程地址空间,不必进行文件I/Ol 每个打开文件都有一个单独的区域对象指针结构,由三个32位指针组成:指向

13、数据控制区域的指针、指向共享的高速缓存映射的指针、指向映像控制区域的指针。l CreatFileMapping函数可以创建区域对象;OpenFileMapping打开有名字的区域;可通过句柄继承或句柄复制访问区域对象;设备驱动程序可使用ZwOpenSection,ZwMapViewOfSection,ZwUnmapOfSection函数操纵区域对象。3 以页为单位的虚拟内存分配方式l 适合于大型对象或结构数组l 进程地址空间的页面有三种状态:空闲、被保留、被提交;保留和提交功能是通过Win32 VirtualAlloc和VirtualAllocEx函数实现的。l 应用程序可以同时进行保留和提交

14、,也可以先保留地址空间,当需要时再向地址空间提交物理页面,这样可以减少内存的使用。l VirtualFree或VirtualFreeEx函数用来回收页面或释放地址空间。回收的内存仍然被保留,而释放的内存是空闲的。4 内存映射文件l 适合于大型数据流文件以及多个进程之间的数据共享l 内存映射文件用来保留一个地址区域,并将磁盘文件提交给该区域,用于3个目的加载和执行.exe和.dll文件,可节省应用程序启动所需时间访问磁盘数据文件,减少文件I/O实现多个进程间的数据共享l 利用区域对象实现这些功能,因为区域对象可以链接到打开的磁盘文件(映射文件),或已提交的内存(提供共享内存)。l 进程要访问非常

15、大的区域对象,可以通过调用MapViewOfFile函数映射区域对象的一部分(区域视图),并指定映射范围。5 堆功能l 内存堆的应用程序内存管理方法适合于大量的小型内存申请l 堆是保留的地址空间中一个或多个页组成的区域,可由堆管理器进一步划分和分配l 堆管理器用来分配和回收可变内存,其函数位于Ntdll.dll和Ntoskrnl.exe中。l 进程启动时有一个缺省堆,通常为1MB,它在进程生命周期中不能被释放;而HeapCreat函数创建的私有堆可以用HeapDestroy来释放。l 从缺省堆中分配内存时,先调用GetProcessHeap函数得到句柄,再调用HeapAlloc和HeapFre

16、e来分配和回收内存块。5 系统内存分配l 系统初始化时,创建了两种动态大小的内存缓冲池来分配系统内存,ExAllocatePool函数可从缓冲池中分配和回收内存:非分页缓冲池:由长驻物理内存的系统虚拟地址区域组成。分页缓冲池:系统空间中可以被分页和换出的虚拟内存区域。l 两种非分页缓冲池:一般情况下使用;4页缓冲池在非分页缓冲池已漫且不允许分配失败时使用。l 分页缓冲池:单处理器系统3个,多处理器系统5个l 分页/非分页缓冲池初始大小依赖于系统物理内存大小,可设置HKLMSYSTEMCurrentControlSetControlSessionManagerMemoryManagement的N

17、onpaged PoolSize和PagedPoolSize值改变缓冲池大小。l 快速内存分配机制后备链表:仅包含固定长度的块,因此不必查找适合分配大小的空闲内存。l 若后备链表为空时,必须从分页或非分页缓冲池中进行分配。可使用ExInitializeNpagedLookasideList和ExInitializePagedLookasideList函数按照频繁分配的数据结构大小创建后备链表。6 缺页处理对无效页面的一次访问称为缺页错误,由内存管理故障处理程序解决。1 四个基本类型的无效页表项l 页文件:所需页没有驻留在内存,而是驻留在页文件中,并引发页面调入操作。l 请求零页:所需页是零页面

18、,此时会给进程工作集添加一个由零初始化的页。l 转换:所需页面在内存中的后备链表、修改链表或修改尚未写入链表。此时从链表中删除此页,并添加到工作集。l 未知:页表项为0,或页表不存在。此时需检查VAD以确定虚拟地址是否被提交。2 一个特例原型页表项l 区域对象第一次被创建时,同时创建原型页表项,它用于实现页面共享。l 当共享页面为有效时,进程页表项和原型页表项都指向包含数据的物理页。l 当共享页面无效时,进程页表项指向原型页表项,而原型页表项描述被访问的页面的状态(活动/有效、转换、修改尚未写入、请求零页、页文件、映射文件6种)3 页面调入I/Ol 当必须向文件(页或映射文件)发出读操作来解决

19、缺页问题时,将产生页面调入I/O。l 页面调入I/O操作是同步的,线程会一直等待I/O完成。l 当进行调页I/O时,进程中的其他线程仍可以同时处理缺页错误,因此在I/O结束时页面调度程序必须识别如下情况:冲突页错误、页面从虚拟地址空间中被删除、页面保护限制发生变化、原型页表项引发错误。4 冲突页错误l 同一进程中的另一线程或另一进程也对正在被调入的页面产生缺页错误,称为冲突页错误。l 页面调度程序检测到冲突页错误时,会对页框号数据库项中的特定事件发出等待操作。当I/O完成后,第一个获得页框号数据库锁的线程负责执行完成页面调入操作。5 页文件l 虚拟存储器在磁盘上的部分称为页文件。内存物理内存页

20、文件。l 性能计数器可以检查被提交的进程私有内存使用情况,但无法确切知道一个进程提交的私有内存中有多少常驻内存,多少在页文件中。l Windows 2000/XP最多支持16个页文件。l 系统启动时,会话管理器进程读取页文件链表,并检查HKLMSYSTEMCurrentControlSetControlSessionManagerMemoryManagementPagingFiles打开页文件,如果没有,则创建一个缺省的20MB页文件。系统运行期间不能删除打开的页文件。l 系统进程为每个页文件都维持一个打开的句柄,Ntdll.dll中的NtCreatePagingfile系统服务程序可增加一个

21、新页文件。7 工作集工作集即在物理内存中保持的虚拟页面的子集,分进程工作集和系统工作集。1 页面调度策略l 取页策略:内存管理器利用请求式页面调度算法及簇方式将页面装入内存。当缺页中断时,将出错页面和它附近的一些页面装入内存,这样可减少读取外存的次数。l 置页策略:当线程收到页错误时,内存管理器要使用“置页策略”来确定在物理内存中放置虚拟页面的最佳位置。l 如果当页错误发生时物理内存已满,“置页策略”要决定哪一个虚拟页面必须从内存中删去来为新的页面腾出空间。多处理器系统中,采用局部先进先出(FIFO)策略,而单处理器系统中,采用最近最久未使用(LRU)替换策略。2 工作集管理l 系统初始时,所

22、有进程缺省的工作集最大最小值相同。有“增大调度优先级”权限的进程可用SetProcessWorkingSet函数来更改缺省值,但不能超过内核变量MmMaximumWorkingSetSize中的最大值。l 当物理内存变得很低时,工作集管理器自动修剪工作集,以增加可用空闲内存数量。l 有一系列内核控制变量描述工作集扩展和修剪,但这些值是确定的,不能被注册值调整。3 平衡集管理器和交换程序l 系统初始化时创建平衡集管理器,用来对工作集进行调整。工作集管理器也是运行在平衡集管理器线程环境下的一个例程。l 平衡集管理器等待两个事件对象1秒周期计时器到期后产生事件,并经历以下4步平衡集管理器每被唤醒4次

23、就唤醒交换程序;检查后备链表,必要时调整其深度;寻找处于CPU饥饿状态而需提高其优先级的线程;调用工作集管理器。内部工作集管理器事件,即工作集需要调整时l 交换程序:即KeSwapProcessOrStack例程,用来寻找一段时间内一直处于等待状态的线程,将其内核堆栈转移以收回物理内存。4 系统工作集l 系统工作集用来管理操作系统中可分页的代码和数据,其中可驻留5种页面:系统高速缓存页面;分页缓冲池;Ntoskrnl.exe中可分页的代码和数据;设备驱动程序中可分页的代码和数据;系统映射视图。l 系统工作集最大最小值是在系统初始化时计算的,基于物理内存数量和系统是professional或se

24、rver。8 物理内存管理l 页框号数据库用来描述物理内存中各页面的状态,有效页表项指向页框号数据库中的项,页框号数据库项又指回此页表。原型页框号指回原型页表项。l 页面可处于活动、过渡、后备、修改、修改不写入、空闲、零初始化和损坏不可用8种状态,除活动和过渡之外,其余6种组成了链表。1 动态页链表l 当需要一个零初始化的页面时,首先访问零页链表,若为空,则从空闲链表中选取一页并零初始化,若也为空,则从后备链表中选取一页并零初始化。零页链表是由零页线程(优先级为0)从空闲链表中移过来的,当空闲链表中有8个或8个以上页时激活零页线程。l 当不需要零初始化页面时,首先访问空闲链表,若为空,则访问后

25、备链表。l 当进程放弃一个页面时,如果页面未修改过,则加入后备链表;如果修改过,则加入修改链表。l 进程撤销时,将所有私有页面加入空闲链表。对页文件支持的区域最后一次访问结束时,页面加入空闲链表。l 当修改页链表太大,或零初始化和后备链表的大小低于最小值时,唤醒“修改页面写回器”线程,将页面写回外存,并将页面移入后备链表。2 修改页面写回器l 由两个系统线程组成,优先级都为17MiModifiedPageWriter:将修改页写回页文件MiMappedPageWriter:将修改页写入映射文件l 触发修改页面写回器的事件修改页面数量大于内核变量MmModifiedPageMaximum指定值可

26、利用页数量小于内核变量MmMinimumFreePages指定值MiMappedPagesTooOldEvent事件:该事件在预定的数秒后(缺省为300秒,可用注册值修改)产生,将映射页面写入外存l 若页面写入外存时正在被另一线程共享,则I/O完成后不会将此页移入后备链表。3 页框号数据结构l 页框号数据库项是定长的,不同页框号类型,包含的域也不同(参见图428)l 几个基本的域页表项地址:指向此页页表项的虚拟地址访问计数:对此页的访问数量类型:该页框号表示的页面状态(8种)标识:包含修改状态、原型页表项、奇偶校验错误、正在读取或写入等信息。初始页表项的内容页表项的页框号:指向该页面页表项的页

27、表页的物理页号9 其他内存相关机制1 锁内存可以通过两种方式将页面锁在内存中设备驱动程序调用核心态函数MmProbeAndLockPages,MmLockPagableCodeSection,mLockPagableDataSection,LockPagableSectionByHandle。解锁之前锁定的页面一直在内存中。Win32应用程序调用VirtualLock函数锁住工作集中页面,但不能防止调页。2 分配粒度l 系统按照分配粒度定义的整型边界对齐每个保留的进程地址空间区域,系统分配粒度值可通过GetSystemInfo函数找到,目前为64KB。l 保留地址空间时,保证区域大小是系统页大

28、小倍数。3 内存保护机制4种基本方式所有系统范围内核心态组件使用的数据结构和缓冲池只能在核心态下访问,用户线程不能访问。每个进程有独立私有的地址空间,其他进程的线程不能访问。(与其他进程共享页面或另一进程具有对进程对象的虚拟内存读写权限时除外)除虚拟到物理地址转换的隐含保护外,还提供一些硬件内存保护措施。利用共享内存区域对象的存取控制表(ACL)将对共享内存的访问限制在适当权限的进程中。4 写时复制l 当进程映射区域对象的写时复制视图时,内存管理器直到页面修改时才进行复制,而不是在映射视图的同时,这样可以节约物理内存。5 地址窗口扩充l 地址窗口扩充(AWE)函数集可使进程能够访问更多的物理内

29、存,步骤如下:分配要使用的物理内存:AllocateUserPhysicalPages函数(需锁内存页面的权限)创建一个虚拟地址空间作为窗口用来映射分配好的物理内存:VirtualAlloc函数和MEM_PHYSICAL标识将内存映射到窗口:MapUserPhysicalPages或MapUserPhysicalPagesScatter函数l AWE函数分配和映射内存的限制页面不能在进程间共享同一物理页面不能映射到同一进程的多个虚拟地址上页保护可读/写6 物理地址扩展l 物理地址扩展(PAE)的内存映射模式允许访问64GB物理内存。l 物理地址扩展模式下,虚拟地址划分为4个域:页目录指针索引(2 bit)、页目录索引(9 bit)、页表索引(9 bit)、页内字节偏移(12 bit)。l 物理地址扩展模式之所以能对更大范围的内存编址,是因为页目录项和页表项都由32位扩展到了64位。-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁