当前位置:首页 > 操作系统实验三 - 图文
根据执行的源代码,查看“监视”窗口中*NewProcess表达式的值,观察进程控制块中哪些成员变量是被哪些代码初始化的,哪些成员变量还没有被初始化。
6. 当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。
7. 接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。当调试到PsCreateProcess函数的最后一行代码时,查看进程控制块中的信息,此时所有的成员变量都已经被初始化了(注意观察成员ImageName的值)。
8. 按F5继续执行,EOS内核会为刚刚初始化完毕的进程控制块新建一个进程。激活虚拟机窗口查看新建进程执行的结果。
9. 在OS Lab中选择“调试”菜单中的“停止调试”结束此次调试。
10. 选择“调试”菜单中的“删除所有断点”。
4.6 练习通过编程的方式创建应用程序的多个进程 使用OS Lab打开本实验文件夹中的参考源代码文件NewTwoProc.c,仔细阅读此文件中的源代码。使用NewTwoProc.c文件中的源代码替换EOS应用程序项目中EOSApp.c文件内的源代码,生成后启动调试,查看多个进程并发执行的结果。
多个进程并发时,EOS操作系统中运行的用户进程可以参见图11-5。验证一个程序(hello.exe)可以同时创建多个进程。
二、实验环境
操作系统集成实验环境 OS Lab
? EOS 操作系统
三、实验过程
1. 设计思路和流程图
4
2. 需要解决的问题及解答
在PsCreateProcess函数中调用了PspCreateProcessEnvironment函数后又先后调用了PspLoadProcessImage和PspCreateThread函数,学习这些函数的主要功能。能够交换这些函数被调用的顺序吗?思考其中的原因。
答:PspCreateProcessEnvironment的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。PspCreateThread创建了进程的主线程。这三个函数被调用的顺序是不能够改变的就向上面描述的加载可执行映像之前必须已经为进程创建了地址空间这样才能够确定可执行映像可以被加载到内存的什么位置在创建主线程之前必须已经加载了可执行映像这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。因此不能交换他们的顺序。
3. 源程序代码 #include \
5
int main(int argc, char* argv[]) {
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcInfo[11]; ULONG ulExitCode; // 子进程退出码
INT nResult = 0; // main 函数返回值。0 表示成功,非 0 表示失败。 __asm(\
printf(\StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE); StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE); StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE); int i,j,n=10,num[11]; for(i=1;i<=n;i++)
if (CreateProcess(\NULL, 0, &StartupInfo, &ProcInfo[i])) else {for(j=1;j<=i-1;j++)
{CloseHandle(ProcInfo[i].ProcessHandle); CloseHandle(ProcInfo[i].ThreadHandle);}
printf(\nResult = 1; return nResult;}
for(i=1;i<=n;i++) if(num[i]==1)
WaitForSingleObject(ProcInfo[i].ProcessHandle, INFINITE); for(i=1;i<=n;i++) if(num[i]==1)
GetExitCodeProcess(ProcInfo[i].ProcessHandle, &ulExitCode); for(i=1;i<=n;i++) if(num[i]==1)
printf(\
#ifdef _DEBUG #endif
{num[i]=1;}
// 得到并输出子进程的退出码。
// 关闭不再使用的句柄。
6
}
for(i=1;i<=n;i++) if(num[i]==1) CloseHandle(ProcInfo[i].ProcessHandle); for(i=1;i<=n;i++) if(num[i]==1) CloseHandle(ProcInfo[i].ThreadHandle);
return nResult;
4. 程序运行时的初值和运行结果
4.1 准备实验
4.2 练习使用控制台命令创建EOS应用程序的进程
7
共分享92篇相关文档