计算机操作系统_第1页
计算机操作系统_第2页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机操作系统(课程设计)年级专业05级计算机2班学生姓名XXX学号时间:2008-5-231课程设计意义32课程设计内容33课程设计目的34设计详细要求45课程设计说明46课程设计源代码107运行结果及分析198设计总结和体会20209参考文献一 课程设计的意义:通过模拟操作系统的实现,加深对操作系统工作原理理解,提高综合运用所学知识的能力;进一步了解操作系统的实现方法;培养我们自主查阅参考资料的习惯,增强独立思考和解决问题的能力;并可练习提高自己程序设计能力并可通过课程设计,培养严谨的科学态度。通过本课程设计,使学生对操作系统的核心概念和算法有一个透彻的理解,并对系统运行的机制有一个全面的

2、掌握,从而充分理解系统调用与程序设计之间的关系。二 课程设计内容:1. 课程设计题目:模拟内存管理2. 内容要求:自定义内存管理策略对应的数据结构;随机产生一组申请和收回进程及要求分配和收回内存的大小,实现内存分配和收回算法(可以采用多种分配算法),计算内存利用率;显示内存分区管理的分配和收回过程。三 课程设计目的1. 从不同侧面了解WindowsXP对用户进程的虚拟内存空间的管理、分配方法。2. 了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)。对Windows分配虚拟内存、改变内存状态,以及对物理内存(physicalmemory)和页面文件(pagefile

3、)状态查询的API函数的功能、参数限制、使用规则要进一步了解。3. 默认情况下,32位WindowsXP上每个用户进程可以占有2GB的私有地址空间,操作系统占有剩下的2GB。WindowsXP在X86体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。一个32位的虚拟地址被解释为三个独立的分量页目录索引,页表索引和字节索引它们用于找出描述页面映射结构的索引。页面大小及页表项的宽度决定了页目录和页表索引的宽度。4. Windows进程的虚拟地址空间中也有三种状态的页面:空闲页面、保留页面和提交页面。(1)空闲(Free)页面:空闲页面是指那些可以保留或提交的可用页面。(2)保留(Reser

4、ved页面:保留页面是逻辑页面已分配但没有分配物理存储的页面。设置这种状态的效果是可以保留一部分虚拟地址,这样,如果不预先释放这些地址,就不能被其他应用程序(如Malloc,LocalAlloc等)的操作所使用。试图读或写空闲页面或保留页面将导致页面出错异常。保留页面可被释放后提(3)提交(Committed)页面:提交页面是物理存储(在内存中或磁盘上)已被分配的页面。可对它加以保护,不许访问或允许只读访问,或允许读写访问。提交也可以被回收以释放存储空间,从而变成保留页面。四 设计详细要求使用windows2000/XP的API函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一

5、个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号量实现同步。模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括以下内容:时间:操作等待时间。块数:分配内存的粒度。操作:包括保留(reserve)一个区域,提交(commit)一个区域,释放(release一个区域,回收(decommit)一个区域和加锁(lock)与解锁(unlock)一个区域,可以将这些操作编号存放于文件。保留时之保留进程的虚拟地址空间,而不分配物理存储空间。提交在内存中分配物理存储空间。回收是指释放物理内存空间,但在虚拟地址空间仍然保留,它与提交相对应,即可以回收已经提交的内存块。释放是

6、指将物理存储和虚拟地址空间全部释放,它与保留相对应,即可以释放已经保留的内存块。大小:块的大小。访问权限:共五种。分别为PAGE_READONLY,PAGE_READWRITE,PAGE_EXECUTE,AGE_EXECUTE_READ和PAGE_EXETUTE_READWRITE。可以将这些权限编号存放于文件中跟踪线程将页面大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来。五 课程设计说明5-1模块组成:本程序主要由文件建立和文件写入模块一makefile和内存操作模块-memory-op两大模块组成。5-2模块的主要功能及结构:(1)文件建立和文件写入模块makefil

7、e模块的主要功能及结构如下:作用:本程序主要实现将操作写入文件结构:本程序采用了C语言的fwrite函数直接以结构(struct)为单位写入文件。用了两层循环,外层循环控制对内存的操作(保留、提交、锁、解锁、回收、释放),内层循环控制对内存操作的权限(PAGE_READON、LYPAGE_READWR、ITEPAGE_EXECUTEPAGE_EXECUTE_READAGE_EXECUTE_READW用随机数生成等待执行的时间和分配的粒度。内存操作模块memory-op模块的主要功能及结构如下:2.2.1主函数a、创建两个线程,并将返回的句柄存入数据中。b、创建两个信号量(allo,trac)分

8、别用语通知跟踪线程和记录线程。c、用函数WaitForMultipleObjects来等待两个线程的结束。2.2.2Tracker线程(记录内存的状况)a、打开文件,准备输出。b、等待现成Allocator的一次内存操作完毕(即等待信号量trac的释放)。c、用函数GetSystemInfo得到系统信息(该信息不随内存分配的变化而变化)。d、用函数GlobalMemorySatus得到内存信息(随内存的分配各项信息会有所变化)。用函数VirtualQuery得到虚拟内存基本信息(该信息不随内存分配的变化而变化)。e、释放信号量,通知Allocator线程可以进行下一次内存分配活动。2.2.3A

9、llocator线程(模拟内存分配活动)a、打开文件(的输出结果),准备读入。b、等待Tracker输出的结束(即等待信号量allo的释放)。c、读文件(的输出结果)。d、根据文件内容(protection)确定对内存操作时的权限。e、根据文件内容(oper)确定对内存的具体操作。f、释放信号量(trac)通知线程可以进行一次输出。g、如果文件中所有的分配信息已经完成,线程退出,否则转到bo5-3程序流程图及分析:makefile函数:先创建一个文件“opfile”,用以确定内存操作信息,随后用两层循环实现对文件写入内存操作的具体信息和结构。memory_op函数:主函数main主要是生成两个

10、线程和两个信号量,最后用函数WaitForMultipleObjects来等待两个线程的结束,退出程序。用信号量trac个allo实现线程Tracker和Allocator的同步。Tracker线程主要用于跟踪内存分配情况并打印信息到文档中,所以Tracker中首先要创建一个输出文件,然后输出系统消息、内存状态等。Allocator线程用于内存分配及操作等。首先要从opfile文件中逐个读取信息,其次根据内容确定操作权限,用switch语句实现:0代表只读,1代表可读写,2代表可执行,3代表可执行可读,4代表可执行可读写。然后确定内存具体操作,用switch实现:0代表保留一个区域,用函数Vi

11、rutalAlloc实现;1代表提交一个区域,用函数VirtualAlloc实现;2代表锁一个区域,用函数VirtualLock实现;3代表解锁一个区域,用函数VirtualUnlock实现;4代表回收一个区域,用函数VirtualFree实现;5代表释放一个区域,用函数VirtualFree实现。makefile函数和memory_op主函数:memory_op:接下页:makefile函数:makefile函数:开始YTtracker函数:如下页:tracker函数:allocator函数:如下页allocator函数:六 课程设计主要源代码1makefile函数程序的代码及注释如下:程序

12、体:#include<fstream.h>#include<stdio.h>#include<stdlib.h>#include<time.h>structoperationinttime;/起始时间intblock;/内存页数intoper;/操作intprotection;/权限;intmain()FILE*file;file=fopen("opfile","wb");/"opfile"为二进制用以确定内存操作operationop;for(intj=0;j<6;j+)/0-保

13、留;1-提交;2-锁;3-解锁;4-回收;5-释放for(inti=0;i<5;i+)op.time=rand()%1000;/随机生成等待时间op.block=rand()%5+1;/随机生成块大小op.oper=j;tection=i;fwrite(&op,sizeof(operation),1,file);/将生成的结构写入文件return0;2memeroy_op函数程序的代码及注释如下:#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<ios

14、tream.h>#include<fstream.h>structoperationinttime;/起始时间intblock;/内存页数intoper;/操作intprotection;/权限;structtrace/跟踪每一次分配活动的数据结构LPVOIDstart;/起始地址longsize;/分配的大小;HANDLEallo,trac;/信号量句柄DWORDTracker(LPDWORDlpdwparm)ofstreamoutfile;/输出文件("");for(inti=0;i<=30;i+)WaitForSingleObject(trac

15、,INFINITE);等待allocator一次内存分配活动结束/打印所有内存状况和系统状况outfile<<i<<endl;/以下一段显示系统消息,每次执行操作后系统消息不变/如果要才查看系统消息,可以取消注释/*SYSTEM_INFOinfo;/系统消息GetSystemInfo(&info);outfile<<"dwActiveProcessorMask"<<'t'<<iveProcessorMask<<endl;outfile<<"dwAllocat

16、ionGranularity"<<'t'<<info.dwAllocationGranularity<<endl;outfile<<"dwNumberOfProcessors"<<'t'<<info.dwNumberOfProcessors<<endl;outfile<<"dwOemId"<<'t'<<Id<<endl;outfile<<"dwP

17、ageSize"<<'t'<<eSize<<endl;outfile<<"dwProcessorType"<<'t'<<cessorType<<endl;outfile<<"lpMaximumApplicationAddress"<<'t'<<info.lpMaximumApplicationAddress<<endl;outfile<<"lpM

18、inimumApplicationAddress"<<'t'<<info.lpMinimumApplicationAddress<<endl;outfile<<"wProcessorArchitecture"<<'t'<<essorArchitecture<<endl;outfile<<"wProcessorLevel"<<'t'<<essorLevel<<endl;

19、outfile<<"wProcessorRevision"<<'t'<<essorRevision<<endl;outfile<<"wReserved:"<<'t'<<rved<<endl;outfile<<"*"<<endl;*/内存状况MEMORYSTATUSstatus;/内存状态GlobalMemoryStatus(&status);outfile<<&qu

20、ot;dwAvailPageFile"<<'t'<<ilPageFile<<endl;outfile<<"dwAvailPhys"<<'t'<<ilPhys<<endl;outfile<<"dwAvailVirtual"<<'t'<<ilVirtual<<endl;outfile<<"dwLength"<<'t

21、9;<<gth<<endl;outfile<<"dwMemoryLoad"<<'t'<<oryLoad<<endl;outfile<<"dwTotalPageFile"<<'t'<<alPageFile<<endl;outfile<<"dwTotalPhy"<<'t'<<alPhys<<endl;outfile<&l

22、t;"dwTotalVirtual"<<'t'<<alVirtual<<endl;outfile<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&a

23、mp;&&&&&&&&&&&&&&&"<<endl;/以下一段显示内存基本信息,每次操作内存基本信息不变/如果要查看内存基本信息,可以取消注释/*MEMORY_BASIC_INFORMATIONmen;VirtualQuery(imumApplicationAddress,&men,sizeof(MEMORY_BASIC_INFORMATION);outfile<<"AllocationBase"<<&

24、#39;t'<<ationBase<<endl;outfile<<"AllocationProtect"<<'t'<<ationProtect<<endl;outfile<<"BaseAddress"<<'t'<<ddress<<endl;outfile<<"Protect"<<'t'<<ct<<endl;outf

25、ile<<"RegionSize"<<'t'<<nSize<<endl;outfile<<"State"<<'t'<<<<endl;outfile<<"Type"<<'t'<<<<endl;outfile<<""<<endl;*/释放信号量通知allocator可以进行下一次内存分配活动ReleaseS

26、emaphore(allo,1,NULL);return(0);voidAllocator()/模拟内存分配活动的线程tracetraceArray5;intindex=0;FILE*file;file=fopen("opfile","rb");/读入文件operationop;SYSTEM_INFOinfo;DWORDtemp;GetSystemInfo(&info);for(inti=0;i<30;i+)WaitForSingleObject(allo,INFINITE);/等待tracker打印结束的信号cout<<i&l

27、t;<":"fread(&op,sizeof(operation),1,file);消注释Sleep(op.time);/执行时间,如果想在指定时间执行可以取GetSystemInfo(&info);switch(tection)/根据文件内容确定权限case0:index=0;temp=PAGE_READONLY;break;case1:temp=PAGE_READWRITE;break;case2:temp=PAGE_EXECUTE;break;case3:temp=PAGE_EXECUTE_READ;break;case4:temp=

28、PAGE_EXECUTE_READWRITE;break;default:temp=PAGE_READONLY;switch(op.oper)case0:/保留一个区域cout<<"reservenow"<<endl;traceArrayindex.start=VirtualAlloc(NULL,op.block*eSize,MEM_RESERVE,PAGE_NOACCESS);traceArrayindex+.size=op.block*eSize;cout<<"startingaddress:"<<tr

29、aceArrayindex-1.start<<'/t'<<"size:"<<traceArrayindex-1.size<<endlJbreak;case1:/提交一个区域cout<<"commitnow"<<endl;traceArrayindex.start=VirtualAlloc(traceArrayindex.start,traceArrayindex.size,MEM_COMMIT,temp);index+;cout<<"starti

30、ngaddress:"<<traceArrayindex-1.start<<'/t'<<"size:"<<traceArrayindex-1.size<<endlJbreak;case2:/锁一个区域cout<<"locknow"<<endl;cout<<"startingaddress:"<<traceArrayindex.start<<'t'<<"s

31、ize:"<<traceArrayindex.size<<endl;if(!VirtualLock(traceArrayindex.start,traceArrayindex+.size)cout<<GetLastError()vvendl;/GetLastError()函数返回错误号break;case3:/解锁一个区域cout<<"unlocknow"<<endl;cout<<"startingaddress:"<<traceArrayindex.start

32、<<'t'<<"size:"<<traceArrayindex.size<<endl;if(!VirtualUnlock(traceArrayindex.start,traceArrayindex+.size)cout<<GetLastError()<<endl;break;case4:/回收一个区域cout<<"decommitnow"<<endl;cout<<"startingaddress:"<<

33、;traceArrayindex.start<<'t'<<"size:"<<traceArrayindex.size<<endl;if(!VirtualFree(traceArrayindex.start,traceArrayindex+.size,MEM_DECOMMIT)cout<<GetLastError()<<endl;break;case5:/释放一个区域cout<<"releasenow"<<endl;cout<<&qu

34、ot;startingaddress:"<<traceArrayindex.start<<'t'<<"size:"<<traceArrayindex.size<<endl;if(!VirtualFree(traceArrayindex+.start,0,MEM_RELEASE)cout<<GetLastError()<<endl;break;default:cout<<"error"<<endl;ReleaseSemaphore(trac,1,NULL);/释放信号量通知tracker可以打印信息intmain()DWORDdwThread;HANDLEhandle2;/生成两个线程handle0=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Tracker,NULL,0,&dwThread);handle1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Allocator,NULL,0,&dwThread);/生成两个信号量allo=CreateSemap

温馨提示

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

评论

0/150

提交评论