实验指导.docx
《实验指导.docx》由会员分享,可在线阅读,更多相关《实验指导.docx(11页珍藏版)》请在冰豆网上搜索。
![实验指导.docx](https://file1.bdocx.com/fileroot1/2023-1/9/1d1314f3-c933-4dcb-8f6e-d6e058ab8d31/1d1314f3-c933-4dcb-8f6e-d6e058ab8d311.gif)
实验指导
◎<实验一、进程间的通信>
◎<实验二、进程的调度>
◎<实验三、访问一个进程的内存空间>
◎<实验四、读FAT32中的文件>
一、 实验环境
1、 实验环境一:
Windows平台
● 硬件平台:
普通PC机硬件环境;
● 操作系统:
Windows9x/2000/XP/ME
● 编译环境:
任意开发工具,如VC++,VB等;
2、 实验环境二:
JVM平台
● 硬件平台:
普通PC机硬件环境;
● 操作系统:
Windows9x/2000/XP/ME
● 编译环境:
JDK1.2以上或JBuilder6以上版本或其它JAVA环境;
3、 实验环境三:
Linux平台
● 硬件平台:
普通PC机硬件环境;
● 操作系统:
Linux环境,例如,红旗Linux或RedHatLinux;启动管理器使用lilo。
● 编译环境:
伴随着操作系统的默认gcc环境;
● 工作源码环境:
一个调试的内核源码,版本不低于2.4.9
二、实验报告总体要求
每次实验完成后两周内,必须提交实验报告。
实验报告至少要求包含以下内容:
✓ 1、引言:
概述本文所讨论的问题,工作步骤,结果,以及结果、发现的意义。
✓ 2、问题提出:
叙述本文要解决什么问题。
注意不可以抄写本实验报告中的表述,要用自己的话重新组织我们这里所提出的问题。
✓ 3、解决方案:
叙述如何解决自己上面提出的问题,可以用小标题3.1,3.2…等分开。
这是本文的关键部分,请尽量展开来写。
注意,这部分是本文的基本分的部分。
这部分不完成,本课程设计不会及格。
✓ 4、实验结果:
按照自己的解决方案,有哪些结果。
结果有异常吗?
能解释一下这些结果吗?
同别人的结果比较过吗?
注意,这部分是本文出彩的地方。
本课程设计要得高分,应该在这部分下功夫。
✓ 5、结束语:
小结并叙述本次课程设计的经验、教训、体会、难点、收获、为解决的问题、新的疑惑等。
✓ 附录:
加了注释的程序清单,注释行数目至少同源程序行数目比1:
2,即10行源程序,至少要给出5行注释。
实验一、进程间的通信
实验环境:
实验环境一:
Windows平台
实验时间:
6小时
实验目的:
初步了解windows环境下进程间通信的机制,了解消息通信和共享内存通信的原理,并利用win32API函数编写实例程序。
实验目标:
编制两个程序P1、P2。
当这程序P1运行后,它创建一个子进程P2(也就是在P1中调用P2),其中P1是父进程,P2由P1创建,是P1的子进程。
P1提供一个输入界面,读入用户输入的字符。
用户每输入一行字符,P1首先把这行字符存放到和P2共享的一个内存缓冲区中,然后通过消息通知P2(消息需要自己定义)。
P2则提供一个显示界面,在每接受到P1的一个消息后,首先从缓冲区中读入数据,然后进行显示,并发给P1一个消息,告诉P1数据已经处理完毕。
P1在接受到P2发送来的消息后,提示用户。
依次类推。
背景知识:
本实验需要用到的主要函数如下:
1.BOOLCreateProcess(
LPCTSTRlpApplicationName, //nameofexecutablemodule
LPTSTRlpCommandLine, //commandlinestring
LPSECURITY_ATTRIBUTESlpProcessAttributes,//SD
LPSECURITY_ATTRIBUTESlpThreadAttributes, //SD
BOOLbInheritHandles, //handleinheritanceoption
DWORDdwCreationFlags, //creationflags
LPVOIDlpEnvironment, //newenvironmentblock
LPCTSTRlpCurrentDirectory, //currentdirectoryname
LPSTARTUPINFOlpStartupInfo, //startupinformation
LPPROCESS_INFORMATIONlpProcessInformation//processinformation
);
2.HANDLECreateFileMapping(
HANDLEhFile, //handletofile
LPSECURITY_ATTRIBUTESlpAttributes,//security
DWORDflProtect, //protection
DWORDdwMaximumSizeHigh, //high-orderDWORDofsize
DWORDdwMaximumSizeLow, //low-orderDWORDofsize
LPCTSTRlpName //objectname
);
3.HANDLEOpenFileMapping(
DWORDdwDesiredAccess, //accessmode
BOOLbInheritHandle, //inheritflag
LPCTSTRlpName //objectname
);
4.BOOLFlushViewOfFile(
LPCVOIDlpBaseAddress, //startingaddress
SIZE_TdwNumberOfBytesToFlush //numberofbytesinrange
);
5.BOOLUnmapViewOfFile(
LPCVOIDlpBaseAddress //startingaddress
);
6.LRESULTSendMessage(
HWNDhWnd, //handletodestinationwindow
UINTMsg, //message
WPARAMwParam, //firstmessageparameter
LPARAMlParam //secondmessageparameter
);
7.BOOLGetMessage(
LPMSGlpMsg, //messageinformation
HWNDhWnd, //handletowindow
UINTwMsgFilterMin, //firstmessage
UINTwMsgFilterMax //lastmessage
);
实验步骤:
1、查看MSDN,寻找相关函数的说明,学习使用方法。
2、如何编写代码实现程序P1和P2?
实验报告:
实验二、进程的调度(模拟)
实验环境:
实验环境一:
Windows平台
实验时间:
4小时
实验目的:
初步了解进程的调度机制,掌握短作业优先算法、时间片轮转算法(RR)和优先数算法,并理解响应时间和周转时间的意义。
实验目标:
模拟短作业优先算法、时间片轮转算法(RR)和优先数算法的执行情况,并动态画出其进程执行的Grant图,计算以上算法的每个进程的响应时间和周转时间。
实验步骤:
1、需要模拟执行的进程序列如下:
进程名
到达时间
运行时间
优先数
P1
0
7
5
P2
1
1
1
P3
1
3
4
P4
2
5
3
P5
4
4
2
假设:
优先数越小优先级越高;所有进程都是纯CPU型进程。
请把上表的数据按照你自己设计的格式存为一个文本文件JOB1.TXT。
2、编写一个模拟程序,可以读入文本文件JOB1.TXT中描述的进程序列,然后模拟短作业优先算法、时间片轮转算法(RR)和优先数算法的执行情况,并动态画出其进程执行的Grant图,计算以上算法的每个进程的响应时间和周转时间。
3、读入文本文件JOB1.TXT中描述的进程序列,按照短作业优先算法执行程序。
4、按照时间片轮转算法执行程序时间片大小分布为1、2和3。
5、按照优先数算法执行程序。
实验结果:
实验步骤1:
文本文件的格式是:
实验步骤3的执行结果是:
实验步骤4的执行结果是:
实验步骤5的执行结果是:
思考题
1、根据实验步骤4的结果,谈谈时间片的大小对响应时间和周转时间的影响。
2、根据实验步骤3的结果,如果所有的进程不是纯CPU型进程,而是I/O型进程,那么调度会有什么不同?
实验报告:
实验三、访问一个进程的内存空间
实验环境:
实验环境一:
Windows98平台
实验时间:
4小时
实验目的:
初步了解win98环境下内存的使用情况,通过使用win32下API函数编写系统程序。
实验目标:
编制一个程序实现对系统中一个进程(kernel32.dll)的内存空间访问。
背景知识:
在WIN32中,每个应用程序都可“看见”4GB的线性地址空间,其中最开始的4MB和最后的2GB由操作系统保留,剩下不足2GB的空间用于应用程序私有空间。
具体分配如下:
0xFFFFFFFF-0xC0000000的1GB用于VxD、存储器管理和文件系统;
0xBFFFFFFF-0x80000000的1GB用于共享的WIN32DLL、存储器映射文件和共享存储区;
0x7FFFFFFF-0x00400000为每个进程的WIN32专用地址;
0x003FFFFF-0x00001000为MS-DOS和WIN16应用程序;
0x00000FFF-0x00000000为防止使用空指针的4,096字节。
以上都是指逻辑地址,也就是虚拟内存。
在WIN32中每页大小为4,096字节。
通过使用硬件地址映射和页表,WIN32可使虚拟内存即有好的性能而且还提供保护。
操作系统为每个进程提供独立的从逻辑地址到物理地址的映射,使每个进程的地址空间对另一个进程完全不可见。
WIN32中也提供了一些访问进程内存空间的函数,但使用时要谨慎,一不小心就有可能破坏被访问的进程。
ReadProcessMemory读另一个进程的内存,原形如下:
BOOLReadProcessMemory(
HANDLEhProcess, //被读取进程的句柄;
LPCVOIDlpBaseAddress, //读的起始地址;
LPVOIDlpBuffer, //存放读取数据缓冲区;
DWORDnSize, //一次读取的字节数;
LPDWORDlpNumberOfBytesRead//实际读取的字节数;
);
hProcess进程句柄可由OpenProcess函数得到,原形如下:
HANDLEOpenProcess(
DWORDdwDesiredAccess,//访问标志;
BOOLbInheritHandle, //继承标志;
DWORDdwProcessId //进程ID;
);
用完后使用CloseHandle关闭打开的句柄。
读另一个进程的内存dwDesiredAccess须指定为PROCESS_VM_READ,
写另一个进程的内存dwDesiredAccess须指定为PROCESS_VM_WRITE,
继承标志无所谓,进程ID可由Process32First和Process32Next得到,这两个函数可以枚举出所有开启的进程,这样进程的信息也就得到了。
Process32First和Process32Next是由TLHelp32单元提供的,需在uses里加上TLHelp32。
ToolsHelp32封装了一些访问堆、线程、进程等的函数,只适用于Win9x,原形如下:
BOOLWINAPIProcess32First(
HANDLEhSnapshot //由CreateToolhelp32Snapshot返回的系统快照句柄;
LPPROCESSENTRY32lppe//指向一个PROCESSENTRY32结构;
);
BOOLWINAPIProcess32Next(
HANDLEhSnapshot //由CreateToolhelp32Snapshot返回的系统快照句柄;
LPPROCESSENTRY32lppe//指向一个PROCESSENTRY32结构;
);
hSnapshot由CreateToolhelp32Snapshot返回的系统快照句柄;
CreateToolhelp32Snapshot原形如下:
HANDLEWINAPICreateToolhelp32Snapshot(
DWORDdwFlags, //快照标志;
DWORDth32ProcessID//进程ID;
);
现在需要的是进程的信息,所以将dwFlags指定为TH32CS_SNAPPROCESS,th32ProcessID忽略;PROCESSENTRY32结构如下:
typedefstructtagPROCESSENTRY32{
DWORDdwSize; //结构大小;
DWORDcntUsage; //此进程的引用计数;
DWORDth32ProcessID; //进程ID;
DWORDth32DefaultHeapID; //进程默认堆ID;
DWORDth32ModuleID; //进程模块ID;
DWORDcntThreads; //此进程开启的线程计数;
DWORDth32ParentProcessID;//父进程ID;
LONG pcPriClassBase; //线程优先权;
DWORDdwFlags; //保留;
charszExeFile[MAX_PATH];//进程全名;
}PROCESSENTRY32;
实验步骤:
3、 查看MSDN,寻找相关函数的说明,学习使用方法。
4、 编写函数实现读取“Kernel32.dll”进程所属的内存空间信息。
实验结果:
实验步骤2的实现过程是:
实验步骤2的输出内容是什么?
思考题:
1. 该实验中编制的程序只能用于win98环境,能否将之应用于win2000中,需要修改哪些函数?
2. 现在的实验只是实现了读一个进程的内存空间,对写一个进程的内存空间应注意哪些问题,如何修改该程序?
实验报告:
实验四、读FAT32中的文件
实验环境:
实验环境一:
Windows平台
实验时间:
4小时
实验目的:
了解FAT32文件系统的结构,了解主引导记录(MBR)、引导扇区、FAT表、FDT表的结构,并根据这个结构读取指定文件的内容。
通过实验理解文件的物理结构和逻辑结构的关系。
实验目标:
根据FAT32文件系统的结构,设计一个程序,不使用文件操作,列出C盘上某文本文件的内容。
背景知识:
INT13h扩展功能42h调用方法:
1、调用该功能之前需要填充下面的结构
structDISKADDPACKET{
charpacketsize; /*本结构的长度*/
charreserved; /*保留,这里必须为0*/
unsignedintblockcount; /*要读的扇区数*/
unsignedintbufferaddr[2];/*缓冲区偏移*/
unsignedlongblocknum[2];/*缓冲区段地址*/
};
2、调用示例
getabssect(intdrive,unsignedlongsectnohi,unsignedlongsectnolo,char*buf){
structDISKADDPACKETdiskaddpacket;
unionREGS inregs,outregs;
structSREGSsegregs;
segread(&segregs);
diskaddpacket.packetsize=16;
diskaddpacket.reserved=0;
diskaddpacket.blockcount=1;
diskaddpacket.bufferaddr[0]=(unsigned)FP_OFF(buf);
diskaddpacket.bufferaddr[1]=(unsigned)FP_SEG(buf);
diskaddpacket.blocknum[1]=sectnohi;
diskaddpacket.blocknum[0]=sectnolo;
inregs.h.ah=0x42; /*功能号*/
inregs.h.dl=drive; /*磁盘号*/
inregs.x.si=(unsigned)MK_FP(segregs.ds,&diskaddpacket);
int86x(0x13,&inregs,&outregs,&segregs);
}
实验步骤:
1、分析FAT32文件系统的结构,画出示意图。
2、编写程序,从标准输入获得要读取文件的位置和名称,读取文件内容,并显示之。
注意:
本实验仅限文本文件,不考虑其他格式的文件;本实验只考虑读取C盘上指定文件的内容,不考虑其他盘。
实验结果:
实验步骤1
FAT32文件系统结构示意
实验步骤2的流程是:
思考题
1、 通过对FAT32文件系统结构的分析和本次实验,考虑FAT32文件系统的安全机制有何弊端?
2、 尝试读取其他分区的文件内容。
3、 尝试对其他的文件系统,如NTFS上指定文件的读取,比较NTFS和FAT32的安全机制。