操作系统课设之Windows 进程管理

您所在的位置:网站首页 windows存储管理方式 操作系统课设之Windows 进程管理

操作系统课设之Windows 进程管理

2023-09-17 09:49| 来源: 网络整理| 查看: 265

前言

课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/archives/171 PDF链接:见博客网站 CSDN: https://blog.csdn.net/RongLin02/article/details/118308142

为了美观,实验源代码在结尾处,整合版见下 链接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w 提取码:Lin2 操作系统课程设计源代码 本次操作系统课程设计合集 操作系统课设之Windows 进程管理 操作系统课设之Linux 进程管理 操作系统课设之Linux 进程间通信 操作系统课设之Windows 的互斥与同步 操作系统课设之内存管理 操作系统课设之虚拟内存页面置换算法的模拟与实现 操作系统课设之基于信号量机制的并发程序设计 操作系统课设之简单 shell 命令行解释器的设计与实现 仅用于学习,如有侵权,请联系我删除

实验题目

Windows 进程管理

实验目的

(1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。 (2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操 作系统的进程概念,理解 Windows 进程的“一生”。 (3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。

实验内容

由于个人习惯,对于C/C++代码,我更喜欢用CodeBlocks开发,所以本次验证性实验和设计类均用CodeBlocks完成。

1-1 编写基本的 Win32 Consol Application

这个实验的主要目的是熟悉编写C/C++控制台程序,对于创建一个C/C++控制台程序,我常用的有两种方式,逐一说明其优缺点。 第一种方式是在菜单栏点击 File – New – File… ,在弹出的窗口中选择 C/C++ source ,然后选择代码类型是C还是C++,之后设置文件保存的位置,然后就会生成一个.c(.cpp)文件,在这个文件中就可以编写c(c++)代码了。编写完成后在菜单栏 点击 Build – Build and run 或者直接按F9,即可查看输出。这种方法创建C/C++控制台程序,优点是轻便,文件最后只生成三个,源代码.c文件,.o文件还有exe文件,缺点是不支持调试。适合轻量级开发 第二种方法是新建一个工程,在菜单栏点击 File – New – Project…,弹出的界面选择 Console Application ,然后选择代码类型和文件保存目录,之后它会生成一个该项目的文件夹,然后有一个main.c(main.cpp)文件,在这个文件中编写代码。这个项目中的核心文件是.cbp,还会生成很多从属文件,优点是调试方便,可以用Debug单步调试,缺点是生成文件多,适合大型项目开发。 本次操作系统课程设计均是用第二种方式生成C++项目编写。

1-2 创建进程

1.创建一个C++项目,将指导书中的1-2代码复制到main.cpp文件中,然后编译运行 2.按照代码中的注释提示修改代码,看有什么不同,共有两处修改 3.通过查阅相关资料分析为何会出现这样的结果

关键代码

BOOL bCreateOK=::CreateProcess( szFilename, // 产生这个 EXE 的应用程序的名称 szCmdLine, // 告诉其行为像一个子进程的标志 NULL, // 缺省的进程安全性 NULL, // 缺省的线程安全性 FALSE, // 不继承句柄 CREATE_NEW_CONSOLE, // 使用新的控制台 NULL, // 新的环境 NULL, // 当前目录 &si, // 启动信息 &pi) ; // 返回的进程信息 1-3 父子进程的简单通信及终止进程

1.创建一个C++项目,将指导书中的1-3代码复制到main.cpp文件中,然后按F9查看运行结果 2.根据注释修改代码,查看结果 3.查阅资料,分析原因

关键代码

// 决定其行为是父进程还是子进程 if (argc>1 && :: strcmp(argv[1], "child" ) == 0) { Child() ; } else { Parent() ; } 实验结果与分析 1-1 编写基本的 Win32 Consol Application

运行结果: 在这里插入图片描述 return是返回值,如果越界就会返回一个数,后边execution time 是 C/C++控制台程序执行的时间。

1-2 创建进程

不修改的运行结果 在这里插入图片描述 会生成5个子进程,且0号进程结束后其余进程不消失 第一次修改 nClone=0; 结果和原代码一样 第二次修改

if (argc > 1) { // 从第二个参数中提取克隆 ID :: sscanf(argv[1], "%d", &nClone) ; } //第二次修改:nClone=0; nClone = 0;

在这里插入图片描述 结果无限生成子进程。

结果分析: 生成子进程的过程是父进程生成一个子进程,然后子进程再“克隆”自己生成一个子进程,如此反复,直到到达代码中规定的 const int c_nCloneMax=5;为止。 在这里插入图片描述 重点在于这三句代码,当父进程生成子进程的时候,会给子进程传递参数,传参的内容就是 代码中的 szCmdLine 字符串,例如0号主进程会给子进程传递2个参数,第一个参数是 szFilename 是从主进程信息中获取,第二个参数就是 nClone,用来控制生成的克隆数量。 分析两次修改 第一次修改是在

if (argc > 1) { :: sscanf(argv[1], "%d", &nClone) ;}

之前,执行nClone=0;将nClone的量置为0,但是之后会判断参数数量,如果传进来大于一个参数,就会把传进来的第二个参数赋值给nClone,也就说子进程的nClone最后的值是它的父进程传进来的值,第一次修改的nClone=0;会被sscanf()覆盖掉。 而第二次修改则是在if判断之后,if判断中将父进程传进来的参数赋值给nClone,然后第二次修改则会覆盖掉if中的赋值,将nClone置为0,所以说,nClone的值最后就是0,比较nClone < c_nCloneMax会恒成立,然后就会无限生成子进程,同时子进程的nClone参数永远都是1

1-3 父子进程的简单通信及终止进程

在这里插入图片描述 然后在父进程中输入回车,主进程结束,同时子进程也消失。 修改代码 修改代码之后,子进程不出现,只有主进程 结果分析: 修改了WaitForSingleObject(hMutexSuicide,INFINITE) ;这句代码的第二个参数,将INFINITE改成了0,WaitForSingleObject()函数的第二参数是等待时间,如果超过这个时间(ms),不管互斥体是否可用都继续运行。而INFINITE在C++表示的意思是正无穷,实际上是一个宏定义 #define INFINITE 0xFFFFFFFF,意思是表示一个非常大的数,所以子程序会一直等互斥体可用,然后再结束。 第二次修改 在这里插入图片描述 这个步骤原理和1-2类似,都是识别命令行参数,不再赘述

小结与心得体会

本验证性实验熟悉了CreateProcess()函数的大概用法,同时理解了控制台程序传参的过程。通过简单的修改nClone的值,实现完全不同的效果,同时再次认识到代码设计过程中,要多多注意逻辑错误.同时了解了互斥程序体的使用,利用WaitForSingleObject()和ReleaseMutex()实现互斥操作。收获良多。=w=

源代码 1-1 编写基本的 Win32 Consol Application #include using namespace std; int main() { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3