第12章-内存管理实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第12章相关说明说明:(1)实验相关ppt内容选自《操作系统课程设计》的核心实验,本实验为内存管理实验,加强学生对内存分配的理解。(2)该实验中学生对windows操作系统api函数很陌生,缺乏对它们实践,以及对内存分配的原理认识不够,讲解时原理部分要重复讲解,督促学生多利用网络资源进一步加深对操作系统函数的理解,有遗力的同学可以学习Linux内核内存分配代码。第12章:内存管理实验提纲提纲实验目的了解WindowsXP/7及Linux内存管理机制。掌握页面虚拟存储技术。了解内存分配原理,特别是以页面为单位的虚拟内存分配方法。学会使用WindowsXP/7下内存管理的基本API函数。了解进程中内存分配与虚内存的区别;提纲实验内容运行vs,创建工程,并导入virtumem.cpp文件。再次编译,通过后直接在vs下运行,观察输出结果,确信六种虚存操作都出现过。看懂程序,要求另写一段小程序,获得当前系统的存储空间使用概况。编译、运行小程序,观察结果。打开memoryAlloc.cpp运行vs,直接编译memoryAlloc.cpp,创建了一个工程。编译、运行小程序,观察结果。实验内容小组任务根据实验课提供的Windows虚拟内存管理代码以及相关Linux内存管理知识在Linux系统下完成同样功能的程序。提纲实验算法堆和栈的区别?栈(stack)堆(heap)区别申请方式系统自动分配需要程序员向操作系统申请,并指明大小,在C语言中使用malloc函数来分配分配条件操作若栈的剩余空间大于申请空间,则系统为程序分配内存;否则提示栈溢出遍历链表(操作系统中用于记录空闲内存地址的链表),找到第一个空间大于申请空间的堆结点,将该结点从链表中删除,并将该节点对应的存储空间分配给程序。申请大小限制在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域,即栈顶的地址和栈的最大容量是系统预先规定好的;在Windows下,栈的大小是由编译器决定,通常为1M,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。堆是向高地址扩展的数据结构,系统通过链表结构来组织,因此是不连续的内存区域。遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,容量也比较大。申请效率系统自动分配,速度较快,程序员无法控制。由new分配内存,使用方便,但是速度较慢,且容易产生内存碎片实验算法Windows系统存储器管理相关知识页面文件以磁盘文件的形式来存储没有装入内存的程序和数据文件部分,文件名为pagefile.sys,默认安装在系统盘的根目录下,属性为系统隐藏文件。通过系统设置可以使页面文件位于非系统盘的根目录下。虚拟内存页面文件和物理内存共同构成“虚拟内存”,必要情况下,Windows操作系统可将数据从页面文件移至内存,或将数据从内存移至页面文件,以便为新数据释放内存空间。实验算法Windows系统存储器管理相关知识Windows的虚拟存储技术Windows采用分页存储方式,实现虚拟内存技术,利用页面文件在内存中的调入调出实现物理内存的扩展。虚拟内存的页面状态A.提交页面:已经分得物理存储的虚拟地址页面,通过设定该区域的属性可对它加以保护。B.保留页面:逻辑页面已分配,但尚未分配物理存储页面,即为某些进程保留的一部分虚拟地址。C.空闲页面:可以保留或提交的可用页面,对当前的进程是不可存取的。实验算法Windows系统存储器管理相关知识页面操作A.保留:保留进程的虚拟地址空间,而不分配物理存储空间。B.释放:全部释放物理存储和虚拟地址空间。C.提交:为进程的虚拟地址分配物理存储空间,可以对处于空闲、保留、提交状态的页面进行提交操作。D.回收:释放物理内存空间,保留虚拟地址空间。E.加锁:对已提交的页面进行加锁,使得页面常驻内存而不会产生缺页现象。F.解锁:对已加锁的页面进行解锁操作。实验算法Windows内存管理Windows内存管理程序采用VS编译器编译。程序最初执行时交没有给地址指针BASE_PTR赋初值,所以在前几次随机的虚存模拟活动中可能导致动作失败,但这不影响程序功能的实现。实验算法Windows系统API函数(1)GlobalMemoryStatus:获取存储系统的概况及程序存储空间的使用状况。voidGlobalMemoryStatus(LPMEMORYSTATUSlpBuffer)GlobalMemoryStatus是本实验重要的API函数,该函数无返回值,参数是一个指向名为MEMORYSTATUS的结构的指针。函数的返回信息会被存储在MEMORYSTATUS结构中。实验算法Windows系统API函数(2)VirtualQuery:查询一个进程的虚拟内存。DWORDVirtualQuery(LPCVOIDlpAddress,//指向查询页区域基地址的指针PMEMORY_BASIC_INFORMATIONlpBuffer,//查询信息返回到该缓冲区中SIZE_TdwLength//lpBuffer指向缓冲区的大小);实验算法Windows系统API函数(3)_beginthreadex:创建新线程执行指定的可执行模块。实验算法Windows系统API函数(4)VirtualAlloc:保留或提交某一范围的虚拟地址LPVOIDVirtualAlloc(LPVOIDlpAddress,//分配内存区域的地址SIZE_TdwSize,//要分配或者保留的区域的大小DWORDflAllocationType,//分配类型,页面状态(类型):MEM_COMMIT或MEM_RESERVEDWORDflProtect//页面属性,指定了被分配区域的访问保护方式);返回值:如果调用成功,返回分配的首地址;否则,返回NULL。可通过GetLastError函数来获取错误消息实验算法Windows系统API函数(5)VirtualFree:解除已被提交的或者释放被保留(或提交)的进程虚拟地址空间。BOOLVirtualFree(LPVOIDlpAddress,//要释放的页面区域的地址SIZE_TdwSize,//区域大小DWORDdwFreeType//类型);其中dwFreeTye参数的内容如下:MEM_DECOMMIT:取消VirtualAlloc提交的页;MEM_RELEASE:释放指定页,如果制定了这个类型而dwSize设置为0,否则函数会调用失败。返回值:如果调用成功,返回一个非0值;否则,返回0实验算法Windows系统API函数(6)VirtualProtect:改变虚拟内存页的保护方式(所操作的区块必须是由同一次分配动作保留或提交的区块)BOOLVirtualProtect(LPVOIDlpAddress,//目标地址起始位置SIZE_TdwSize,//要变更的记忆体分页区域的大小DWORDflNewProtect,//请求的保护方式PDWORDlpflOldProtect//输出参数,指向保护原保护属性值的DWORD变量,可以为NULL);返回值:返回BOOL值,表示是否成功,可以使用GetLastError函数获取错误代码。实验算法Windows系统API函数(7)VirtualLock:对虚拟内存页加锁以保证对它们的使用不会出现缺页现象。VirtualLock(LPVOIDlpAddress,SIZE_TdwSize);VirtualUnlock:对加锁的虚拟内存页解锁。VirtualUnlock(LPVOIDlpAddress,SIZE_TdwSize);实验算法相关数据结构1)相关数据结构:Actnum:指示器,通过它实现两个线程的同步和信息传递。初始化为0,模拟线程将0值改变为一个1~6的随机数,监视线程恢复它的初值0.BASE_PTR:地址指针,记录虚存分配操作时返回的虚存起始地址,程序初始执行时并没有赋初值,所以在开始几次随机的虚存模拟活动中可能导致动作失败。2)存储系统的统计指标:A系统虚拟和物理内存的指标实验算法相关数据结构3)内存状态:typedefstruct_MEMORYSTATUS{//mstDWORDdwLength;//sizeof(MEMORYSTATUS)DWORDdwMemoryLoad;//percentofmemoryinuseDWORDdwTotalPhys;//bytesofphysicalmemoryDWORDdwAvailPhys;//freephysicalmemorybytesDWORDdwTotalPageFile;//bytesofpagingfileDWORDdwAvailPageFile;//freebytesofpagingfileDWORDdwTotalVirtual;//userbytesofaddressspaceDWORDdwAvailVirtual;//freeuserbytes}MEMORYSTATUS,*LPMEMORYSTATUS;实验算法相关数据结构内存基本信息_MEM_MEMORY_BASIC_INFORMATION{PVOIDBaseAddress;PVOIDAllocationBase;DWORDAllocationProtect;//页面属性SIZE_TRegionSize;DWORDState;//页面状态DWORDProtect;//取值可能与AllocationProtect相同DWORDType;//内存块类型}MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;实验算法相关数据结构页面状态state:提交状态:MEM_COMMIT释放状态:MEM_FREE保留状态:MEM_RESERVE内存块类型的变量type:镜像:MEM_IMAGE映射:MEM_MAPPED私有:MEM_PRIVATE实验算法相关数据结构页面属性变量AllocationProtect六种取值:只读:PAGE_READONLY只读写:PAGE_READWRITE可执行:PAGE_EXECUTE可执行和读取:PAGE_EXECUTE_READ可执行读写:PAGE_EXECUTE_READWRITE不允许存储:PAGE_NOACCESS实验算法Linux虚拟内存管理图2-6-1虚拟内存的实现机制内存的分配和回收请求分页缓存和刷新交换机制地址映射12347685实验算法Linux虚拟内存管理请求分页:首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时,如果发现程序中要用的虚拟地址没有对应的物理地址,就发出请求分页要求①:如果有空闲的内存可供分配,就请求分配内存②,并把正在使用的物理页记录在页缓存中③,如果没有足够的内存分配,就调用交换机制,腾出一部分内存④⑤。另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页⑧,交换机制中要用到交换缓存⑥,并且把物理页内容交换到交换文件中也要修改页表来映射文件地址⑦。提纲实验示例实验示例实验示例实验示例实验示例

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功