《windows操作系统课件 实验2内存管理.ppt》由会员分享,可在线阅读,更多相关《windows操作系统课件 实验2内存管理.ppt(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实习二:Windows虚拟存储器管理 实习要求使用Windows 2000XP的API函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号量实现同步。模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括如下内容:时间:操作等待时间。块数:分配内存的粒度。操作:包括保留(reserve)一个区域、提交(commit)一个区域、释放(release)一个区域回收(decommit)一个区域和加锁(lock)与解锁(unlock)一个区域,可以将这些操作编号存放于文件。保留是指保留进程的虚拟地址空间,而
2、不分配物理存储空间。提交在内存中分配物理存储空间。回收是指释放物理内存空间,但在虚拟地址空间仍然保留,它与提交相对应,即可以回收已经提交的内存块。释放是指将物理存储和虚拟地址空间全部释放,它与保留(reserve)相对应,即可以释放已经保留的内存块。大小:块的大小。访 问 权 限:共 五 种,分 别 为PAGE_READONLY,PAGE_READWRITE,PAGE_EXECUTE,PAGE_EXECUTE_READ和PAGE EXECUTE_READWRITE。可以将这些权限编号存放于文件中跟踪线程将页面划大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来。实习目的 了解
3、windows 2000/xp的内存管理机制,掌握页式虚拟存储技术理解内存分配原理,特别是以页面为单位的虚拟内存分配方法。掌握windows 2000/xp下内存管理的基本api同时需要了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)对Windows分配虚拟内存、改变内存状态,以及对物理内存(physical memory)和页面文件(pagefile)状态查询的API函数的功能、参数限制、使用规则要进一步了解。相关基础知识Windows中的虚拟存储技术(分页)Windows在实现虚拟存储技术的时候,利用页面文件(paging file)来实现物理内存的扩展。所谓
4、的页面文件就是Windows 2000XP在硬盘上分配的用来存储没有装入内存的程序和数据文件部分的磁盘文件。这个文件是一个名叫pagefilesys的系统隐藏文件,当系统安装时,会在安装系统盘的根目录下创建该文件,其默认值大于计算机中RAM的15倍需要时Windows2000XP将数据从页面文件移至内存,并将数据从内存移至页面文件以便为新数据释放空间。页面文件也称为交换文件。页面文件和物理内存或RAM构成“虚拟内存”。如果系统要求的内存量超过了虚拟内存的大小,则系统就会出现提示,发出虚拟内存不足的警告。我们可以根据需要设置虚拟内存的大小,方法是:右击“我的电脑”,依次选择“属性”-“高级”-“
5、性能选项”-“更改”;在这个设置功能下,我们还可以在其他分区或者磁盘下新增页面文件(默认情况下,非系统盘上没有设置页面文件),这样相应的磁盘根目录下也会出现一个系统隐藏文件Windows 2000XP在X86体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。一个32位虚拟地址被解释为三个独立的分量页目录索引、页表索引和字节索引它们用于找出描述页面映射结构的索引。页面大小及页表项的宽度决定了页目录和页表索引的宽度。地址变换过程核心进程核心进程页目录索引页目录索引页表索引页表索引字节索引字节索引CR3物理地址IndexPFNPDE页目录(每个进程建立一张,1024项)IndexPFNPTE
6、页表(每个进程最多有512个,系统空间最多占用512个,每张表1024项)Index物理地址空间要求的字节要 求 的页虚存页面的状态1 页面的种类 每一个进程的虚拟地址空间中的页面根据其所处状态可以分为三种:提交页面、保留页面和空闲页面。1 提交(Committed)页面提交页面是已分得物理存储的虚拟地址页面,通过设定该区域的属性可对它加以保护,例如设为“只读”。系统在第一次读写页面时进行初始化并将提交的页面装入物理内存;当进程结束时系统将释放提交页面的存储空间,当然也可以使用VirtualFree函数进行存储空间的释放。2 保留(Reserved)页面保留页面是逻辑页面已分配,但没有分配物理
7、存储页面。这样可以在进程中保留一部分虚拟地址,如果没有释放这些地址,则进程中进行的其他内存分配操作就不能使用该段虚拟地址空间。可以使用VirtualFree函数将提交页面转换为保留页面。3)空闲(Free)页面空闲页面是指那些可以保留或提交的可用页面,对当前的进程是不可存取的。可以使用系统函数VirtualFree将提交页面或保留页面转换为空闲页面。页面的操作针对上述几种虚拟内存页面所处的几种不同状态,可以对其进行不同的操作,这些操作包括:保留一个区域、提交一个区域、回收一个区域、释放一个区域和对一个虚拟内存区域加锁或解锁等。各操作的含义解释如下。保留:保留进程的虚拟地址空间,而不分配物理存储
8、空间。如果不预先释放这些地址,就不能被其他应 用程序(如Malloc,LocalAlloc等)的操作所使用。保留页面可被释放或提交。提交:在内存中为进程的虚拟地址分配物理存储空间(在内存中或磁盘上)。我们不但可以对空闲状态 或者处于保留状态的页面进行提交操作.可对它加以保护,不许访问或允许只读访问,或允许读写访问 回收:释放物理内存空间,但是虚拟地址空间仍然保留,它与提交相对应,即可以回收已经提交的内存块,有时又称为除配。释放:将物理存储和虚拟地址空间全部释放,它与保留相对应,即可以释放已经 保留的内存块。加锁:可以对已经提交的页面进行加锁操作,这样就使得这些页面常驻内存而不会产生通常的缺页现
9、象。可以是对已经加锁的页面进行的解锁操作。存储系统的统计指标系统中维护结构体MEMORYSTATUS,我们可以通过这个结构体来看系统的虚拟和物理内存的指标。参数说明 dwlength:指明本结构所占的空间大小,在使用适当的函数GlobalMemoryStatus从系统中获取这个结构的数据时,该系统函数会给这个域设置正确的值。dwMemoryload:物理存储使用负荷指数,使用一个百分数表示当前物理内存已经被占用的比率。在利用Win 32API查询得到的此结构中,这个比率只是精确到个位,而且是选择进一的原则,例如使用了782的物理内存,则显示占用79。dwTotalPhys:系统中安装的物理内存
10、总数,以Byte(字节)计数。dwAvailPhys:可用物理内存数,以Byte计数。dwTotalPagefile:页面文件总数,也就是系统在外存上为虚拟内存系统分配的页面文件(pagingfile)的总量,以Byte计数。dwAvailPagefile:可用页面文件数,以Byte计数。dwTotalVirtual:本进程中用户可以访问的虚存空间总数。注意目前32位Windows系统中,在总共4GB的空间中,高端的2GB是系统占用的,只有低端的2GB才是用户可以访问的。此处以Byte计数,也就是说在Windows2000XP该数字应该显示为2147352576。dwAvailVirtual:
11、在本进程中用户可以访问虚存空间中可用部分的数量,也就是还没有被程序分配的用户虚拟空间大小,以Byte计数。程序的结构1 Makefilecpp 本程序主要实现将操作写入文件,采用了C语言的fwrite函数直接以结构(struct)为单位写入文件。用了两层循环,外层循环控制对内存的操作(保留、提交、锁、解锁、回收、释放),内 层 循 环 控 制 对 内 存 操 作 的 权 限(PAGE_READONLY只 读、PAGE_READWRITE读写、PAGE_EXECUTE执行、PAGE_EXECUTE_READ执行和读、PAGE_EXECUTE_READWRITE执行和读写)用随机数生成等待执行的时
12、间和分配的粒度。2Memory-opcpp(1)主函数创建两个线程,并将返回的句柄存人数组中。创建两个信号量(allo,trac)分别用于通知跟踪线程和记录线程。用函数WaitForMultipleObjects来等待两个线程的结束。(2)Tracker线程(记录内存的状况)a)打开文件,准备输出。b)等待线程Allocator的一次内存操作完毕(即等待信号量trac的释放)。c)用函数Getsystemlnfo得到系统信息(该信息不随内存分配的变化而变化)。d)用函数GlobalMemoryStatus得到内存信息(随内存的分配各项信息会有所改变)。用函数VirtualQuery得到虚拟内存
13、基本信息(该信息不随内存分配的变化而变化)。e)释放信号量,通知Allocator线程可以进行下一次内存分配活动。f)如果已经记录了所有的内存分配信息,线程退出,否则转到b)。(3)Allocator线程(模拟内存分配活动)a)打开文件(makefilecpp的输出结果),准备读入。b)等待Tracker输出的结束(即等待信号量allo的释放)。c)读文件(makefilecpp的输出结果)。d)根据文件内容(protection)确定对内存操作时的权限。e)根据文件内容(oper)确定对内存的具体操作。f)释放信号量(trac)通知Tracker线程可以进行一次输出。g)如果文件中所有的分配
14、信息已经完成,线程退出,否则转到b)。相关API函数说明 1GetSystemlnfo函数功能:该函数返回当前系统的信息。该函数可以获得计算机系统中当前使用的物理内存和虚拟内存的信息。2GlobalMemoryStatus函数功能:用于获取程序存储空间的使用状况以及系统的使用概况。VOID MemoryStatus(LPMEMORYSTATUS lpBuffer);参数说明:这个参数 lpBuffer指向MEMORYSTATUS结构的一个指针,用于函数返回相关信息。3VirtualQuery(可不用)函数功能:该函数提供有关调用进程虚拟空间中的页面信息。查询一个进程的虚拟内存。给定一个进程的地
15、址空进为2GB,如果没有查询地址信息的能力,管理地址的全部范围将是困难的。查询就是要读取保存虚拟空间状态的数据结构。4virtualAlloc 函数功能:该函数保留或提交某一范围的虚拟地址。当在一个进程中保留一段虚拟地址时,并没有物理内存页被提交。而且,保留一个地址范围将不会保证将来有可用的物理内存来提交给这些地址。要使用保留地址,内存首先被提交给该地址,内存物理页被分配。5VirtualFree函数功能:解除已被提交的虚存或者释放被保留或者提交的进程虚拟地址空间。将保留或提交的地址页面恢复自由地址状态的方法。还可以对已提交的虚拟地址页解除提交,使得该段地址空间变成保留状态。解除提交时,相关物
16、理内存都会被释放。6VirtualLock 和VirtualUnLock函数功能:锁定和解锁虚拟内存页。一个进程可以分配一些页并将它锁定或者解锁,这样保证对他们使用不会出现缺页现象。解锁系统在必要时可以将这些页面换出到页面文件中。实验分析程序运行时,模拟线程进行各种虚存操作,这些活动导致了程序虚存空间和系统存储资源的变化。监控线程给出了监控到的这些活动和变化的信息。程序给出了整个内存系统的各个全局统计量,包括物理内存使用量和页面文件使用情况等。通过这些统计量的变化可以分析当前的虚存活动对存储系统带来的变化。在分析的过程中可以帮助学生理解一些重要的内容,比如程序在进行一次虚存提交过后,显示的可用
17、物理存储反而变多了,这是因为Windows的内存管理发现某个进程在一段时间没有运行后,会将它的部分页面转移到页面文件中去。所以虽然本实验程序的进程目前分配了一些内存,但是总的可用物理内存数量还是增多了。作为验证,可以检查一下此时可用页面文件的数量是否减少。运行结果分析1)保留一块区域的操作减少了dwAvailVirtual(在用户状态下虚拟地址空间中的未保留与末 提交的存储空间)。2)提交一块区域的操作只减少了dwAvailPageFile(页面文件中可用的字节数)。3)锁一块区域的操作只减少了dwAvailPhys(物理存储空间中可用的字节数)。4)解锁一块区域的操作有可能增dwAvailPhys。5)回收一块区域的操作只增加了dwAvailPageFile和dwAvailPhys。6)释放一块区域的操作只增加了dwavailvirtual虚拟内存的提交页面是由物理存储器支持的页面,它可以在内存中,也可以在页面文件中,所以结果中2和5改变了可用的物理页面和可用的页面文件。而保留页面相反,它完全不由物理存储体所支持,所以1和6改变了用户状态下虚拟地址空间。VirtualLock可用来在物理内存(RAM)中锁定一内存块,使系统不能将其交换到磁盘的页面文件上,故操作3和4中只有物理存储空间变化。
限制150内