五、源程序(含注释)清单#includewindows.h#includestdio.h#includeprocess.h#includetime.hunsigned_stdcallsimulator(void*);unsigned_stdcallinspector(void*);LPVOIDBASE_PTR;intActnum=0;//主函数,主要是用于启动用于模拟虚存活动和进行监控的两个线程;intmain(intargc,char*argv[]){unsignedThreadID[2];_beginthreadex(NULL,0,simulator,NULL,0,&ThreadID[0]);_beginthreadex(NULL,0,inspector,NULL,0,&ThreadID[1]);getchar();//输入回车即可终止程序;return0;}//模拟一系列的虚存活动,作为一个独立的线程运行;unsigned_stdcallsimulator(void*){DWORDOldProtect;intrandnum;printf(Nowthesimulatorprocedurehasbeenstarted.\n);//产生一个随机数种子;srand((unsigned)time(NULL));//在一个死循环中,用随机数控制,不断进行虚存操作活动;while(1){Sleep(500);//控制整个模拟和监控的速度;while(Actnum!=0){Sleep(500);//等待,直到监控线程捕捉到上一个模拟动作后再继续下一个动作;}randnum=7&rand();switch(randnum)//注意各个动作中的虚存指针均使用BASE_PTR;它在过程中由虚存分配//函数动态调整,如果某动作不成功,则将不会被监控线程监控到;{case0:if(BASE_PTR=VirtualAlloc(NULL,1024*32,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE)){Actnum=1;//虚存的保留与提交;}break;case1:if(VirtualFree(BASE_PTR,1024*32,MEM_DECOMMIT)){Actnum=2;//虚存的注销;}break;case2:if(VirtualFree(BASE_PTR,0,MEM_RELEASE)){Actnum=3;//虚存的注销并释放虚存空间;}break;case3:if(VirtualProtect(BASE_PTR,1024*32,PAGE_READONLY,&OldProtect)){Actnum=4;//改变虚拟内存页的保护;}break;case4:if(VirtualLock(BASE_PTR,1024*12)){Actnum=5;//锁定虚拟内存页;}break;case5:if(BASE_PTR=VirtualAlloc(NULL,1024*32,MEM_RESERVE,PAGE_READWRITE)){Actnum=6;//虚存的保留;}break;default:break;}//endof'switch'}//endof'while'return0;}//通过一个全局的变量来监视另一模拟线程的模拟活动,并通过适当的信息//查询函数,将存储的使用和活动情况打出报告;unsigned_stdcallinspector(void*){intQuOut=0;charpara1[3000];MEMORYSTATUSVmeminfo;chartempstr[100];MEMORY_BASIC_INFORMATIONinspectorinfo1;intstructsize=sizeof(MEMORY_BASIC_INFORMATION);printf(Hi,nowinspectorbegintowork\n);//在一个死循环中不断通过一个全局变量(监视器),来监控模拟线程是否//有新的动作,如果有,通过的API函数将相应虚存处(通过共用BASE_PTR//实现)的信息进行检查,从而验证该动作对存储使用的影响;while(1){Sleep(1000);if(Actnum!=0){//通过全局变量(监视器)Actnum,来获取上一个虚存动作的类型//并相应构造监控信息的头部;switch(Actnum){case1:memset(&inspectorinfo1,0,structsize);VirtualQuery((LPVOID)BASE_PTR,&inspectorinfo1,structsize);strcpy(para1,目前执行动作:虚存的保留与提交\n);break;case2:memset(&inspectorinfo1,0,structsize);VirtualQuery((LPVOID)BASE_PTR,&inspectorinfo1,structsize);strcpy(para1,目前执行动作:虚存的除配\n);break;case3:memset(&inspectorinfo1,0,structsize);VirtualQuery((LPVOID)BASE_PTR,&inspectorinfo1,structsize);strcpy(para1,目前执行动作:虚存的除配并释放虚存空间\n);break;case4:memset(&inspectorinfo1,0,structsize);VirtualQuery((LPVOID)BASE_PTR,&inspectorinfo1,structsize);strcpy(para1,目前执行动作:改变虚拟内存页的保护\n);break;case5:memset(&inspectorinfo1,0,structsize);VirtualQuery((LPVOID)BASE_PTR,&inspectorinfo1,structsize);strcpy(para1,目前执行动作:锁定虚拟内存页\n);break;case6:memset(&inspectorinfo1,0,structsize);VirtualQuery((LPVOID)BASE_PTR,&inspectorinfo1,structsize);strcpy(para1,目前执行动作:虚存的保留\n);break;default:break;}//实时显示固定格式的相关材料;通过目前监控到的动作所发生//的虚存地址,监控该活动对相应存储空间的影响;sprintf(tempstr,开始地址:0X%x\n,inspectorinfo1.BaseAddress);strcat(para1,tempstr);sprintf(tempstr,区块大小(目前指针处向前同一属性的块):0X%x\n,inspectorinfo1.RegionSize);strcat(para1,tempstr);sprintf(tempstr,目前状态:0X%x\n,inspectorinfo1.State);strcat(para1,tempstr);sprintf(tempstr,分配时访问保护:0X%x\n,inspectorinfo1.AllocationProtect);strcat(para1,tempstr);sprintf(tempstr,当前访问保护:0X%x\n,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,物理存储使用负荷:%%%d\n\n\n\n,Vmeminfo.dwMemoryLoad);strcat(para1,tempstr);printf(%s,para1);//显示报告内容//(这里可以同时将报告内容记录进日志文件);Actnum=0;//通知模拟线程可以进行下一个模拟动作;Sleep(500);//调节模拟和监控的总体速度;}//forif}//forwhilereturn0;}六、测试结果以及实验总结问答题:1、如果调换分配、回收、内存复位、加锁、解锁、提交的顺序,会有什么变化,分析原因?答:会造成用户程序和非常驻的系统程序无法正常存储于存储器中,从而无法运行。程序在计算机内必须进入主存中才能正常运行,当其要装入主存时,首先要为安分配一个适合的存储空间。若调换上述操作的顺序,则不能有效的把程序存入主存中。且计算机内的存储空间都是有限的,只有进行了分配、回收、复位的操作后,存储空间才能被循环利用,系统才能不断的运行不同的程序,不能把操作的顺序调换。2、虚拟存储有什么优越性?答:(1)虚拟存储可以大大提高存储系统的整体访问带宽,这也是其对于视频网络系统来说最有价值的一个特点。视频网络的存储系统一般是由多个存储模块组成,而虚拟存储系统可以很好地进行负载平衡,把每一次数据访问所需要的带宽合理地分配到各个存储模块上,这样系统的整体访问带宽就增大了。例如,一个存储系统中有4个存储模块,每一个存储模块的访问带宽为50MB/s,则这个存储系统的总访问带宽就可以接近各存储模块带宽之和,即200MB/s。(2)虚拟存储提供了一个大容量存储系统的集中管理手段,由网络中的一个环节(如服务器)进行统一管理,避免了由于存储设备扩充而带来的管理方面的麻烦。例如,使用一般的存储系统,当在增加新的存储设备时,整个系统(包括网络中的诸多用户设备)都需要重新进行繁琐的配置工作,这样才可以使这个新成员加入到存储系统中。而使用虚拟存储技术,在增加新的存储设备时,只需要网络管理员对存储系统进行较为简单的系统配置更改,客户端无需任何操作、只是感到存储系统的容量增大了。(3)虚拟存储技术为存储资源管理提供了更好的灵活性。它可以将不同类型的存储设备集中管理使用,保障了用户以往购买存储设备的投资。(3)相关函数及其属性的含义。Beginthreadex函数功能:创建新线程函数原型:unsignedlong_beginthreadex返回值:0Sleep函数功能:对于指定的时间间隔挂起当前的执行线函数原型:VOIDSleep(DWORDdwMilliseconds)