4.8Windows 2003虚拟存储管理 4.8.1进程地址空间布局4.8.2用户空间主存分配 4.8.3主存管理的实现 4.8.1 主存管理的功能和地址空间布局1 主存管理的组成和功能1)存储管理系统服务程序 2) 转换无效和访问错误的陷阱处理程序 3) 一组系统线程 工作集管理器 进程/堆栈交换程序 已修改页面写入器 映射页面写入器 废弃段线程 零页线程2进程地址空间布局 固定页面区 页交换区操作系统驻留区(直接映射区) 页交换区系统存储区用户存储区C0000000H80000000H00000000HC0000000HFFFFFFFFH482用户空间主存分配 系统管理应用程序主存有两个数据结构:虚址描述符和区域对象;三种主存管理方法: 虚页主存分配 主存映射文件 主存堆分配1 虚址描述符 对每个进程,主存管理器都维护一组VAD ,用来描述进程地址空间哪些虚拟地址已被保留,而哪些没有,这个数据结构叫“虚地址描述符”VAD VAD的使用 线程首次访问一个地址,主存管理器为此地址的页面创建一个页表项,它找到一个包含被访问地址的VAD,并利用所得信息填充页表项 如果访问地址落在VAD覆盖的地址范围外,或所在的地址范围仅被保留而未提交,将产生一次访问违规。
2 区域对象及作用 “区域对象”(Section object)在Win32子系统中被称为“文件映射对象”,表示可被两个或多个进程所共享的主存块其作用有: 系统利用区域对象将可执行映象装入主存; 高速缓存管理器利用区域对象访问高速缓存文件中的数据; 使用区域对象将文件映射到进程地址空间,可像访问主存中数组一样访问这个文件,而不是对文件进行读写 区 域最大尺寸页保护限制盘交换区映射文件基本非基本区域创建区域打开区域扩展区域映射取消映射视口查询区域对象类型对象属性对象服务区域对象的结构 区域对象的使用 一个区域对象代表可由两个或多个进程共享的主存块 一个进程的线程可创建区域对象,为它起名字,以便其他进程的线程能打开这个区域对象的句柄 区域对象句柄被打开后,线程就能把这个区域对象映射到自己或另一个进程的虚地址空间中3 应用程序主存管理方法1)虚页主存分配 系统中使用虚拟主存,分三个阶段:保留主存(reserved memory)提交主存(committed memory) 释放主存 (release memory)2)主存堆分配 堆(heap)是保留地址空间中一个或多个页组成的区域,并由堆管理器按更小块划分和分配主存的技术。
缺省进程堆 HeapCreate创建私有堆,Heap Destroy 释放私有堆 GetprocessHeap得到指向堆的句柄, HeapAlloc和HeapFree从堆中分配和回收主存块3)主存映射文件(1) Memory-mapped File允许进程分配一段虚地址空间或某一个盘文件相关联,当把盘文件映射到该地址空间后,多个进程可以方便地访问主存映射文件用于三种场合: (1)执行体使用主存映射把可执行文件.exe和动态连接库.dll文件装入主存,节省应用程序启动时间 (2)进程使用主存映射文件存取磁盘文件信息,减少文件I/O和对文件进行缓存3)多个进程使用主存映射文件来共享主存中的数据和代码主存映射文件(2)使用步骤步1使用CreateFile打开文件 步2使用CreateFile Mapping建立文件映射步3使用MapViewOfFile 读写文件视窗 步4使用OpenFileMapping 打开文件映射对象 步5使用UnmapViewOfFile解除映射4.8.3主存管理的实现1进程页表与地址映射 在x86硬件平台上采用二级页表结构来实现进程的逻辑地址到物理地址的转换 32位逻辑地址解释成三个分量,页目录索引(10位)页表页索引(10位)和位置索引(12位),页面大小为4KB。
2页框号数据库(1) 所有主存物理页框组成了页框数据库(Page Frame Datebase),每个页框占一项,每项称为一个PFN结构(Page Frame Number) 工作集索引页表项地址共享计数标识 类型 访问计数初始页表项的内容页表项的页框号工作集中页面的PFN前向链接页表项地址后向链接标识 类型 访问计数初始页表项的内容页表项的页框号后备或修改链表中页面的PFN事件地址 页表项地址共享计数标识 类型 访问计数初始页表项的内容页表项的页框号正在I/O页面的PFN前向链接 页表项地址后向链接标识 类型 访问计数初始页表项的内容页表项的页框号零或空闲链表中页面的PFN页框号数据库(2)页框号数据库(3) PFN可能状态有效(Vaild)过渡(transition)后备(Stand by)修改(Modified)修改不写入(modiqied no write) 空闲(free) 零初始化(zeroed)坏(bad) 页框号数据库(4)请求零页面错误 从盘或内核读出页(页错误)缩小工作集缺页错误处理进程工作集修改页写回线程修改页框链表备用页框链表零页页框链表空闲页框链表零初始化线程页框的状态转换3 缺页处理(1)1)无效页处理(1) 访问一个未知页,其页表项为零,或者页表不存在,线程首次访问一个地址。
2) 所访问的页没有驻留在主存,而是在磁盘的某个页文件或映像文件中,系统分配一个物理页框,将所需的页从磁盘读出,放入工作集中3) 所访问的页在后备链表或更改链表中,将此页移到进程或系统工作集4) 访问一个请求零页,给进程工作集添加一个由零初始化的页缺页处理(2)(5) 对一个只读页执行写操作,访问违约6) 从用户态访问一个只能在核心态下访问的页,访问违约7) 对一个写保护页执行写操作,写违约8) 对一个写时复制的页执行写操作,为进程进行页复制9) 在多处理机系统中,对有效但尚未执行写操作的页执行写操作,将页表项修改位置“1”4原型页表项(1) 当两个进程共享一个物理页框时,主存管理器在进程页表中插入一个称作“原型页表项”prototype PTE的数据结构来间接映射共享的页面 原型页表项(2)PFN进程1页目录表有效:PFN=j无效:指向原型PTE页表段结构有效:PFN=j无效:在页文件PFNjPFN=jPTE地址共享计数=2原型页表主存页框数据库原型页表项PFN进程2页目录表有效:PFN=j页表5 页面淘汰算法与工作集管理 主存管理器在分配页框时,按照以下次序从非空链表中取得页面进行分配: 零页链表空闲链表 后备链表修改链表。
“修改页写回程序” 零初始化链表,空闲链表和后备链表的页框数低于允许的最小值时,将修改链表中的页面写回磁盘,然后,这些页框可放入后备链表 当修改链表太大时,把修改链表中的页面写回页文件中 把修改页写回磁盘后,系统的可用页框还太少,把进程的工作集调整到最小规模,新淘汰的页被放到修改链表或后备链表中6工作集管理(1) 请页式和页簇化调页技术, 页簇化策略能减少线程引发的缺页中断次数,减少调页IO的数量 缺省页面读取簇的数量取决于物理主存大小,当主存大于19MB时,代码页簇为8页、数据页簇为4页、其他页簇为8页 采用局部FIFO算法 采用局部淘汰可防止客户进程损失太多主存; 采用FIFO算法可让被淘汰的页在淘汰后在物理主存中停留一段时间,如果马上又用到该页的话,就可很快将该页回收,而无需从磁盘读出工作集管理(2)工作集管理(3) 工作集:该进程当前在主存中的页面的集合 创建一个进程时,系统为其指定最小工作集和最大工作集, 系统初始化时,计算进程最小和最大工作集值,当物理主存大于32MB(server大于64MB)时,进程缺省最小工作集为50页,最大工作集为345页工作集管理(4) 进程工作集降到最小后,如果发生缺页中断,且主存并不满,系统会增加该进程的工作集尺寸。
进程工作集升到最大后,如果没有足够主存可用,则该进程每发生一次缺页中断,系统都要从工作集中淘汰掉一页,再调入此次页中断所请求的页 如果有足够主存可用,系统也允许一个进程的工作集超过它的最大工作集尺寸工作集管理(5) 当物理主存剩余不多时,系统检查每个进程,其当前工作集是否大于其最小工作集,是则淘汰该进程工作集中的一些页,直到空闲主存数量足够或每个进程都达到其最小工作集工作集管理(6) 系统定时从进程中淘汰一个有效页,观察其是否对该页发生缺页中断,以此测试和调整进程当前工作集的合适尺寸如果进程继续执行,并未对被淘汰的页发生缺页中断,则该进程工作集减1,该页被加到空闲链表中7系统工作集中驻留5种页面 系统高速缓存页面 分页缓冲池 Ntoskrnl.exe中可分页代码和数据 设各驱动程序中可分页代码和数据 系统映射视图。