欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    操作系统实验进程的创建heu.docx

    • 资源ID:3549685       资源大小:41.24KB        全文页数:12页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统实验进程的创建heu.docx

    操作系统实验进程的创建heu操作系统 实 验 报 告 课程名称 实验项目名称 学号 姓名 学生所在学院 操作系统实验 进程的创建 年级 专业 指导教师 课程编号 0906553 实验室名称地点 哈尔滨工程大学 计算机科学与技术学院 第三讲 进程的创建 一、实验概述 1. 实验名称 进程的创建 2. 实验目的 1.练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。 2.调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位 3. 实验类型 验证型实验 4. 实验内容 准备实验 练习使用控制台命令创建EOS应用程序的进程 练习通过编程的方式让应用程序创建另一应用程序的进程。 调试Create Process函数 调试Ps Create Process函数 练习通过编程的方式创建应用程序的多个进程 二、实验环境 EOS实验系统,WINDOWS XP 操作系统 三、实验过程 1. 设计思路和流程图 1 创建EOS应用程序的进程 创建另一个EOS应用程序的进程 调试Create Process 函数 调试Ps Create Process函数 调试Create Process 函数 2. 算法实现 3. 需要解决的问题及解答 1).在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进程。 答:参照实验报告第5,6部分。 2).学习本书第 5 章中的 5.2 节,了解关于线程的相关知识,然后尝试调试 PspCreateThread 函数,观察线程控制块初始化的过程。 3).在 PsCreateProcess 函数中调用了 PspCreateProcessEnvironment 函数后又先后调用了 PspLoadProcessImage 和 PspCreateThread 函数,学习这些函数的主要功能。能够交换这些函数被调 用的顺序吗?思考其中的原因。 答:PspCreateProcessEnvironment的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。PspCreateThread创建了进程的主线程。这三个函数被调用的顺序是不能够改变的就向上面描述的加载可执行映像之前必须 已经为进程创建了地址空间,这样才能够确定可执行映像可以被加载到内存的什么位置。在创建主线程之前必须已经加载了可执行映像,这样主线程才能够知道自己要从哪里开始执行,执行哪些指令。因此不能交换他们的顺序。 4).实验指导P133-144尝试根据之前对PsCreateProcess函数和PspCreateProcessEnvironment函数执行过程的跟踪调试,绘制一幅进程创建过程的流程图。 开始 创建进程的地址空间 创建进程控制块 为进程分配句柄 将所需的地址映像加载到进程的地址空间 创建线程 结束 2 4. 主要数据结构、实现代码及其说明 5. 源程序并附上注释 1).满足十个进程同时并行的,并且十个进程分别独立的程序,其代码设计如下 #include "EOSApp.h" int main(int argc, char* argv) STARTUPINFO StartupInfo; PROCESS_INFORMATION A10; ULONG ulExitCode; / 子进程退出码 INT nResult = 0; / main 函数返回值。0 表示成功,非 0 表示失败。 #ifdef _DEBUG _asm("int $3n nop"); #endif printf("Create ten processes and wait for the processes exit.nn"); StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE); StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE); StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE); int x10,i=0; x10=0; for(i=0;i<10;i+) for(i=0;i<10;i+) if(xi=0)WaitForSingleObject(Ai.ProcessHandle, INFINITE); for(i=0;i<10;i+) if(xi=0) GetExitCodeProcess(Ai.ProcessHandle, &ulExitCode); printf("nThe process %d exit with %d.n",i, ulExitCode); 3 if(CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &Ai)=0)xi=1; for(i=0;i<10;i+) if(x1=0) CloseHandle(Ai.ProcessHandle); CloseHandle(Ai.ThreadHandle); if(xi!=0) printf("CreateProcess Failed, Error code: 0x%X.n", GetLastError); nResult = 1; return nResult; 2).使一个进程失败,9个进程仍旧同步进行的代码如下: #include "EOSApp.h" int main(int argc, char* argv) STARTUPINFO StartupInfo; PROCESS_INFORMATION A10; ULONG ulExitCode; / 子进程退出码 INT nResult = 0; / main 函数返回值。0 表示成功,非 0 表示失败。 #ifdef _DEBUG _asm("int $3n nop"); #endif printf("Create ten processes and wait for the processes exit.nn"); StartupInfo.StdInput = GetStdHandle(STD_INPUT_HANDLE); StartupInfo.StdOutput = GetStdHandle(STD_OUTPUT_HANDLE); StartupInfo.StdError = GetStdHandle(STD_ERROR_HANDLE); int x10,i=0; x10=0; if(CreateProcess("A:Hellowhat.exe", NULL, 0, &StartupInfo, &A0)=0)x0=1; for(i=1;i<10;i+) if(CreateProcess("A:Hello.exe", NULL, 0, &StartupInfo, &Ai)=0)xi=1; 4 for(i=0;i<10;i+) if(xi=0)WaitForSingleObject(Ai.ProcessHandle, INFINITE); for(i=0;i<10;i+) if(xi=0) GetExitCodeProcess(Ai.ProcessHandle, &ulExitCode); printf("nThe process %d exit with %d.n",i, ulExitCode); for(i=0;i<10;i+) if(x1=0) CloseHandle(Ai.ProcessHandle); CloseHandle(Ai.ThreadHandle); if(xi!=0) printf("CreateProcess Failed, Error code: 0x%X.n", GetLastError); nResult = 1; return nResult; 6. 程序运行时的初值和运行结果 练习使用控制台命令创建EOS应用程序进程的具体步骤如下: 1). 在EOS应用程序项目的“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor工2). 将本实验文件夹中的Hello.exe文件拖动到FloppyImageEditor工具窗口的文件列表中释放,具打开此软盘镜像文件。 Hello.exe文件即被添加到软盘镜像文件中。Hello.exe一个EOS应用程序,其源代码可以参见本实验文件夹中的Hello.c源文件。 3). 在FloppyImageEditor中选择“文件”菜单中的“保存”后关闭FloppyImageEditor。 4). 按F7生成EOS应用项目。 5). 按F5启动调试。OS Lab会弹出一个调试异常对话框,并中断应用程序的执行。 6). 在调试异常对话框中选择“否”,忽略异常继续执行应用程序。 7). 激活虚拟机窗口,待该应用程序执行完毕后,在EOS的控制台中输入命令“A:Hello.exe”后回8). Hello.exe应用程序开始执行,观察其输出 5 车。 9). 待Hello.exe执行完毕后可以重复第7步,或者结束此次调试。 按照下面的步骤查看应用程序创建另一个应用程序的进程的执行结果: 1). 使用NewProc.c文件中的源代码替换之前创建的EOS应用程序项目中的EOSApp.c文件内的源代码。 2). 按F7生成修改后的EOS应用程序项目。 3). 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 4). 在调试异常对话框中选择“否”,继续执行。 5). 激活虚拟机窗口查看应用程序输出的内容,可以看到父进程首先开始执行并输出内容,父进程创建了子进程后,子进程开始执行并输出内容,待子进程结束后父进程再继续执行。 6). 结束此次调试 按照下面的步骤调试CreateProcess函数创建进程的过程: 1). 按F5启动调试EOS应用程序,OS Lab会首先弹出一个调试异常对话框。 2). 选择“是”调试异常,调试会中断。 3). 在main函数中调用CreateProcess函数的代码行添加一个断点。 4). 按F5继续调试,在断点处中断。 5). 按F11调试进入CreateProcess函数。此时已经开始进入EOS内核进行调试, 按照下面的步骤来分别验证应用程序和操作系统内核在进程的4G虚拟地址空间中所处的位置: 1). 由于此时在内核的CreateProcess函数内中断执行,所以在“调试”菜单的“窗口”中选择“反汇编”,会在“反汇编”窗口中显示CreateProcess函数的指令对应的反汇编代码。“反汇编”窗口的左侧显示的是指令所在的虚拟地址。可以看到所有指令的虚拟地址都大于0x80000000,说明内核处于高2G的虚拟地址空间中。 6 2). 在“调用堆栈”窗口中双击main函数项,设置main函数的调用堆栈帧为活动的。在“反汇编”窗口中查看main函数的指令所在的虚拟地址都是小于0x80000000,说明应用程序处于低2G的虚拟地址空间中。 3). 在“调用堆栈”窗口中双击CreateProcess函数项,重新设置CreateProcess函数的调用堆栈帧为4).接下来观察eosapi.c文件中CreateProcess函数的源代码,可以看到此函数只是调用了EOS内核函活动的。关闭“反汇编”窗口。 数PsCreateProcess并将创建进程所用到的参数传递给了此函数。所以,按F11可以调试进入create.c文件中的PsCreateProcess函数,在此函数中才开始执行创建进程的各项操作。 调试PspCreateProcessEnvironment函数的步骤如下: 1). 在PsCreateProcess函数中找到调用PspCreateProcessEnvironment函数的代码行. 按F5继续调试,到此断点处中断。 3). 按F11调试进入PspCreateProcessEnvironment函数。 件的第163行),并在此行添加一个断点。 由于PspCreateProcessEnvironment函数的主要功能是创建进程控制块并初始化其中的部分信息,所以在此函数的开始,定义了一个进程控制块的指针变量NewProcess。在此函数中查找到创建进程控制块的代码行 按照下面的步骤调试进程控制块的创建过程: 1). 在调用ObCreateObject函数的代码行添加一个断点。 2). 按F5继续调试,到此断点处中断。 3). 按F10执行此函数后中断。 4). 此时为了查看进程控制块中的信息,将表达式*NewProcess添加到“监视”窗口中。 5). 将鼠标移动到“监视”窗口中此表达式的“值”属性上,会弹出一个临时窗口,在临时窗口中会按照进程控制块的结构显示各个成员变量的值。由于只是新建了进程控制块,还没有初始化其中成员变量,所以值都为0。 7 接下来调试初始化进程控制块中各个成员变量的过程: 1). 首先创建进程的地址空间,即4G虚拟地址空间。在代码行 2). 按F5继续调试,到此断点处中断。 3). 按F10执行此行代码后中断。 4). 在“监视”窗口中查看进程控制块的成员变量Pas的值已经不再是0。说明已经初始化了进程的4GNewProcess->Pas = MmCreateProcessAddressSpace; 添加一个断点。 虚拟地址空间。 5). 使用F10一步步调试PspCreateProcessEnvironment函数中后面的代码,在调试的过程中根据执行的源代码,查看“监视”窗口中*NewProcess表达式的值,观察进程控制块中哪些成员变量是被哪些代码初始化的,哪些成员变量还没有被初始化。 8 9 6). 当从PspCreateProcessEnvironment函数返回到PsCreateProcess函数后,停止按F10。此时“监视”窗口中已经不能再显示表达式*NewProcess的值了,在PsCreateProcess函数中是使用ProcessObject指针指向进程控制块的,所以将表达式*ProcessObject添加到“监视”窗口中就可以继续观察新建进程控制块中的信息。 7). 接下来继续使用F10一步步调试PsCreateProcess函数中的代码,同样要注意观察执行后的代码修改了进程控制块中的哪些成员变量。当调试到PsCreateProcess函数的最后一行代码时,查看进程控制块中的信息,此时所有的成员变量都已经被初始化了。 10 8). 按F5继续执行,EOS内核会为刚刚初始化完毕的进程控制块新建一个进程。激活虚拟机窗口查看9). 在OS Lab中选择“调试”菜单中的“停止调试”结束此次调试。 10). 选择“调试”菜单中的“删除所有断点”。 1).使用OS Lab打开本实验文件夹中的参考源代码文件NewTwoProc.c,仔细阅读此文件中的源代码。新建进程执行的结果。 7. 练习通过编程的方式创建应用程序的多个进程 使用NewTwoProc.c文件中的源代码替换EOS应用程序项目中EOSApp.c文件内的源代码,生成后启动调试,查看多个进程并发执行的结果。 2). 在源代码文件NewTwoProc.c提供的源代码基础上进行修改,要求使用hello.exe同时创建10个进11 程。提示:可以使用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。 修改的代码在步骤5,运行截图如下。 3).修改代码,使一个进程创建不成功,验证其他九个进程正常进行。 修改的代码在步骤5,运行截图如下 四、实验体会 遇到问题:用hello.exe同时创建10个进程时十个进程不同步,也不独立 解决方法:用PROCESS_INFORMATION类型定义一个有10个元素的数组,每一个元素对应一个进程。使用一个循环创建10个子进程,然后再使用一个循环等待10个子进程结束,得到退出码后关闭句柄。对于不能创建成功的进程则直接结束这个进程并且弹出错误信息,之后转到下一个进程,使进程之间不互相影响。 12 感想:通过这次实验,我对进程的相关知识增加了理解。有了动手实践的机会让我对于课本上进程的相关知识有了新的认识和更深的记忆。学习了如何创建进程和关闭句柄等,丰富了编程的相关知识。 13

    注意事项

    本文(操作系统实验进程的创建heu.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开