操作系统课设报告北京信息科技大学.docx
《操作系统课设报告北京信息科技大学.docx》由会员分享,可在线阅读,更多相关《操作系统课设报告北京信息科技大学.docx(13页珍藏版)》请在冰点文库上搜索。
操作系统课设报告北京信息科技大学
北京信息科技大学
操作系统课程设计报告
题目:
Windows内存管理与文件管理
学院:
专业:
学生姓名:
指导老师:
赵宇
起止时间:
一.课程设计任务
本次课程设计的任务包括以下内容:
1)将自选的一到两个函数封装为,并成功调用。
2)设计使用Malloc()函数和ViertualAlloc()函数分配内存的程序,查询分配内存和虚拟存储空间前后的情况。
3)设计从键盘上输入文本,并将所输入的文本采用无缓冲方式存入硬盘的程序。
4)设计将硬盘上的文本文件采用无缓冲方式读入内存的程序。
5)设计采用无缓冲方式将磁盘上一个文本文件另存为另一文件的程序。
选做:
1)将硬盘上两个文本文件合并为一个文件。
2)将无缓冲方式读文件操作和写文件操作分别封装成动态链接库,并成功调用。
二.课程设计
1.设计要求
(以下写实验教材中动态链接库、查询分配内存和虚拟存储空间前后的情况、文件读写的“实验内容”和“实验要求”,可补充内容)
1.掌握动态链接库的调用和方法。
在WindowsXP+MicrosoftVisualC++6.0环境下建立一个动态链接库,并分别用隐式和显式的方式将其调用,从而体会动态链接库的有点;
2.能正确使用系统函数GlobalMemeryStatus()和数据结构MEMERYSTATUS了解系统内存和虚拟内存空间的使用情况,会使用VirtualAlloc()函数和VirtualFree()函数分配和和释放存储空间;
3.采用无缓冲方式完成文件的读写;
2.工作原理
(以下写:
采用无缓冲方式实现文件读写的工作原理。
实验讲义上有。
可以补充自己的理解或体会)
首先,文件创建—函数CreatFile()用于创建一个新文件,如果文件已存在,则得到该文件的句柄。
该函数的参数dwFlagsAndAttribute决定了文件的传输方式,对于普通的文件传输,,可将参数设置为FILE_ATTRIBUTE_NORMAL;其次,进行读文件操作—函数READFile()从文件指针指示的位置开始读取文件的数据;再次,还有写文件操作—函数WriteFile()将数据写入文件。
函数在文件所指的位置完成写操作,写操作完成后。
、,文件指针按实际写入的字节数来调整;最后对文件操作完成后,利用函数CloseHandle()关闭与文件相关的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全进行。
3.程序流程设计
(如果完成了选做,实验的流程图,并给予必要的解释)
将硬盘上两个文本文件合并为一个文件
输入“Cmd”并回车打开命令提示符窗口,然后输入“D:
”回车切换到D盘,输入“CDtxt”这样回车后即可把当前目录变成D:
txt,再输入“copy/b1.txt+2.txt+3.txthebing.txt”,回车后即会在当前目录生成一个名为hebing.txt(的)文件,它里面(的)内容(就是)合并后(的)文件内容
流程图
将无缓冲方式读文件操作和写文件操作分别封装成动态链接库,并成功调用。
流程图
4.相关API函数
(以下写出课程设计中调用过的API函数,在调用时你所选择的参数是什么,你选择参数的考虑)
1.动态链接库入口函数
(1)DllMain()函数动态连接数据库的入口函数,当Windows加载动态链接库时调用该函数。
DllMain()函数不仅在将动态链接库加载到进程地址空间时被调用,在动态链接库与进程分离时也被调用。
(2)动态链接库导入导出函数
_declspec(dllexport)add(intx,inty);导出
_declspec(dllimport)sub(intx,inty);导入
(3)动态链接库的两种链接接方式
一.是应用程序的源代码只用动态链接库中包含的符号,当应用程序运行时,加载程序隐式地将动态链接库装入到进程的地址空间中,成为饮食链接;另一种方法是应用运行时使用LoadLibary()显式地加载所需要的动态链接库,并显式地链接需要的输出符号表。
2.
(1)获取系统物理内存和虚拟内存的使用信息
VOIDGlobalMemeryStatus(LAPMEMERYSTATUSlpBuffer);
MEMERYSTATUS存储内存当前的物理信息;
(2)保留或提交平某一段虚拟内存空间
函数VitualAllco()可以在调用进程的虚拟地址空间中保留或提交若干页面。
保留意味着这段虚拟地址不能被使用,当提交时,这段虚拟地址才能真正的被分配到该进程。
(3)释放或注销某一段虚拟地址空间
函数VitualFree()用于释放或注销某一段虚拟地址空间
3.
(1)文件创建
函数CreatFile()用于创建一个新文件,如果文件已存在,则得到该文件的句柄。
该函数的参数dwFlagsAndAttribute决定了文件的传输方式,对于普通的文件传输,,可将参数设置为FILE_ATTRIBUTE_NORMAL/
(2)读文件
函数READFile()从文件指针指示的位置开始读取文件的数据
(3)写文件
函数WriteFile()将数据写入文件。
函数在文件所指的位置完成写操作,写操作完成后。
、,文件指针按实际写入的字节数来调整。
(4)函数CloseHandle()关闭与文件相关的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全进行。
三.实验过程与结果
(以下写出本次试验使用的源程序代码和必要的注释)
(以下写出本次试验所调用的各个API函数的返回值)
(以下粘贴代码运行结果界面采集)
程序代码如下;
1.动态链接库的调用和方法
//t3.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"t3.h"
#pragmacomment(lib,"t1.lib")
#pragmacomment(lib,"t2.lib")
//告诉编译器与DLL相对应的.lib文件所在的路径及文件名。
//需要将编译SimpleDll工程所生成的.lib和.dll文件拷入本工程所在的路径。
extern"C"_declspec(dllimport)add(intx,inty);
extern"C"_declspec(dllimport)sub(intx,inty);
//声明SimpleDll.dll中的add(intx,inty)函数为本工程的导入函数。
voidmain()
{
intresult=add(112,3);
printf("112+3=%d\n",result);
intresult0=sub(112,3);
printf("112-3=%d\n",result0);
}
//t4.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"t4.h"
typedefint(*lpAddFun)(int,int);//宏定义函数指针类型
typedefint(*lpSubFun)(int,int);
voidmain()
{
HINSTANCEhDll;
HINSTANCEhDll0;//定义一个调用DLL的句柄
lpAddFunaddFun;//定义DLL中要调用的函数的指针
lpSubFunsubFun;
intresult,result0;//开辟一个临时变量
hDll=LoadLibrary("t1.dll");//显式载入SimpleDll.dll
addFun=(lpAddFun)GetProcAddress(hDll,"add");//获取SimpleDll.dll中add()函数的地址指针
result=addFun(212,33);
printf("%d\n",result);
FreeLibrary(hDll);
hDll0=LoadLibrary("t2.dll");
subFun=(lpSubFun)GetProcAddress(hDll0,"sub");//获取SimpleDll.dll中add()函数的地址指针
result0=subFun(212,33);
printf("%d\n",result0);
FreeLibrary(hDll0);
return;
}
2.系统内存和虚拟内存空间的使用情况
//a4.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"a4.h"
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
MEMORYSTATUSmm;
while(true)
{
GlobalMemoryStatus(&mm);
printf("%d\n\n",mm.dwMemoryLoad);
printf("%d\n\n",mm.dwTotalPhys/(1024*1024));
printf("%d\n\n",mm.dwAvailPhys/(1024*1024));
Sleep(1000);
}
returnnRetCode;
}
//a4.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"a4.h"
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;
MEMORYSTATUSmm;
while(true)
{
GlobalMemoryStatus(&mm);
printf("当前内存利用率:
%d%%\n\n",mm.dwMemoryLoad);
printf("物理内存的总字节数:
%d\n\n",mm.dwTotalPhys/(1024*1024));
printf("可用物理内存的字节数:
%d\n\n",mm.dwAvailPhys/(1024*1024));
printf("页文件的总字节数:
%d\n\n",mm.dwTotalPageFile/(1024*1024));
printf("页文件的可用字节数:
%d\n\n",mm.dwAvailPageFile/(1024*1024));
printf("用户模式下调用进程可以访问的虚拟空间总字节数:
%d\n\n",mm.dwTotalVirtual/(1024*1024));
printf("用户模式下调用进程可用虚拟空间的大小:
%d\n\n",mm.dwAvailVirtual/(1024*1024));
Sleep(3000);
}
returnnRetCode;
}
1.无缓冲方式完成文件的读
//1.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"1.h"
voidmain()
{
CHAR*pBuffer;
DWORDRSize;
intfileSize=0;
HANDLEhFile;
hFile=CreateFile(
"d:
\\a.txt",//filename
GENERIC_READ,//openforreading
0,//donotshare
NULL,//defaultsecurity
OPEN_EXISTING,//onlyopenanexistingfile
NULL,//normalfile
NULL//notemplate
);
fileSize=GetFileSize(hFile,NULL);
pBuffer=(CHAR*)malloc(fileSize);
ReadFile(hFile,pBuffer,fileSize,&RSize,NULL);
printf("%s",pBuffer);
free(pBuffer);
CloseHandle(hFile);
}
无缓冲方式完成文件的写
//2.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"2.h"
voidmain()
{
DWORDBytesToWrite;
DWORDszBuffer[4];
intfileSize=0;
HANDLEhFile;
charszText[]="asimpletextfortest";
hFile=CreateFile(
"d:
\\123.txt",//filename
GENERIC_WRITE,//openforwriting
0,//donotshare
NULL,//defaultsecurity
OPEN_ALWAYS,//iffilenotexist,createit
NULL,//normalfile
NULL//notemplate
);
BytesToWrite=lstrlen(szText);
WriteFile(hFile,szText,BytesToWrite,szBuffer,NULL);
CloseHandle(hFile);
}
四.课程设计总结
通过对动态链接库的的学习,基本上掌握了Windows系统链接库的建立方法,和使用显式和隐式两种方法来调用动态链接库,同时在实验中调用相关的API函数来查看系统物理内存和虚拟内存的有关使用情况和变化。
通过实验大体上了解了Windows内存管理机制及其数据结构。
了解了有关文件的读写操作的原理,明白了文件读写的相关API函数的的基本思想和应用。
这次实验仍有很多不足之处,但是在老师和同学的帮助下基本上全部攻克,希望在以后的实验里自己可以做的越来越好