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

上传人:b****6 文档编号:7445237 上传时间:2023-01-24 格式:DOCX 页数:13 大小:446.42KB
下载 相关 举报
操作系统实验第三讲进程的创建.docx_第1页
第1页 / 共13页
操作系统实验第三讲进程的创建.docx_第2页
第2页 / 共13页
操作系统实验第三讲进程的创建.docx_第3页
第3页 / 共13页
操作系统实验第三讲进程的创建.docx_第4页
第4页 / 共13页
操作系统实验第三讲进程的创建.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

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

《操作系统实验第三讲进程的创建.docx》由会员分享,可在线阅读,更多相关《操作系统实验第三讲进程的创建.docx(13页珍藏版)》请在冰豆网上搜索。

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

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

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

操作系统

实验报告

课程名称

操作系统实验

实验项目名称

进程的创建

学号

班级

20120616

姓名

专业

计算机科学与技术

学生所在学院

计算机科学

与技术学院

指导教师

初妍

实验室名称地点

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<10;k++)

{

WaitForSingleObject(jincheng[k].ProcessHandle,INFINITE);

}

//得到并输出子进程的退出码。

for(l=0;l<10;l++){

GetExitCodeProcess(jincheng[l].ProcessHandle,&ulExitCode);

printf("\nTheprocess%dexitwith%d.\n",l+1,ulExitCode);

}

//关闭不再使用的句柄。

for(m=0;m<10;m++)

{

CloseHandle(jincheng[m].ProcessHandle);

CloseHandle(jincheng[m].ThreadHandle);

}

}//endif

returnnResult;

}

5.程序运行时的初值和运行结果

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启动调试,激活虚拟机窗口查看应用程序输出的内容:

3.4调试CreateProcess函数

F5启动调试EOS应用程序,在main函数中调用CreateProcess函数的代码行(第57行)添加一个断点。

按F5继续调试,在断点处中断。

按F11调试进入CreateProcess函数。

在“调试”菜单的“窗口”中选择“反汇编”,会在“反汇编”窗口中显示CreateProcess函数的指令对应的反汇编代码。

“反汇编”窗口的左侧显示的是指令所在的虚拟地址。

可以看到所有指令的虚拟地址都大于0x80000000,说明内核(kernel.dll)处于高2G的虚拟地址空间中,如图:

设置main函数的调用堆栈帧为活动的。

在“反汇编”窗口中查看main函数的指令所在的虚拟地址都是小于0x80000000,说明应用程序(eosapp.exe)处于低2G的虚拟地址空间中,如图:

3.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函数中的代码,同样要注意进程控制块中的成员变量的变化:

3.6练习通过编程的方式创建应用程序的多个进程

用NewTwoProc.c文件中的源代码替换EOS应用程序项目中EOSApp.c文件内的源代码,生成后启动调试,查看多个进程并发执行的结果。

四、实验体会

实验过程中,在调试时添加监视对象时,因为少了*导致结果不正确,后请教同学后解决了,另外在动手实现10个进程创建的问题时,一开始没有头绪,后来和原创建2个进程的程序对比以及for循环提示,写出了程序,并和同学讨论后,修正了对进程创建失败时的操作。

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

当前位置:首页 > 高等教育 > 理学

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

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