操作系统实验第三讲进程的创建Word文档下载推荐.docx
- 文档编号:20556504
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:13
- 大小:446.42KB
操作系统实验第三讲进程的创建Word文档下载推荐.docx
《操作系统实验第三讲进程的创建Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统实验第三讲进程的创建Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
计算机科学
与技术学院
指导教师
初妍
实验室名称地点
21#428
哈尔滨工程大学
计算机科学与技术学院
一、实验概述
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,出现创建失败的情况时locked=0,当locked=1时再执行后续操作。
3.需要解决的问题及解答
问题1:
程序创建2个进程创建的情况下,实验指导P133-4的*NewProcess和6的*ProcessObject变化情况,监控变量界面截图。
(答案见3.5)
问题2:
尝试根据之前对PsCreateProcess函数和PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。
问题3:
思考与练习,在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。
要给出源代码及解释和运行界面截图。
(代码见“源程序并附上注释”部分)
4.源程序并附上注释
使用hello.exe同时创建10个进程,代码如下:
#include"
EOSApp.h"
intmain(intargc,char*argv[])
{
STARTUPINFOStartupInfo;
PROCESS_INFORMATIONjincheng[10];
ULONGulExitCode;
//子进程退出码
INTnResult=0;
//main函数返回值。
0表示成功,非0表示失败。
#ifdef_DEBUG
__asm("
int$3\nnop"
);
#endif
printf("
Createtwoprocessesandwaitfortheprocessesexit...\n\n"
//使子进程和父进程使用相同的标准句柄。
StartupInfo.StdInput=GetStdHandle(STD_INPUT_HANDLE);
StartupInfo.StdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
StartupInfo.StdError=GetStdHandle(STD_ERROR_HANDLE);
inti,j,k,l,m,n;
intlocked=1;
for(j=0;
j<
10;
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;
k<
k++)
{
WaitForSingleObject(jincheng[k].ProcessHandle,INFINITE);
//得到并输出子进程的退出码。
for(l=0;
l<
l++){
GetExitCodeProcess(jincheng[l].ProcessHandle,&
ulExitCode);
printf("
\nTheprocess%dexitwith%d.\n"
l+1,ulExitCode);
}
//关闭不再使用的句柄。
for(m=0;
m<
m++)
CloseHandle(jincheng[m].ProcessHandle);
CloseHandle(jincheng[m].ThreadHandle);
}//endif
returnnResult;
}
5.程序运行时的初值和运行结果
3.1准备实验
建立一个EOSKernel项目和EOS应用程序项目。
将本实验文件夹中的Hello.exe文件拖动到FloppyImageEditor工具窗口的文件列表中释放,Hello.exe文件即被添加到软盘镜像文件中,按F5启动调试,在EOS的控制台中输入命令“A:
\Hello.exe”后回车,结果如下图:
使用NewProc.c文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码,F5启动调试,激活虚拟机窗口查看应用程序输出的内容:
F5启动调试EOS应用程序,在main函数中调用CreateProcess函数的代码行(第57行)添加一个断点。
按F5继续调试,在断点处中断。
按F11调试进入CreateProcess函数。
在“调试”菜单的“窗口”中选择“反汇编”,会在“反汇编”窗口中显示CreateProcess函数的指令对应的反汇编代码。
“反汇编”窗口的左侧显示的是指令所在的虚拟地址。
可以看到所有指令的虚拟地址都大于0x80000000,说明内核(kernel.dll)处于高2G的虚拟地址空间中,如图:
设置main函数的调用堆栈帧为活动的。
在“反汇编”窗口中查看main函数的指令所在的虚拟地址都是小于0x80000000,说明应用程序(eosapp.exe)处于低2G的虚拟地址空间中,如图:
在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行(create.c文件的第163行),并在此行添加一个断点。
按F5继续调试,到此断点处中断。
按F11调试进入PspCreateProcessEnvironment函数。
在调用ObCreateObject函数的代码行(create.c文件的第418行)添加一个断点。
按F5继续调试,到此断点处中断。
按F10执行此函数后中断。
将表达式*NewProcess添加到“监视”窗口中,继续一步步调试可以观察到进程控制块的成员变量的值的变化,如下图:
接下来调试初始化进程控制块中各个成员变量的过程:
当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。
此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。
接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意进程控制块中的成员变量的变化:
用NewTwoProc.c文件中的源代码替换EOS应用程序项目中EOSApp.c文件内的源代码,生成后启动调试,查看多个进程并发执行的结果。
四、实验体会
实验过程中,在调试时添加监视对象时,因为少了*导致结果不正确,后请教同学后解决了,另外在动手实现10个进程创建的问题时,一开始没有头绪,后来和原创建2个进程的程序对比以及for循环提示,写出了程序,并和同学讨论后,修正了对进程创建失败时的操作。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 第三 进程 创建