内存.docx
- 文档编号:8513769
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:25
- 大小:27.28KB
内存.docx
《内存.docx》由会员分享,可在线阅读,更多相关《内存.docx(25页珍藏版)》请在冰豆网上搜索。
内存
实验二内存管理
实验报告
一、实验内容
使用Windows2000/XP的API函数,创建两个线程,一个用于模拟内存的分配活动,一个用于跟踪并记录内存分配过程中的内存变化情况,要求这两个线程使用信号量进行同步。
每次内存分配按照相应的测试数据文件的要求进行操作。
内存变化情况记录在一个输出文件(格式和内容自定)中并同时在屏幕上打印。
每次内存分配操作给出一组此次分配的相关信息,包括操作类型、权限类型、分配的起始地址和大小等;每次内存分配操作之后给出一组关于系统和内存的当前状态的信息。
请在实验报告中对实验的运行结果进行分析。
二、实验设计
1、信号量的安排:
使用两个信号量S1,S2:
S1指示当前是否有新的操作进行;S2指示是否允许进行内存分配操作。
流程大致如下:
//threadofmemoryoperation;
functionmem_op()
{
turn=0;
while(turn P(S2); memoryoperation; V(S1); turn++; } } //threadofrecord; functionrecord() { turn=0; while(turn P(S1); record; V(S2); turn++; } } 2、测试数据文件的制作——make_input(void) (1)文件结构: 等待时间块大小(页面数)操作类型保护类型 如: 812COM_COMMITPAGE_READONLY等待8秒后,向物理及虚拟内存申请分配一个12个页面大小的,只读的空间。 等待时间及块大小都是整数,可以使用VC内嵌函数rand()函数随机产生。 关键在于如何安排操作的序列,及如何将操作和保护类型的参数顺利传送到对应API函数。 (2) ①分配内存共有6种操作,对应4种函数: 操作种类 所在函数 代码 别名 保留 VirtualAlloc(…) 0x2000 COM_COMMIT 提交 0x1000 COM_RESERVE 回收 VirtualFree(…) 0x4000 COM_DECOMMIT 释放 0x8000 COM_RELEASE 加锁 VirtualLock(…) 0(自定义) NULL 解锁 VirtualUnlock(…) 1(自定义) NULL ②VirtualAlloc(…)函数中有8种保护类型,本次实验只用到5种: PAGE_READONLY——0x02 PAGE_READWRITE——0x04 PAGE_EXECUTE——0x10 PAGE_EXECUTE_READ——0x20 PAGE_EXECUTE_READWRITE——0x40 ③从字符串到DWORD类型的转换: 在调用各个API函数时,分配类型及保护类型作为DWORD型的参数被传递,但如果在测试数据文件中直接使用这些参数的别名,程序从文件读入数据时,获得的是一个字符串,要获得对应的DWORD型代码,必须经过繁琐的比较,而且不能使用switch语句(字符串不被认同为常量表达式)。 如果每次调用API函数时都进行比较,将大大增加不必要的开销。 为避免此种情况,制作两个测试数据文件,它们表达的内容是一致的,但形式不同。 使用如下结构的两个数组: structTYPE{ char*name;//某个参数的别名; DWORDdata;//某个参数的代码(包括C++的DWORD型和自定的); }; 在命名为“mem_op.dat”的文件中,输出的是参数的别名,即字符串,这个文件供用户察看和较对; 真正被程序读入使用的是命名为“mem_op_r.dat”的文件,它输出的是参数的代码,即DWORD型或对应LOCK和UNLOCK操作的0/1。 在这样的设置下,进行内存分配时,就可以根据读入的第三个数据进行switch语句操作。 (3)随机函数rand()的应用: 要产生一个[1,len]范围内的随机数,使用rand()%len+1即可。 就像在第 (1)点中提到的一样,等待时间与块大小都是随机产生的,它们的上限len由用户决定。 TYPE类型的数组a_type[6]代表分配操作类型,同类型数组p_type[5]代表保护类型,其数组元素均是预先定义好的。 在安排操作序列时,令a=rand()%6,使a作为a_type数组下标,同理可产生p_type的数组下标。 这些随机产生的数组下标的序列,对应的即为本程序所采用的操作序列。 这样的随机序列,虽然不能保证每一个操作都被成功执行,但只要操作数足够大,它反映的情况还是比较真实的。 操作数由用户输入。 3、内存分配线程: (1)内存分配请求的数据结构: structREQ{ ints_time;//sleeptime; DWORDp_size;//blocksize; DWORDa_type;//allocationtype; DWORDp_type;//protectiontype; LPVOIDlpad;//firstaddress; DWORDl_page;//lockedblocksize; STATUSstate;//theblock’sstate: unused/reserved/committed LOCKl_state;//theblockislock/unlock; }; 前4个结构成员是输入文件中已经定义的,无须赘言,下面对其它几个成员进行说明: lpad: 分配的虚拟内存空间的首地址。 它由VirtualAlloc(…)函数返回,在VirtualFree(…),VirtualLock(…),VirtualUnlock(…)函数中都必须使用。 在本程序中,回收、释放、加锁、解锁操作是对操作序列中已分配的内存空间中第一个符合条件的执行,如果没有符合条件的,则操作失败。 l_page: 每次分配内存的操作如果成功的话,其内存范围是从lpad到lpad+page_size*p_size所在的页。 由于加锁操作的页面数是随机产生的,如果其页数小于p_size,在进行解锁操作时就不能使用p_size作为页数,否则会导致操作失败,为此,必须把被加锁的页面数记录下来。 倘若加锁要求的页数大于所有符合要求的内存空间的页数,认为这个操作不可执行,失败。 state: 这个成员可取的值为{unused,reserved,committed},STATUS是在全局范围内定义的枚举类型。 对每个已执行的内存分配请求检查这个成员,可以得知其是否能执行释放或回收操作。 l_state: 这个成员可取的值为{lock,unlock},LOCK是在全局范围内定义的枚举类型。 对每个已执行的内存分配请求检查这个成员,可以得知其是否能执行加锁或解锁操作。 (2)switch语句: //resultis‘BOOL’type;iis‘int’type switch(req[turn].a_type){ case0x1000: //commitpages; req[turn].lpad=VirtualAlloc(NULL,…);//NULLmeansitdecidedbysystem; if(req[turn].lpad! =NULL){…}//Output; else{…} break; case0x2000: //reservepages; //AlmostthesameasCommitpart; break; case0x4000: //decommitpages; i=0; while(result==0&&i //checkreq[i].state,seeifitsatisfied; //ifsatisfied result=VirtualFree(req[i].lpad,…);//decommitthefirstblocksatisfied; if(result! =0){…}//Output; i++; }//while if(result==0){…}//ifnoonesatisfy,APIfunctiondefinitelyfail; break; case0x8000: //releasepages; i=0; intpage=req[turn].p_size; while(page>0&&i //checkreq[i].state,seeifsatisfied; //ifsatisfied result=VirtualFree(req[i].lpad,0,…); if(result! =0){…,page-=req[i].p_size;} //ifreq[i].p_size //ifreq[i].p_size>=page,thefunctionhasreleasereq[i].p_sizepages; i++; } break; case0: //lockpages; i=0; while(reault==0&&i //checkreq[i].l_state,seeifsatisfied; //ifsatisfied result=VirtualLock(req[i].lpad,…); if(result! =0){…;req[i].l_page=req[turn].p_size}//Outputandrefresh; } if(result==0){…} break; case1: //unlockpages; i=0; while(result==0&&i //almostthesameastheLockpart; } break; default: //ErrorHints; } 4、追踪记录线程record() 使用GlobalMemmoryStatus函数,输出了dwMemoryLoad(显示使用的物理内存的百分比),dwTotalPhys-dwAvailPhys(显示使用的物理内存),dwAvailPage(显示没有被使用的本进程虚拟内存空间,即不包括reserved和commited的),均以bytes及pages形式显示。 三、实验数据与测试结果 1、“mem_op.dat”中的测试数据 4108MEM_COMMITPAGE_EXECUTE_READ 135MEM_LOCKPAGE_READONLY 2144MEM_UNLOCKPAGE_READONLY 1187MEM_RESERVEPAGE_READWRITE 099MEM_DECOMMITPAGE_READWRITE 112MEM_RELEASEPAGE_EXECUTE_READ 294MEM_DECOMMITPAGE_READWRITE 3183MEM_UNLOCKPAGE_READWRITE 118MEM_DECOMMITPAGE_EXECUTE 2187MEM_RESERVEPAGE_EXECUTE_READWRITE 33MEM_RELEASEPAGE_EXECUTE_READ 356MEM_DECOMMITPAGE_READWRITE 3212MEM_UNLOCKPAGE_EXECUTE_READWRITE 2245MEM_DECOMMITPAGE_EXECUTE_READWRITE 313MEM_RESERVEPAGE_EXECUTE_READ 2、“mem_op_r.dat”中的测试数据 //十六进制被转换成十进制; 4108409632 13502 214412 118781924 099163844 1123276832 294163844 318314 1181638416 2187819264 333276832 356163844 3212164 22451638464 313819232 3、“RESULT.dat”中的结果 ---SystemInformation--- PageandFrameSize: 4096bytes//页大小为4096字节,正常; TotalPhysicalMemory: 267890688bytes//即255.48MB,本机正常值; VirtualMemorytoCommit: 422055936bytes(103041pages) 0: //第一个申请 ---operation---//分配操作; Commit108pagesfrom0x00390000invirtualmemorybyExcute_Read.//成功; ---memoryimformation--- UsedPhysicalMemoryPercentage: 78% UsedPhysicalMemory: 210591744bytes(51414frames) FreeVirtualMemory: 2137411584bytes(521829pages) 1: ---operation---//第一个操作生成物理空 Lock35pagesfrom0x00390000invirtualmemory.//间符合要求,锁定35页; ---memoryimformation--- UsedPhysicalMemoryPercentage: 78% UsedPhysicalMemory: 210354176bytes(51356frames) FreeVirtualMemory: 2137411584bytes(521829pages)//加锁不影响可用虚存 2: ---operation--- //第二个操作使0x390000处的35个页处于加锁状态,本次操作要求解锁144个页,//只存在35个,故35个成功解锁 Unlock35pagesfrom0x00390000invirtualmemory. ---memoryimformation--- UsedPhysicalMemoryPercentage: 78% UsedPhysicalMemory: 209252352bytes(51087frames) FreeVirtualMemory: 2137411584bytes(521829pages)//解锁不影响可用虚存 3: ---operation---//保留187个页,系统选择Reserve187pagesfrom0x00740000invirtualmemorybyRead&Write.//地址; ---memoryimformation--- UsedPhysicalMemoryPercentage: 77% UsedPhysicalMemory: 208908288bytes(51003frames) //521829(上次可用虚页数)-187=52642(本次可用虚页数) FreeVirtualMemory: 2136645632bytes(521642pages) 4: ---operation---//第一个操作提交的空间 Decommit99pagesfrom0x00390000invirtualmemory.//符合条件,回收99页; ---memoryimformation--- UsedPhysicalMemoryPercentage: 77% UsedPhysicalMemory: 208764928bytes(50968frames) //执行回收操作后,所属空间回到reserved状态,所以可用虚存空间不会变化; FreeVirtualMemory: 2136645632bytes(521642pages) 5: ---operation--- //第一次分配的物理内存满足条件,本次操作请求释放12页,但由release操作的//特性决定其一次释放所有上一次在VirtualAlloc函数中申请的页,即108页; Release108pagesfrom0x00390000invirtualmemory. ---memoryimformation--- UsedPhysicalMemoryPercentage: 77% UsedPhysicalMemory: 208371712bytes(50872frames) //与上次比较,521642(上一次的可用虚页数)+108=521750(本次的可用虚页数) FreeVirtualMemory: 2137088000bytes(521750pages) 6: ---operation--- //第5轮操作(从0开始)把0x390000处的空间释放掉了,此时0x390000处已//处于free状态,满足decommit条件的是第3轮操作中分配的虚存空间Decommit94pagesfrom0x00740000invirtualmemory. ---memoryimformation--- UsedPhysicalMemoryPercentage: 77% UsedPhysicalMemory: 207368192bytes(50627frames) //回收94页后,其仍处于reserved态,不影响可用虚页数; FreeVirtualMemory: 2137088000bytes(521750pages) 7: ---operation--- Failinunlockpagesinvirtualmemory.//没有处于加锁状态的页面; ---memoryimformation--- UsedPhysicalMemoryPercentage: 76% UsedPhysicalMemory: 206155776bytes(50331frames) FreeVirtualMemory: 2137088000bytes(521750pages) 8: ---operation---//原理同第6轮操作 Decommit18pagesfrom0x00740000invirtualmemory. ---memoryimformation--- UsedPhysicalMemoryPercentage: 76% UsedPhysicalMemory: 206155776bytes(50331frames) FreeVirtualMemory: 2137088000bytes(521750pages) 9: ---operation--- //从可用虚页中保留187页; Reserve187pagesfrom0x00800000invirtualmemorybyExcute_Read&Write. ---memoryimformation--- UsedPhysicalMemoryPercentage: 76% UsedPhysicalMemory: 206098432bytes(50317frames) //521750(上次虚页数)-187=521563(本次虚页数) FreeVirtualMemory: 2136322048bytes(521563pages) 10: ---operation--- //第一个符合条件的是第3轮操作中分配的虚存空间,本次要求释放3页,但由于//release的特性,第3轮操作中申请的所有页均被释放,处于free态。 Release187pagesfrom0x00740000invirtualmemory. ---memoryimformation--- UsedPhysicalMemoryPercentage: 76% UsedPhysicalMemory: 206086144bytes(50314frames) //521563(上次可用虚存页)+187=521750(本次可用虚页数) FreeVirtualMemory: 2137088000bytes(521750pages) 11: ---operation--- //第一个符合条件的是第9轮操作分配的虚存空间; Decommit56pagesfrom0x00800000invirtualmemory. ---memoryimformation--- UsedPhysicalMemoryPercentage: 76% UsedPhysicalMemory: 206110720bytes(50320frames) FreeVirtualMemory: 2137088000bytes(521750pages) 12: ---operation---//没有加锁页; Failinunlockpagesinvirtualmemory. ---memoryimformation--- UsedPhysicalMemoryPercentage: 77% UsedPhysicalMemory: 207785984bytes(50729frames) FreeVirtualMemory: 2137088000bytes(521750pages) 13: ---operation--- //本来满足条件的,在第9轮中申请的虚存空间,只有187页,本次请求回收245
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存
![提示](https://static.bdocx.com/images/bang_tan.gif)