实验指导.docx

上传人:b****5 文档编号:6691685 上传时间:2023-01-09 格式:DOCX 页数:11 大小:35.58KB
下载 相关 举报
实验指导.docx_第1页
第1页 / 共11页
实验指导.docx_第2页
第2页 / 共11页
实验指导.docx_第3页
第3页 / 共11页
实验指导.docx_第4页
第4页 / 共11页
实验指导.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验指导.docx

《实验指导.docx》由会员分享,可在线阅读,更多相关《实验指导.docx(11页珍藏版)》请在冰豆网上搜索。

实验指导.docx

实验指导

 

◎<实验一、进程间的通信>

◎<实验二、进程的调度>

◎<实验三、访问一个进程的内存空间>

◎<实验四、读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的安全机制。

 

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

当前位置:首页 > 医药卫生 > 基础医学

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

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