操作系统实验报告——存储管理.doc_第1页
操作系统实验报告——存储管理.doc_第2页
操作系统实验报告——存储管理.doc_第3页
操作系统实验报告——存储管理.doc_第4页
操作系统实验报告——存储管理.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

存储管理实验报告实验序号:02 实验项目名称:存储管理学号姓名专业、班实验地点指导教师时间一、实验目的1理解内存分配原理,特别是页式虚拟内存分配(4.4 请求分页存储管理)方法。2了解Windows 2000/XP的内存管理机制,掌握页式虚拟存储技术。3掌握Windows 2000/XP中内存管理基本API的使用方法。二、实验环境Windows 2000/XP+VC6.0三、实验内容1、在程序中,用一个线程模拟各种虚存活动,如虚存的保留、提交等。2、用一个监控线程实时监控系统当前的虚存操作,并在控制台输出虚存操作信息。要求监控线程与模拟虚存活动的线程保持同步,即模拟线程出现模拟活动,监控线程应立即监控到该活动的信息。3、在用监控线程监控内存活动的同时,汇报整个存储系统的使用情况。四、设计思路和流程框图1程序结构(1) main函数用_beginthreadex函数启动两个线程。(2) simulator线程(模拟内存分配)随机地进行各种虚存操作,包括虚存的保留与提交、虚存的注销、虚存的注销并释放虚存空间、改变虚拟内存页的保护、锁定虚拟内存页和虚存的保留。每个活动完成后,程序的全局变量Actnum被设置为一个特定的整数值。线程随即被阻塞直至Actnum被置回零。(3) inspector线程(跟踪内存分配活动)该线程通过Actnum的值获得上一个虚存动作的类型,并通过BASE_PTR的值获得该动作发生的虚存地址,并输出相关信息。最后,设置Actnum为零,通知模拟线程继续下一次动作,实现两线程的同步。程序的主线程派生上述两个主要线程后,就处于等待状态。用户此时可以观察模拟和监控线程的活动,也可以键入任意键结束程序的运行。2. 数据结构(1)指示器ActnumActnun初值为0。Actnun为0时,模拟线程处于活动状态,在一个随机数的控制下,模拟线程进行各种虚存活动。当一个模拟活动成功完成,模拟线程会设置指示器Actnum为一个非0的值并自动阻塞直到Actnun被置回为0。Actnun为非0时,监控线程处于活动状态,并通过Actnum的值确定动作的类型,并通过全局变量BASE_PTR获得该动作发生的虚存地址。监控线程完成对该动作的监控后,再设置Actnun为0,然后模拟线程再开始活动。(2) 地址指针BASE_PTR这个指针在进行虚存分配时用于记录返回的虚存的起始地址。它是由虚存分配函数VirtualAlloc来赋予虚存的起始地址的。五、源程序(含注释)清单#include #include #include #include unsigned _stdcall simulator(void *);unsigned _stdcall inspector(void *);LPVOID BASE_PTR;int Actnum=0;/主函数,主要是用于启动用于模拟虚存活动和进行监控的两个线程;int main(int argc, char* argv)unsigned ThreadID2;_beginthreadex(NULL,0,simulator,NULL,0,&ThreadID0);_beginthreadex(NULL,0,inspector,NULL,0,&ThreadID1);getchar();/输入回车即可终止程序;return 0;/模拟一系列的虚存活动,作为一个独立的线程运行;unsigned _stdcall simulator(void *) DWORD OldProtect; int randnum; printf(Now the simulator procedure has been started.n); /产生一个随机数种子; srand( (unsigned)time( NULL ) ); /在一个死循环中,用随机数控制,不断进行虚存操作活动; while(1) Sleep(500);/控制整个模拟和监控的速度; while (Actnum!=0) Sleep(500);/等待,直到监控线程捕捉到上一个模拟动作后再继续下一个动作; randnum=7&rand(); switch(randnum)/注意各个动作中的虚存指针均使用BASE_PTR;它在过程中由虚存分配 /函数动态调整,如果某动作不成功,则将不会被监控线程监控到; case 0: if (BASE_PTR=VirtualAlloc(NULL,1024*32,MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE) Actnum=1;/虚存的保留与提交; break; case 1: if (VirtualFree(BASE_PTR,1024*32,MEM_DECOMMIT) Actnum=2;/虚存的注销; break; case 2: if (VirtualFree(BASE_PTR,0,MEM_RELEASE) Actnum=3;/虚存的注销并释放虚存空间; break; case 3: if (VirtualProtect(BASE_PTR,1024*32,PAGE_READONLY,&OldProtect) Actnum=4;/改变虚拟内存页的保护; break; case 4: if (VirtualLock(BASE_PTR,1024*12) Actnum=5;/锁定虚拟内存页; break; case 5: if (BASE_PTR=VirtualAlloc(NULL,1024*32,MEM_RESERVE,PAGE_READWRITE) Actnum=6;/虚存的保留; break; default: break; /end of switch /end of while return 0;/通过一个全局的变量来监视另一模拟线程的模拟活动,并通过适当的信息/查询函数,将存储的使用和活动情况打出报告;unsigned _stdcall inspector(void *)int QuOut=0;char para13000;MEMORYSTATUS Vmeminfo;char tempstr100;MEMORY_BASIC_INFORMATION inspectorinfo1;int structsize = sizeof(MEMORY_BASIC_INFORMATION);printf(Hi , now inspector begin to workn);/在一个死循环中不断通过一个全局变量(监视器),来监控模拟线程是否/有新的动作,如果有,通过的API函数将相应虚存处(通过共用BASE_PTR/实现)的信息进行检查,从而验证该动作对存储使用的影响;while(1) Sleep(1000); if(Actnum!=0) /通过全局变量(监视器)Actnum,来获取上一个虚存动作的类型 /并相应构造监控信息的头部; switch(Actnum) case 1: memset (&inspectorinfo1, 0, structsize); VirtualQuery(LPVOID)BASE_PTR,&inspectorinfo1,structsize); strcpy(para1,目前执行动作:虚存的保留与提交n); break; case 2: memset (&inspectorinfo1, 0, structsize); VirtualQuery(LPVOID)BASE_PTR,&inspectorinfo1,structsize); strcpy(para1,目前执行动作:虚存的除配n); break; case 3: memset (&inspectorinfo1, 0, structsize); VirtualQuery(LPVOID)BASE_PTR,&inspectorinfo1,structsize); strcpy(para1,目前执行动作:虚存的除配并释放虚存空间n); break; case 4: memset (&inspectorinfo1, 0, structsize); VirtualQuery(LPVOID)BASE_PTR,&inspectorinfo1,structsize); strcpy(para1,目前执行动作:改变虚拟内存页的保护n); break; case 5: memset (&inspectorinfo1, 0, structsize); VirtualQuery(LPVOID)BASE_PTR,&inspectorinfo1,structsize); strcpy(para1,目前执行动作:锁定虚拟内存页n); break; case 6: memset (&inspectorinfo1, 0, structsize); VirtualQuery(LPVOID)BASE_PTR,&inspectorinfo1,structsize); strcpy(para1,目前执行动作:虚存的保留n); break; default: break; /实时显示固定格式的相关材料;通过目前监控到的动作所发生 /的虚存地址,监控该活动对相应存储空间的影响; sprintf(tempstr,开始地址:0X%xn,inspectorinfo1.BaseAddress); strcat(para1,tempstr); sprintf(tempstr,区块大小(目前指针处向前同一属性的块):0X%xn,inspectorinfo1.RegionSize); strcat(para1,tempstr); sprintf(tempstr,目前状态:0X%xn,inspectorinfo1.State); strcat(para1,tempstr); sprintf(tempstr,分配时访问保护:0X%xn,inspectorinfo1.AllocationProtect); strcat(para1,tempstr); sprintf(tempstr,当前访问保护:0X%xn,inspectorinfo1.Protect); strcat(para1,tempstr); strcat(para1,(状态:10000代表未分配 ;1000代表提交 ;2000代表保留; )n); strcat(para1,(保护方式:0代表其它;1代表禁止访问;2代表只读;4代表读写;n10代表可执); strcat(para1, 行;20代表可读和执行; 40代表可读写和执行;)n*n); /全局信息,报告目前系统和当前进程的存储使用总体情况; GlobalMemoryStatus(&Vmeminfo); strcat(para1,当前整体存储统计如下n); sprintf(tempstr,物理内存总数:%d(BYTES)n,Vmeminfo.dwTotalPhys); strcat(para1,tempstr); sprintf(tempstr,可用物理内存数:%d(BYTES)n,Vmeminfo.dwAvailPhys); strcat(para1,tempstr); sprintf(tempstr,页面文件总数:%d(BYTES)n,Vmeminfo.dwTotalPageFile); strcat(para1,tempstr); sprintf(tempstr,可用页面文件数:%d(BYTES)n,Vmeminfo.dwAvailPageFile); strcat(para1,tempstr); sprintf(tempstr,虚存空间总数:%d(BYTES)n,Vmeminfo.dwTotalVirtual); strcat(para1,tempstr); sprintf(tempstr,可用虚存空间数:%d(BYTES)n,Vmeminfo.dwAvailVirtual); strcat(para1,tempstr); sprintf(tempstr,物理存储使用负荷:%dnnnn,Vmeminfo.dwMemoryLoad); strcat(para1,tempstr); printf(%s,para1);/显示报告内容 /(这里可以同时将报告内容记录进日志文件); Actnum=0;/通知模拟线程可以进行下一个模拟动作; Sleep(500);/调节模拟和监控的总体速度; /for if /for whilereturn 0;六、测试结果以及实验总结问答题:1、如果调换分配、回收、内存复位、加锁、解锁、提交的顺序,会有什么变化,分析原因?答:会造成用户程序和非常驻的系统程序无法正常存储于存储器中,从而无法运行。程序在计算机内必须进入主存中才能正常运行,当其要装入主存时,首先要为安分配一个适合的存储空间。若调换上述操作的顺序,则不能有效的把程序存入主存中。且计算机内的存储空间都是有限的,只有进行了分配、回收、复位的操作后,存储空间才能被循环利用,系统才能不断的运行不同的程序,不能把操作的顺序调换。2、虚拟存储有什么优越性?答:(1)虚拟存储可以大大提高存储系统的整体访问带宽,这也是其对于视频网络系统来说最有价值的一个特点。视频网络的存储系统一般是由多个存储模块组成,而虚拟存储系统可以很好地进行负载平衡,把每一次数据访问所需要的带宽合理地分配到各个存储模块上,这样系统的整体访问带宽就增大了。例如,一个存储系统中有4个存储模块,每一个存储模块的访问带宽为50MB/s,则这个存储系统的总访问带宽就可以接近各存储模块带宽之和,即200MB/s。(2)虚拟存储提供了一个大容量存储系统的集中管理手段,由网络中的一个环节 (如服务器)进行统一管理,避免了由于存储设备扩充而带来的管理方面的麻烦。例如,使用一般的存储系统,当在增加新的存储设备时,整个系统(包括网络中的诸多用户设备)都需要重新进行繁琐的配置工作,这样才可以使这个新成员加入到存储系统中。而使用虚拟存储技术,在增加新的存储设备时,只需要网络管理员对存储系统进行较为简单的系统配置更改,客户端无需任何操作、只是感到存储系统的容量增大了。(3)虚拟存储技术为存储资源管理提供了更好的灵活性。它可以将不同类型的存储设备集中管理使用,保障了用户以往购买存储设备的投资。(3)相关函数及其属性的含义。Beginthreadex函数功能:创建新线程函数原型:unsigned long _beginthreadex返回值:0Sleep函数功能:对于指定的时间间隔挂起当前的执行线函数原型:VOID Sleep(DWORD dwMilliseconds); 返回值:无 VirtualAlloc函数功能:在调用进程的虚拟地址中保留、提交或保留且提交内存区域。 函数原型: LPVOID VirtualAlloc (LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD flProtect); 函数参数: lpAddress:待分配空间的起始地址。若指定的内存被保留,指定的地址将四舍五入到下一个64K边界;若指定的内存被保留且被提交,指定的地址将四舍五入到下一个页面边界。若为NULL,则由系统决定分配区域的地址。 dwSize:分配空间的大小(以字节为单位) 。flAllocationType:MEM_COMMIT 或MEM_RESERVE 或两者的组合flProtect:存取保护的类型(参考测试数据的说明部分) 。 返回值:调用成功则返回所分配页面的基址,否则返回NULL。VirtualFree函数功能:释放或注销调用进程虚拟空间中的页面。在本实验中通过指定 dw ype,对内存块进行释放(MEM_DECOMMIT)或者回收(MEM_RELEASE)的操作。 函数原型: BOOL VirtualFree (LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType);函数参数: lpAddress:待释放空间的起始地址。若 dwFreeType 参数中包含 MEM_RELE该页面被保留时,这个参数必须是通过VirtualAlloc函数返回的基址。 dwSize:释放空间的大小(以字节为单位) 。若 dwFreeType参数中包含 MEM志,该参数值必须为 0。 dwFreeType:释放类型,可以是 MEM_DECOMMIT 或 MEM_RELEASE。 返回值:调用成功则返回一个非零值,否则返回 0。VirtualProtect函数功能:改变虚拟内存页的保护方式HRESULT VirtualProtect ( in void* lpAddress, in SIZE_T dwSize, in DWORD flNewProtect, out DWORD* pflOldProtect);参数: lpAddress in 一个指针,指向要更保护属性的虚拟内存的基址。dwSize in 要更改的内存页面区域的大小(以字节为单位)。flNewProtect in 要应用的内存保护的类型。pflOldProtect out 一个指针,该指针指向前一个内存保护值。VirtualLock和VirtualUnlockVirtualLock函数功能:将调用进程虚拟空间中的内存加锁。 函数原型:BOOL Vi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论