操作系统课程设计内存管理.doc

上传人:b****3 文档编号:2537570 上传时间:2022-10-31 格式:DOC 页数:8 大小:47.50KB
下载 相关 举报
操作系统课程设计内存管理.doc_第1页
第1页 / 共8页
操作系统课程设计内存管理.doc_第2页
第2页 / 共8页
操作系统课程设计内存管理.doc_第3页
第3页 / 共8页
操作系统课程设计内存管理.doc_第4页
第4页 / 共8页
操作系统课程设计内存管理.doc_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

操作系统课程设计内存管理.doc

《操作系统课程设计内存管理.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计内存管理.doc(8页珍藏版)》请在冰豆网上搜索。

操作系统课程设计内存管理.doc

内存管理模拟

实验目标:

本实验的目的是从不同侧面了解Windows2000/XP对用户进程的虚拟内存空间的管理、分配方法。

同时需要了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)。

对Windows分配虚拟内存、改变内存状态,以及对物理内存(physicalmemory)和页面文件(pagefile)状态查询的API函数的功能、参数限制、使用规则要进一步了解。

默认情况下,32位Windows2000/XP上每个用户进程可以占有2GB的私有地址空间,操作系统占有剩下的2GB。

Windows2000/XP在X86体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。

一个32位虚拟地址被解释为三个独立的分量——页目录索引、页表索引和字节索引——它们用于找出描述页面映射结构的索引。

页面大小及页表项的宽度决定了页目录和页表索引的宽度。

实验要求:

使用Windows2000/XP的API函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号量实现同步。

模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括如下内容:

时间:

操作等待时间。

块数:

分配内存的粒度。

操作:

包括保留(reserve)一个区域、提交(commit)一个区域、释放(release)一个区域、回收(decommit)一个区域和加锁(lock)与解锁(unlock)一个区域,可以将这些操作编号存放于文件。

保留是指保留进程的虚拟地址空间,而不分配物理存储空间。

提交在内存中分配物理存储空间。

回收是指释放物理内存空间,但在虚拟地址空间仍然保留,它与提交相对应,即可以回收已经提交的内存块。

释放是指将物理存储和虚拟地址空间全部释放,它与保留(reserve)相对应,即可以释放已经保留的内存块。

大小:

块的大小。

访问权限:

共五种,分别为PAGE_READONLY,PAGE_READWRITE,PAGE_EXECUTE,PAGE_EXECUTE_READ和PAGEEXETUTE_READWRITE。

可以将这些权限编号存放于文件中跟踪线程将页面大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来。

三、主要内容

1.设计思路

Windows进程的虚拟地址空间中也有三种状态的页面:

空闲页面、保留页面和提交页面。

空闲(Free)页面:

空闲页面是指那些可以保留或提交的可用页面。

保留(Reserved)页面:

保留页面是逻辑页面已分配但没有分配物理存储的页面。

设置这种状态的效果是可以保留一部分虚拟地址,这样,如果不预先释放这些地址,就不能被其他应用程序(如Malloc,LocalAlloc等)的操作所使用。

试图读或写空闲页面或保留页面将导致页面出错异常。

保留页面可被释放或提交。

提交(Committed)页面:

提交页面是物理存储(在内存中或磁盘上)已被分配的页面。

可对它加以保护,不许访问或允许只读访问,或允许读写访问。

提交也可以被回收以释放存储空间,从而变成保留页面。

在本实验中,首先创建工程makefile生成随机输入文件,其中包含对内存要求作的各种操作;然后创建工程MemoryAllocation,实现输入文件所要求的各项内存管理操作。

2.主要数据结构

实现内存在管理的主要API函数有:

GetSystemInfo

函数功能:

返回当前系统信息,存放入lpSystemInfo中。

GlobalMemoryStatus

函数功能:

获得计算机系统中当前使用的物理内存和虚拟内存的信息。

使用GlobalMemoryStatus函数

可以判断应用程序能够分配多少与其它应用程序不冲突的内存空间。

但GlobalMemoryStatus函数返回的信息是不稳定的,我们不能保证两次调用该函数都能返回到相同的信息。

VirtualQuery

函数功能:

提供有关调用进程虚拟窨中的页面信息.

VirtualAlloc

函数功能:

在调用进程的虚拟地址中保留或提交页面。

