内存管理实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验——内存管理
计算机 B 班 吴为丹 033511081 flAllocationType:MEM_COMMIT 或 MEM_RESERVE 或两者的组合。 flProtect:存取保护的类型(参考测试数据的说明部分)。 返回值:调用成功则返回所分配页面的基址,否则返回 NULL。 3) VirtualFree 函数功能:释放或注销调用进程虚拟空间中的页面。在本实验中通过指定 dwFreeType,对 内存块进行释放(MEM_DECOMMIT)或者回收(MEM_RELEASE)的操作。 函数原型:
z 实验改进
增加内存分配的类型,如 MEM_TOP_DOWN、MEM_RESET,增加保护级别的类型,如 PAGE_GUARD、PAGE_NOACCESS、PAGE_NOCACHE,运行结果正常,如上图所示。
进行统计,即内存分配操作与统计操作是一对一的关系; c) 使用临界区变量 enter 实现与函数 Allocate ()(用于内存分配)的互斥,保证在内存统
操作系统实验——内存管理
计算机 B 班 吴为丹 033511081 计期间系统不会改变内存布局; d) 调用函数 GlobalMemoryStatus(&MemoryStatus);获得当前系统内存信息,并显示当 前可用物理内存和虚拟内存; 自定义函数:void Statistic(),具体实现见原文件“memory.cpp”。
BOOL VirtualFree (LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType); 函数参数: lpAddress:待释放空间的起始地址。若 dwFreeType 参数中包含 MEM_RELEASE 标志,当 该页面被保留时,这个参数必须是通过 VirtualAlloc 函数返回的基址。 dwSize:释放空间的大小(以字节为单位)。若 dwFreeType 参数中包含 MEM_RELEASE 标 志,该参数值必须为 0。 dwFreeType:释放类型,可以是 MEM_DECOMMIT 或 MEM_RELEASE。 返回值:调用成功则返回一个非零值,否则返回 0。 4) VirtualLock 函数功能:将调用进程虚拟空间中的内存加锁。 函数原型:BOOL VirtualLock (LPVOID lpAddress, DWORD dwSize); 函数参数: lpAddress:加锁页面区域基址。 dwSize:加锁区域的大小(以字节为单位)。 返回值:调用成功则返回一个非零值,否则返回 0。 5) VirtualUnlock 函数功能:将调用进程虚拟空间中的内存解锁。 函数原型:BOOL VirtualUnlock (LPVOID lpAddress, DWORD dwSize); 函数参数: lpAddress:解锁页面区域基址。 dwSize:解锁区域的大小(以字节为单位)。 返回值:调用成功则返回一个非零值,否则返回 0。 6) CreateTread 函数功能:创建一个在调用进程的地址空间中执行的线程 函数原型:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); 返回值:成功则返回新线程的句柄,否则返回 NULL 7) Sleep 函数功能:对于指定的时间间隔挂起当前的执行线程 函数原型:VOID Sleep(DWORD dwMilliseconds); 返回值:无
运行结果显示要求:每次内存分配操作给出一组此次分配的相关信息,包括操作类型、权限类型、 分配的起始地址和大小等;每次内存分配操作之后给出一组关于系统和内存的当前状态的信息。
z 实验相关测试数据文件
测试数据有程序随机自动产生,每个测试数据单元描述一次内存分配操作,包括以下内容: ¾ 时间:操作等待时间,即等待相应时间后执行内存分配操作;要求随机产生。 ¾ 块数:操作的内存页数;要求随机产生。 ¾ 操作类型:可以是保留(reserve)、提交(commit)、释放(release)、回收(decommit)、加
操作系统实验——内存管理
计算机 B 班 吴为丹 033511081
z 实验内容
使用 Windows 2000/XP 的 API 函数,创建两个线程,一个用于模拟内存的分配活动,一个用于跟 踪并记录内存分配过程中的内存变化情况,要求这两个线程使用信号量进行同步。
每次内存分配按照相应的测试数据文件的要求进行操作。内存变化情况记录在一个输出文件(格 式和内容自定)中并同时在屏幕上打印。
锁(lock)、解锁(unlock)。 保留:在虚拟地址空间分配,不分配物理空间 提交:在物理地址空间分配 回收:释放物理空间,但保留虚拟空间 释放:释放物理空间和虚拟空间 加锁:常驻内存,即防止操作系统把对应的内存空间换出到外存 解锁:允许操作系统把对应的内存空间换出到外存 ¾ 权限保护:操作内存区域的访问权限,可以是 PAGE_READONLY、PAGE_READWRITE、 PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE。
2) VirtualAlloc 函数功能:在调用进程的虚拟地址中保留、提交或保留且提交内存区域。 函 数 原 型 : LPVOID VirtualAlloc (LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect); 函数参数: lpAddress:待分配空间的起始地址。若指定的内存被保留,指定的地址将四舍五入到下一个 64K 边界;若指定的内存被保留且被提交,指定的地址将四舍五入到下一个页面边界。若为 NULL,则由系统决定分配区域的地址。 dwSize:分配空间的大小(以字节为单位)。
// 2:释放(释放已分配内存,但仍然保留); // 3:回收(回收已分配或已保留内存);4:加锁;5:解锁 // 具体数值见数组 TYPE(main.cpp) int Protect; // 0:PAGE_READONLY;1:PAGE_READWRITE;2:PAGE_EXECUTE;
// 3:PAGE_EXECUTE_READ;4:PAGE_EXECUTE_READWRITE // 具体数值见数组 PRO(main.cpp) }; 2) 内存块 struct RESER{ //记录已保留内存 LPVOID lpvoid; DWORD size; }; struct COMMIT{ //记录已分配内存 LPVOID lpvoid; DWORD size; }; struct LOCK{ //记录已加锁内存 LPVOID lpvoid; DWORD size; }; 3. 相关 windows API 函数 1) GlobalMemoryStatus 函数功能:获得计算机系统中当前使用的物理内存和虚拟内存的信息 函数原型:VOID GlobalMemoryStatus (LPMEMORYSTATUS lpBuffer); 函数参数:lpBuffer 是指向 MEMORYSTATUS 结构的指针,_MEMORYSTATUS 结构用来存 储系统内存信息,具体内容见下文“相关数据结构”。 返回值:无(在结构变量中)
图 1 MEM_RESERVE
图 2 MEM源自文库COMMIT
图 3 MEM_RELEASE
操作系统实验——内存管理
计算机 B 班 吴为丹 033511081
图 4 LOCK
图 5 UNLOCK
图 6 MEM_RESET
图 7 MEM_TOP_DOWN 操作失败
d) 有以下几种情况时,操作没有进行,要求释放内存而没有已经分配的内存;要求回 收内存而没有已经保留或分配的内存;要求加锁而没有已经分配的内存;要求解锁而没 有已经加锁的内存。如图 3、图 4 和图 5 所示。
z 实现方案
1. 根据实验要求,本程序实现下面几个方面的功能: 1) 创建两个进程,分别用于分配内存和统计系统内存信息。 调用函数:CreateTread(),具体说明见下文“相关 windows API 函数”。 定时创建进程。 调用函数:Sleep(n),等待 n 毫秒后继续程序的运行。 结束主程序。 调用函数:WaitForMultipleObjects(),阻塞主进程执行,等待所有进程退出,具体说明见 下文“相关 windows API 函数”。 2) 随机生成测试数据,并控制数据合法性,如开始执行时间非负且递增、内存块大小必须 是正数。
自定义函数:void CreateTestData(),具体实现见原文件“memory.cpp”。 3) 统计当前系统内存信息。
a) 主流程使用 while()循环,只有所有测试数据都执行完才会退出; b) 使用信号量 x 与函数 Allocate ()(用于内存分配)同步,仅当有新的内存分配操作才
操作系统实验——内存管理
计算机 B 班 吴为丹 033511081
返回值:调用成功则返回引起函数返回的事件,否则返回 WAIT_FAILED。
z 运行结果分析
1. 实验运行能够出现预计的结果,当执行内存保留和分配操作时,虚拟内存会减少相应的大小, 执行释放和回收操作时,会增加相应的大小; 2. 物理内存的变化不受控制,估计是由于 windows 系统和其他应用程序的运行所致; 3. 程序按照预定在开始运行时进行内存信息统计,以后每执行一次内存操作统计一次,两个进 程的同步与互斥关系正常实现; 4. 通过函数返回结果检测内存操作是否正常执行,每次运行总会有少量的操作失败;
8) WaitForMultipleObjects 函数功能:当满足下列条件之一时返回:(1)任意一个或全部指定对象处于信号态;(2)超 时。 在本实验中用于结束主程序。 函数原型:DWORD WaitForMultipleObject(DWORD ncount, CONST HANDLE *lpHandles, BOOL fWaitAll, DWORD dwMilliseconds);
4) 根据测试数据要求进行内存操作,包括保留(只分配虚拟空间,不分配物理空间)、分 配(分配物理空间)、释放(回收虚拟空间,空闲状态)、回收(回收物理空间,保持保 留状态)、加锁(按照 MSDN 的说明,只针对已分配了物理空间的内存块)和解锁。 a) 信号量 x 和临界区变量 enter 的使用和函数 Statistic()相似,每进行一次内存操作, 执行 ReleaseSemaphore(x,1,NULL),向信号量发送消息,允许统计进程 Statistic 进行统 计操作; b) 主流程同样使用 while 循环结构,从文件 1.dat 接受数据进行操作,将提示信息和结 果输出到文件 2.dat 和屏幕; c) 采用 switch 结构,分别进行五种操作,运行结果举例如下。
图5
操作系统实验——内存管理
计算机 B 班 吴为丹 033511081 自定义函数:Allocate(),,具体实现见原文件“memory.cpp”。 5) 输出内存块保护级别,运行结果见图 1。 自定义函数:PrintPro(int n),具体实现见原文件“memory.cpp”。 2. 主要数据结构 1) 测试数据 struct TestData{ int StartTime; int SizeOfMemory; // in size of page int type; // 0:保留(只分配虚拟内存);1:提交(分配物理内存);