操作系统实验-第三讲-进程的创建

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统实验报告课程名称操作系统实验实验项目名称进程的创建学号班级20120616姓名专业计算机科学与技术学生所在学院计算机科学与技术学院指导教师初妍实验室名称地点21#428哈尔滨工程大学计算机科学与技术学院1一、实验概述1.实验名称进程的创建2.实验目的(1)练习使用EOSAPI函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。(2)调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位。3.实验类型验证型实验4.实验内容3.1准备实验3.2练习使用控制台命令创建EOS应用程序的进程3.3练习通过编程的方式让应用程序创建另一个应用程序的进程3.4调试CreateProcess函数3.5调试PsCreateProcess函数3.6练习通过编程的方式创建应用程序的多个进程二、实验环境操作系统windosxp编译器OSLab语言c语言三、实验过程1.设计思路创建10个进程时,可以使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。2.算法实现在创建10个进程的程序中,为了保证只有在10个进程都创建成功的情况下才执行后续操作,引入一个变量locked,只有10个程序都创建成功时locked=1,2出现创建失败的情况时locked=0,当locked=1时再执行后续操作。3.需要解决的问题及解答问题1:程序创建2个进程创建的情况下,实验指导P133-4的*NewProcess和6的*ProcessObject变化情况,监控变量界面截图。(答案见3.5)问题2:尝试根据之前对PsCreateProcess函数和PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。问题3:思考与练习,在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。要给出源代码及解释和运行界面截图。(代码见“源程序并附上注释”部分)34.源程序并附上注释使用hello.exe同时创建10个进程,代码如下:#includeEOSApp.hintmain(intargc,char*argv[]){STARTUPINFOStartupInfo;PROCESS_INFORMATIONjincheng[10];ULONGulExitCode;//子进程退出码INTnResult=0;//main函数返回值。0表示成功,非0表示失败。#ifdef_DEBUG__asm(int$3\nnop);#endifprintf(Createtwoprocessesandwaitfortheprocessesexit...\n\n);//使子进程和父进程使用相同的标准句柄。StartupInfo.StdInput=GetStdHandle(STD_INPUT_HANDLE);StartupInfo.StdOutput=GetStdHandle(STD_OUTPUT_HANDLE);StartupInfo.StdError=GetStdHandle(STD_ERROR_HANDLE);4inti,j,k,l,m,n;intlocked=1;for(j=0;j10;j++){//同时创建10个进程if(CreateProcess(A:\\Hello.exe,NULL,0,&StartupInfo,&jincheng[j]));//创建成功什么都不执行else//创建失败,输出失败信息{printf(CreateProcessFailed,Errorcode:0x%X.\n,GetLastError());nResult=1;locked=0;//locked为o,则说明10个进程中有失败的,后续操作不再进行}}if(locked==1){//创建子进程成功,等待子进程运行结束。for(k=0;k10;k++){WaitForSingleObject(jincheng[k].ProcessHandle,INFINITE);}//得到并输出子进程的退出码。for(l=0;l10;l++){GetExitCodeProcess(jincheng[l].ProcessHandle,&ulExitCode);printf(\nTheprocess%dexitwith%d.\n,l+1,ulExitCode);}//关闭不再使用的句柄。for(m=0;m10;m++){CloseHandle(jincheng[m].ProcessHandle);CloseHandle(jincheng[m].ThreadHandle);}}//endifreturnnResult;}55.程序运行时的初值和运行结果3.1准备实验建立一个EOSKernel项目和EOS应用程序项目。3.2练习使用控制台命令创建EOS应用程序的进程将本实验文件夹中的Hello.exe文件拖动到FloppyImageEditor工具窗口的文件列表中释放,Hello.exe文件即被添加到软盘镜像文件中,按F5启动调试,在EOS的控制台中输入命令“A:\Hello.exe”后回车,结果如下图:3.3练习通过编程的方式让应用程序创建另一个应用程序的进程使用NewProc.c文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码,F5启动调试,激活虚拟机窗口查看应用程序输出的内容:63.4调试CreateProcess函数F5启动调试EOS应用程序,在main函数中调用CreateProcess函数的代码行(第57行)添加一个断点。按F5继续调试,在断点处中断。按F11调试进入CreateProcess函数。在“调试”菜单的“窗口”中选择“反汇编”,会在“反汇编”窗口中显示CreateProcess函数的指令对应的反汇编代码。“反汇编”窗口的左侧显示的是指令所在的虚拟地址。可以看到所有指令的虚拟地址都大于0x80000000,说明内核(kernel.dll)处于高2G的虚拟地址空间中,如图:设置main函数的调用堆栈帧为活动的。在“反汇编”窗口中查看main函数的指令所在的虚拟地址都是小于0x80000000,说明应用程序(eosapp.exe)处于低2G的虚拟地址空间中,如图:73.5调试PsCreateProcess函数在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行(create.c文件的第163行),并在此行添加一个断点。按F5继续调试,到此断点处中断。按F11调试进入PspCreateProcessEnvironment函数。在调用ObCreateObject函数的代码行(create.c文件的第418行)添加一个断点。按F5继续调试,到此断点处中断。按F10执行此函数后中断。将表达式*NewProcess添加到“监视”窗口中,继续一步步调试可以观察到进程控制块的成员变量的值的变化,如下图:接下来调试初始化进程控制块中各个成员变量的过程:当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意进程控制块中的成员变量的变化:83.6练习通过编程的方式创建应用程序的多个进程用NewTwoProc.c文件中的源代码替换EOS应用程序项目中EOSApp.c文件内的源代码,生成后启动调试,查看多个进程并发执行的结果。9四、实验体会实验过程中,在调试时添加监视对象时,因为少了*导致结果不正确,后请教同学后解决了,另外在动手实现10个进程创建的问题时,一开始没有头绪,后来和原创建2个进程的程序对比以及for循环提示,写出了程序,并和同学讨论后,修正了对进程创建失败时的操作。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功