除非设置了MEM_RESET标志,否则被这个函

数分配的内存单元被自动初始化为0。

VirtualAllocEX

函数功能:

使用该函数可以保留、提交或者保留和提交进程虚拟空间的页面的基址,否则返回NULL。

VirtualFree

函数功能:

可以释放或注销调用进程虚拟空间中的页面。

成功则返回一个非零值,否则返回零值。

VirtualFreeEx

函数功能:

该函数可以释放或注销指定进程虚拟空间中的页面。

VirtualFreeEx函数和VirtualFree函数区别是:

VirtualFree函数释放调用进程的地址空间,而VirtualFreeEx函数可以释放任意指定的进程的地址空间。

如果函数调用成功则返回非零值,否则返回零值。

VirtualLock

功能:

该函数可以将进程虚拟空间中的内存加锁。

以确保后面的对该区域的存取操作不会失败。

成功则返回一个非零值,否则返回一个零值。

VirtualUnlock

功能:

该函数可以将进程虚拟空间指定范围内的页面解锁,从以系统在必要时可以将这些页面换出

到页面文件中。

函数调用成功则返回一个非零值,否则返回零值。

3.主要代码段

首先,定义两个结构体structoperation和structtrace,分别记录对内存的操作信息和跟踪每一次分配活动,并为之分别定义信号量allo和rac,以实现对内存操作的互斥。

具体实现用函数WaitForSingleObject(trac,INFINITE)和ReleaseSemaphore(allo,1,NULL)来实现。

函数DWORDTracker(LPDWORDlpdwparm)用以跟踪allocator线程的内存行为,并输出必要信息。

函数voidAllocator()用以模拟内存分配活动的线程。

4.主要代码结构

1)makefile.cpp

//文件生成程序

#include

#include

#include

#include

structoperation

{

inttime;//起始时间

intblock;//内存页数

intoper;//操作

intprotection;//权限

};

intmain()

{

FILE*file;

file=fopen("opfile","wb");//"opfile"为二进制文件用以确定内存操作

operationop;

for(intj=0;j<6;j++)//0--保留,1--提交,2--锁,3--解锁,4--回收,5--释放

for(inti=0;i<5;i++)

//0-PAGE_READONLY;

//1-PAGE_READWRITE;

//2-PAGE_EXECUTE;

//3-PAGE_EXECUTE_READ;

//4-PAGE_EXECUTE_READWRITE;

{

op.time=rand()%1000;//随机生成等待时间

op.block=rand()%5+1;//随机生成块大小

op.oper=j;

op.protection=i;

fwrite(&op,sizeof(operation),1,file);//将生成的结构写入文件

}

return0;

}

2)memory_op.cpp

//从文件读入每次的操作,并将结果输出到out.txt文件中

#include

#include

#include

#include

#include

structoperation

{

inttime;//起始时间

intblock;//内存页数

intoper;//操作

intprotection;//权限

};

structtrace//跟踪每一次分配活动的数据结构

{

LPVOIDstart;//起始地址

longsize;//分配的大小

};

HANDLEallo,trac;//信号量句柄

DWORDTracker(LPDWORDlpdwparm)//跟踪allocator线程的内存行为,并输出必要信息

{ofstreamoutfile;//输出文件

outfile.open("out.txt");

for(inti=0;i<=30;i++)

{

WaitForSingleObject(trac,INFINITE);//等待allocator一次内存分配活动结束

//打印内存状况和系统状况

outfile<

//以下一段显示系统信息,每次执行操作后系统信息不变

SYSTEM_INFOinfo;//系统消息

GetSystemInfo(&info);

outfile<<"dwActiveProcessorMask"<<"\t"<

outfile<<"dwAllocationGranularity"<<"\t"<

outfile<<"dwNumberOfProcessors"<<"\t"<

outfile<<"dwOemId"<<"\t"<

outfile<<"dwPageSize"<<"\t"<

outfile<<"dwProcessorType"<<"\t"<

outfile<<"lpMaximumApplicationAddress"<<"\t"<

outfile<<"lpMinimumapplicationAddress"<<"\t"<

outfile<<"wProcessorArchitecture"<<"\t"<

outfile<<"wProcessorLevel"<<"\t"<

outfile<<"wProcessorRevision"<<"\t"<

outfile<<"wReserved"<<"\t"<

outfile<<"******************************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1