操作系统实验指导书.docx
- 文档编号:18530859
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:22
- 大小:23.62KB
操作系统实验指导书.docx
《操作系统实验指导书.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书.docx(22页珍藏版)》请在冰点文库上搜索。
操作系统实验指导书
目录
实验一Windows2000进程观测1
实验二Windows2000进程控制3
实验三Windows2000线程同步6
实验四Windows2000线程间通信10
实验五Windows2000内存结构14
《操作系统实验指导书》
实验一Windows2000进程观测
一、实验目的:
通过对Windows2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows2000的结构。
二、实验环境:
PC机、Windows2000、VisualC++6.0专业版或企业版
三、实验描述:
对Windows2000进程,利用任务程序观测
四、实验要求:
1.认真阅读和掌握本实验的算法。
2.上机将本算法实现。
3.保存和打印出程序的运行结果,并结合程序进行分析。
五、实验步骤:
1.简单的控制台应用程序
我们先来创建一个名为“Hello,World”的应用程序。
步骤1:
登录进入Windows2000Professional。
步骤2:
在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将清单1-l中的程序键入记事本中,并把代码保存为Hello.cpp。
清单1-1一个简单的Windows2000控制台应用程序
//hello项目
#include
voidmain()
{
std:
:
cout<<“Hello,Windows2000”< : endl; } 步骤3: 在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,并利用简单的标准命令行: C: \>CLHello.cpp 来创建可执行的Hello.EXE。 步骤4: 运行Hello.EXE程序,产生用户键入的一行文字。 2.GUI应用程序 在下面的实验中,C++编译器创建一个GUI应用程序,代码中包括了WinMain()方法,这是GUI类型的应用程序的标准入口点。 步骤5: 在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将清单1-2中的程序键入记事本中,并把代码保存为1-2.cpp。 清单1-2Windows2000的GUI应用程序 //msgbox项目 #include //告诉连接器与包括MessageBoxAPI函数的user32库进行连接 #pragmacomment(lib,“user32.lib”) //这是一个可以弹出信息框然后退出的筒单的应用程序 intAPIENTRYWinMain(HINSTANCE/*hInstance*/, HINSTANCE/*hPrevInstance*/, LPSTR/*lpCmdLine*/, int/*nCmdShow*/) { : : MessageBox( NULL,//没有父窗口 “Hello,Windows2000”,//消息框中的文本 “Greetings”,//消息框标题 MB_OK);//其中只有一个OK按钮 //返回0以便通知系统不进入消息循环 return(0); } 步骤6: 在“命令提示符”窗口运行CL.EXE,产生1-2.EXE文件: C: \>CL1-2.cpp 在清单1-2的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain()和MessageBox()API函数的数据类型定义。 接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。 这样就可以运行简单的命令行命令CLMsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox()API函数就成为未定义的了。 这一指令是VisualStudioC++编译器特有的。 接下来是WinMain()方法。 其中有四个由实际的低级入口点传递来的参数。 hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle()API函数将这些资源提取出来。 系统利用实例句柄来指明代码和初始的数据装在内存的何处。 句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。 下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。 应用程序的命令行(不包括程序的名称)是lpCmdLine参数。 另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口(选项包括最小化、最大化和正常)。 最后,程序调用MessageBox()API函数并退出。 如果在进入消息循环之前就结束运行的话,最后必须返回0。 输出运行结果. 实验二Windows2000进程控制 一、实验目的: 1)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows2000进程的“一生”。 2)通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。 二、实验环境: PC机、Windows2000、VisualC++6.0专业版或企业版 三、实验描述: 对Windows2000进程,编程实现进程控制。 四、实验要求: 1.认真阅读和掌握本实验的算法。 2.上机将本算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析。 五、实验步骤: 1.创建进程 本实验显示了创建子进程的基本框架。 该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。 步骤1: 登录进入Windows2000Professional。 步骤2: 在“开始”菜单中单击“程序”-“MicrosoftVisualStudio6.0”–“MicrosoftVisualC++6.0”命令,进入VisualC++窗口。 步骤3: 在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序2-1.cpp。 清单2-1创建子进程 //proccreate项目 #include #include #include //创建传递过来的进程的克隆过程并赋于其ID值 voidStartClone(intnCloneID) { //提取用于当前可执行文件的文件名 TCHARszFilename[MAX_PATH]; : : GetModuleFileName(NULL,szFilename,MAX_PATH); //格式化用于子进程的命令行并通知其EXE文件名和克隆ID TCHARszCmdLine[MAX_PATH]; : : sprintf(szCmdLine,“\”%s\”%d”,szFilename,nCloneID); //用于子进程的STARTUPINFO结构 STARTUPINFOsi; : : ZeroMemory(reinterpret_cast si.cb=sizeof(si);//必须是本结构的大小 //返回的用于子进程的进程信息 PROCESS_INFORMATIONpi; //利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质 BOOLbCreateOK=: : CreateProcess( szFilename,//产生这个EXE的应用程序的名称 szCmdLine,//告诉其行为像一个子进程的标志 NULL,//缺省的进程安全性 NULL,//缺省的线程安全性 FALSE,//不继承句柄 CREATE_NEW_CONSOLE,//使用新的控制台 NULL,//新的环境 NULL,//当前目录 &si,//启动信息 &pi);//返回的进程信息 //对子进程释放引用 if(bCreateOK) { : : CloseHandle(pi.hProcess); : : CloseHandle(pi.hThread); } } intmain(intargc,char*argv[]) { //确定进程在列表中的位置 intnClone(0); if(argc>1) { //从第二个参数中提取克隆ID : : sscanf(argv[1],“%d”,&nClone); } //显示进程位置 std: : cout<<“ProcessID: “<<: : GetCurrentProcessId() <<“,CloneID: “< < : endl; //检查是否有创建子进程的需要 constintc_nCloneMax=25; if(nClone { //发送新进程的命令行和克隆号 StartClone(++nClone); } //在终止之前暂停一下(l/2秒) : : Sleep(500); return0; } 步骤4: 单击“Build”菜单中的“Compile2-1.cpp”命令,系统显示: Thisbuildcommandrequiresanactiveprojectworkspace.Wouldyouliketo createadefaultprojectworkspace? (build命令需要一个活动的项目工作空间。 你是否希望建立一个缺省的 项目工作空间? ) 单击“是”按钮确认。 系统对2-1.cpp进行编译。 步骤5: 编译完成后,单击“Build”菜单中的“Build2-1.exe”命令,建立2-1.exe可执行文件,查看结果。 实验三Windows2000线程同步 一、实验目的: 在本实验中,通过对事件和互斥体对象的了解,来加深对Windows2000线程同步的理解。 1)回顾系统进程、线程的有关概念,加深对Windows2000线程的理解。 2)了解事件和互斥体对象。 3)通过分析实验程序,了解管理事件对象的API。 4)了解在进程中如何使用事件对象。 5)了解在进程中如何使用互斥体对象。 6)了解父进程创建子进程的程序设计方法。 二、实验环境: PC机、Windows2000、VisualC++6.0专业版或企业版 三、实验描述: 对Windows2000进程,编程实现线程同步。 四、实验要求: 1.认真阅读和掌握本实验的算法。 2.上机将本算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析。 五、实验步骤: 1.事件对象 清单4-1程序展示了如何在进程间使用事件。 父进程启动时,利用CreateEvent()API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。 在创建时,子进程通过OpenEvent()API打开事件对象,调用SetEvent()API使其转化为已接受信号状态。 两个进程在发出信号之后几乎立即终止。 步骤1: 登录进入Windows2000Professional。 步骤2: 在“开始”菜单中单击“程序”-“MicrosoftVisualStudio6.0”–“MicrosoftVisualC++6.0”命令,进入VisualC++窗口。 步骤3: 在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-1.cpp。 清单3-1创建和打开事件对象在进程间传送信号 //event项目 #include #include //以下是句柄事件。 实际中很可能使用共享的包含文件来进行通讯 staticLPCTSTRg_szContinueEvent="w2kdg.EventDemo.event.Continue"; //本方法只是创建了一个进程的副本,以子进程模式(由命令行指定)工作 BOOLCreateChild() { //提取当前可执行文件的文件名 TCHARszFilename[MAX_PATH]; : : GetModuleFileName(NULL,szFilename,MAX_PATH); //格式化用于子进程的命令行,指明它是一个EXE文件和子进程 TCHARszCmdLine[MAX_PATH]; : : sprintf(szCmdLine,"\"%s\"child",szFilename); //子进程的启动信息结构 STARTUPINFOsi; : : ZeroMemory(reinterpret_cast si.cb=sizeof(si);//必须是本结构的大小 //返回的子进程的进程信息结构 PROCESS_INFORMATIONpi; //使用同一可执行文件和告诉它是一个子进程的命令行创建进程 BOOLbCreateOK=: : CreateProcess( szFilename,//生成的可执行文件名 szCmdLine,//指示其行为与子进程一样的标志 NULL,//子进程句柄的安全性 NULL,//子线程句柄的安全性 FALSE,//不继承句柄 0,//特殊的创建标志 NULL,//新环境 NULL,//当前目录 &si,//启动信息结构 &pi);//返回的进程信息结构 //释放对子进程的引用 if(bCreateOK) { : : CloseHandle(pi.hProcess); : : CloseHandle(pi.hThread); } return(bCreateOK); } //下面的方法创建一个事件和一个子进程,然后等待子进程在返回前向事件发出信号 voidWaitForChild() { //createaneweventobjectforthechildprocess //tousewhenreleasingthisprocess HANDLEhEventContinue=: : CreateEvent( NULL,//缺省的安全性,子进程将具有访问权限 TRUE,//手工重置事件 FALSE,//初始时是非接受信号状态 g_szContinueEvent);//事件名称 if(hEventContinue! =NULL) { std: : cout<<"eventcreated"< : endl; //创建子进程 if(: : CreateChild()) { std: : cout<<"chlidcreated"< : endl; //等待,直到子进程发出信号 std: : cout<<"Parentwaitingonchild."< : endl; : : WaitForSingleObject(hEventContinue,INFINITE); : : Sleep(1500);//删去这句试试 std: : cout<<"parentreceivedtheenventsignalingfromchild"< : endl; } //清除句柄 : : CloseHandle(hEventContinue); hEventContinue=INVALID_HANDLE_VALUE; } } //以下方法在子进程模式下被调用,其功能只是向父进程发出终止信号 voidSignalParent() { //尝试打开句柄 std: : cout<<"childprocessbegining......"< : endl; HANDLEhEventContinue=: : OpenEvent( EVENT_MODIFY_STATE,//所要求的最小访问权限 FALSE,//不是可继承的句柄 g_szContinueEvent);//事件名称 if(hEventContinue! =NULL) { : : SetEvent(hEventContinue); std: : cout<<"eventsignaled"< : endl; } //清除句柄 : : CloseHandle(hEventContinue); hEventContinue=INVALID_HANDLE_VALUE; } intmain(intargc,char*argv[]) { //检查父进程或是子进程是否启动 if(argc>1&&: : strcmp(argv[1],"child")==0) { //向父进程创建的事件发出信号 : : SignalParent(); } else { //创建一个事件并等待子进程发出信号 : : WaitForChild(); : : Sleep(1500); std: : cout<<"Parentreleased."< : endl; } return0; } 步骤4: 单击“Build”菜单中的“Compile3-1.cpp”命令,并单击“是”按钮确认。 系统对3-1.cpp进行编译。 步骤5: 编译完成后,单击“Build”菜单中的“Build3-1.exe”命令,建立3-1.exe可执行文件。 实验四Windows2000线程间通信 一、实验目的: 在本实验中,通过对文件和文件映射对象的了解,来加深对Windows2000线程同步的理解。 1)回顾系统进程、线程的有关概念,加深对Windows2000线程间通讯的理解; 2)了解文件和文件映射对象; 3)通过分析实验程序,了解线程如何通过文件对象发送数据; 4)了解在进程中如何使用文件对象; 5)通过分析实验程序,了解线程如何通过文件映射对象发送数据; 6)了解在进程中如何使用文件映射对象。 二、实验环境: PC机、Windows2000、VisualC++6.0专业版或企业版 三、实验描述: 对Windows2000进程,编程实现进程通信。 四、实验要求: 1.认真阅读和掌握本实验的算法。 2.上机将本算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析。 五、实验步骤: 1.文件对象 清单4-1中的代码展示了线程如何通过文件对象在永久存储介质上互相发送数据。 程序只是激活并启动了一个线程接着一个线程的创建进程。 每个线程从指定的文件中读取数据,数据的增加是以创建时发送给它的数量进行的,然后将新数值写回文件。 步骤1: 登录进入Windows2000Professional。 步骤2: 在“开始”菜单中单击“程序”-“MicrosoftVisualStudio6.0”–“MicrosoftVisualC++6.0”命令,进入VisualC++窗口。 步骤3: 在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序4-1.cpp。 清单4-1演示线程通过文件对象发送数据 //fileobj项目 #inc1ude #include //要使用的文件名 staticLPCTSTRg_szFileName=“w2kdg.Fileobj.file.data.txt”; //在数据文件中读取当前数据的简单线程时将传递来的该数据增加,并写回数据文件中 staticDWORDWINAPIThreadProc(LPVOIDlpParam) { //将参数翻译为长整数 LONGnAdd=reinterpret_cast //建立完全的指定文件名(包括路径信息) TCHARszFullName[MAX_PATH]; : : GetTempPath(MAX_PATH,szFullName);//取得路径 : : strcat(szFullName,g_szFileName); //打开文件对象 HANDLEhFile=: : CreateFile( szFullName,//文件的完全名称 GENERIC-READ|GENERIC_WRITE,//具有所有的访问权 FILE_SHARE_READ,//允许其他线程读取 NULL,//缺省的安全性 OPEN_ALWAYS,//创建或打开文件 FILE_ATTRIBUTE_NORMAL,//普通文件 NULL);//无模板文件 if(hFile! =INVALID_HANDLE_VALUE) { //读取当前数据 LONGnValue(0); DWORDdwXfer(0); : : ReadFile( hFile,//要读取的文件 reinterpret_cast sizeof(nValue),//缓冲区容量 &dwXfer,//读取的字节数 NULL);//无重叠I/O if(dwXfer==sizeof(nValue)) { //显示当前数据 std: : cout<<“read: ”< : endl; } //增加
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书