操作系统:进程的控制和通信(Windows2000)

news2024/11/20 18:43:09

文章目录

  • 进程的控制和通信(Windows2000)
    • 一、实验目的
    • 二、实验要求与内容、过程与结果

进程的控制和通信(Windows2000)

一、实验目的

通过对Windows 2000编程,进一步熟悉操作系统的基本概念,并能较好地理解Windows 2000的结构。
通过创建进程,观察进程的运行和终止程序以及调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000进程的生命周期。

二、实验要求与内容、过程与结果

  1. 参照例2-2,编写一个程序,利用进程句柄来获得当前运行进程的优先级。
#include<Windows.h>
#include<iostream>
using namespace std;
int main()
{
    //从当前进程中提取句柄
    HANDLE hProcessThis=GetCurrentProcess();	
    //请求内核提供该进程所属的优先权类
    DWORD dwPriority=GetPriorityClass(hProcessThis);
    //发出消息,为用户描述该类
    printf("current process priority:");
    switch(dwPriority)
    {
    case HIGH_PRIORITY_CLASS:
    		printf("High\n");
   		break;
    case NORMAL_PRIORITY_CLASS:
    		printf("Normal\n");
    		break;
    case IDLE_PRIORITY_CLASS:
    		printf("Idle\n");
    		break;
    //case REAL_TIME_ PRIORITY_CLASS:
    //	printf("Realtime\n");
    //		break;
    default:
    		printf("<unknow>\n");
    		break;
    }
}

1
程序分析

本代码主要通过Windows API函数GetPriorityClass获取当前进程的优先级类别,然后通过switch语句输出对应的优先级名称。

在Windows操作系统下,为了更好地管理和调度进程,操作系统将所有的进程分成了不同的优先级类别,这些类别按照优先级从高到低依次为:

  1. REALTIME_PRIORITY_CLASS:实时优先级类,只有操作系统内核可以使用,在执行实时任务时使用。

  2. HIGH_PRIORITY_CLASS:高优先级类,通常用于非常紧急且时间敏感的任务,如音视频编解码、实时数据传输等。

  3. NORMAL_PRIORITY_CLASS:普通优先级类,大多数进程都属于此类别,系统分配的默认类别。

  4. IDLE_PRIORITY_CLASS:空闲优先级类,用于低优先级的任务,不会影响其他进程的执行,通常用于节能和减少电脑噪音等场景。

在本代码中,首先调用GetPriorityClass函数获取当前进程的优先级类别,返回的是DWORD类型的优先级常量,然后通过switch语句将其转化为对应的字符串输出。

需要注意的是,在代码中我们注释掉了REALTIME_PRIORITY_CLASS这个优先级类别,因为该优先级类别只有操作系统内核才能使用,一般用户进程无法使用,否则可能会对系统稳定性造成危害。实际上,该优先级类别在一些特定场景下还是会被用到的,如视频监控、游戏引擎等。

总之,通过获取和了解进程的优先级类别,我们可以更好地控制进程的执行顺序和优先级,从而提升系统性能和响应速度。

  1. 运行例2-3,记录运行结果(不少于5个进程的信息),并描述该程序的功能。

2

程序功能:利用进程句柄获得进程详细信息, 应用程序显示当前运行进程名字以及在核心态下占用时间的百分比。

  1. 运行例2-4,记录运行结果,并描述该程序的功能。

3

程序功能:通过当前进程,创建相同的子进程。

4.参照例2-5,编写一个程序,给出运行进程的操作系统的版本号。

4

5.用命令行的方式运行2次例2-6(每次命令行参数不同:命令行中是否包含“child”参数),记录运行结果,并描述该程序的功能。

5.15.2

功能:创建子进程,描述了进程间的互斥与同步。该程序开始时时先进入parent()函数,然后parent()函数会创建自杀互斥体和一个子进程,并暂停5秒后杀死自己,这时子进程会进入child()函数并打开自杀互斥体,等待父进程杀掉自身后终止。

6.参照例2-6,编写一个程序,通过创建进程来执行一个命令列表(命令列表中有3个应用程序的程序名,这些程序运行一段时间后被中止退出),并输出每个进程(这3个应用程序)的执行时间。

#include <windows.h>
#include <iostream>
#include <stdio.h>
#include<ctime>
#pragma warning(disable: 4996)
using namespace std;

static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide";
//创建当前进程的克隆进程的简单方法
void StartClone(int num)
{
	TCHAR szFilename[MAX_PATH];
	//获得当前可执行文件的文件名
	GetModuleFileName(NULL, szFilename, MAX_PATH);
	//格式化子进程的命令行,指明是一个EXE文件和子进程
	TCHAR szCmdLine[MAX_PATH];
	sprintf(szCmdLine, "%s  %d", szFilename,num);
	//子进程的启动信息结构
	STARTUPINFO si;
	ZeroMemory(reinterpret_cast <void *> (&si), sizeof(si));
	si.cb = sizeof(si);
	PROCESS_INFORMATION p;  //说明一个返回的子进程信息结构
	//利用同样的可执行文件名和命令行创建进程,并指明是一个子进程
	BOOL bCreateOK = CreateProcess(
		szFilename,    //产生的应用程序的名称
		szCmdLine,    //指定创建一个子进程的符号标识
		NULL,    		//默认的进程安全性
		NULL,  		//默认的线程安全性
		FALSE,   		 //不继承句柄
		CREATE_NEW_PROCESS_GROUP, //创建新窗口,使输出更直观
		NULL,    		//新环境
		NULL,    		//当前目录
		&si,    		//启动信息结构
		&p);    		//返回的进程信息
	//关闭子进程
	if (bCreateOK)
	{
		CloseHandle(p.hProcess);
		CloseHandle(p.hThread);
	}
}

void Parent()
{
	//创建“自杀”互斥体
	HANDLE hMutexSuicide = CreateMutex(
		NULL,    //默认的安全性
		TRUE,    //创建者是互斥体的最初拥有者
		g_szMutexName);    //为互斥体命名
	if (hMutexSuicide != NULL)
	{
		StartClone(1);    //创建两个子进程
		StartClone(2);
		Sleep(5000);    //暂停(5秒)
		ReleaseMutex(hMutexSuicide);  //通知子进程”杀”掉自身
		CloseHandle(hMutexSuicide);   //消除互斥体句柄
	}
	printf("name: parent time: %f s\n", (double)clock() / CLOCKS_PER_SEC);
	getchar();
}

void Child(char * argv[])
{   //打开“自杀”互斥体
	HANDLE hMutexSuicide = OpenMutex(
		SYNCHRONIZE,    //打开用于同步
		FALSE,    		//不需要向下传递
		g_szMutexName);  //互斥体名称
	if (hMutexSuicide != NULL)
	{
		WaitForSingleObject(hMutexSuicide, INFINITE);
		//等待子进程释放互斥体
		//准备好终止,清除句柄
		CloseHandle(hMutexSuicide);
	}
	printf("name: child%s time: %f s\n", argv[1], (double)clock() / CLOCKS_PER_SEC);
}

int main(int argc, char * argv[])
{
	//决定其行为是父进程还是子进程
	if (argc > 1)
	{
		Child(argv);
	}
	else
	{
		Parent();
	}
	return 0;
}

6
程序分析

本代码主要演示了如何通过创建“克隆”进程的方式实现父进程通知子进程自杀的功能。

该代码的核心是利用Windows API函数CreateProcess创建进程,并利用命令行参数的方式来区分父进程和子进程。父进程会创建两个子进程,然后暂停5秒,并通过创建一个“自杀”互斥体来通知子进程自杀。子进程则会打开这个互斥体并等待通知,收到通知后即可终止自身。

具体实现过程如下:

首先创建了一个名为“w2kdg.ProcTerm.mutex.Suicide”的互斥体,用于父进程通知子进程自杀。

然后在主函数中通过判断命令行参数的个数,来决定当前进程是父进程还是子进程。如果命令行参数个数大于1,则说明当前进程是子进程;否则,就是父进程。可以通过命令行参数的方式把当前进程的角色传递给子进程。

在父进程中,调用StartClone函数创建两个子进程,同时暂停5秒钟。在创建子进程的时候,使用了CREATE_NEW_PROCESS_GROUP参数,这样可以在屏幕上创建两个独立的命令行窗口,使输出更直观。

然后,父进程获得了“自杀”互斥体的句柄,并释放了这个互斥体,通知子进程自杀。父进程还输出了当前运行时间,再通过getchar来等待用户输入,以保证在结束进程之前不会立即关闭命令行窗口。

在子进程中,首先打开“自杀”互斥体,并等待父进程通知。一旦收到通知,子进程就会终止自身,释放句柄并退出。

需要注意的是,这种通过创建“克隆”进程的方式来通信和控制进程的方法并不是一种很好的做法。因为这种方式存在许多潜在的问题,比如进程之间的同步和通信机制都需要手动实现,并且容易导致死锁和进程的长时间挂起等问题。在实际的开发中,建议使用更为高级和稳定的通信和同步机制,如线程、信号量和管道等。

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

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

相关文章

百度智能云推出,国内首个大模型全链路生态支持体系

在10月17日举行的百度世界2023上&#xff0c;百度智能云宣布&#xff0c;百度智能云千帆大模型服务平台已服务17000多家客户&#xff0c;覆盖近500个场景。 同时&#xff0c;新的企业和开发者还正在不断地涌入千帆&#xff0c;大模型调用量高速攀升。平台上既有年龄仅14岁的小…

相似性搜索:第 6 部分--LSH 森林的随机投影

一、说明 相似性搜索是一个问题&#xff0c;给定一个查询&#xff0c;目标是在所有数据库文档中找到与其最相似的文档。 在数据科学中&#xff0c;相似性搜索经常出现在 NLP 领域、搜索引擎或推荐系统中&#xff0c;其中需要检索最相关的文档或项目以进行查询。有多种不同的方法…

RTOS(5)创建任务函数详解

动态内存使用 面向对象的编程思想 我们想要使用应该结构体&#xff0c;但又不想了解其内部时&#xff0c;一般使用句柄&#xff08;handle&#xff09;&#xff1b;句柄是指针指向结构体&#xff0c;只是同一个结构体类型的另外一种名称而已&#xff1b; 任务&#xff08;tas…

如何学习渗透测试?怎样才能入行?

学习实践&#xff0c;目前只有这路子&#xff0c;自学9月&#xff0c;成功入圈。下面说一下自己的学习路径&#xff0c;都是摸爬滚打&#xff0c;交了N份钱才学会的。 切记一定要先了解整个渗透测试的流程&#xff0c;记住整个流程口诀。 信息收集&打点&#xff0c;漏洞挖…

c语言中数组的四种创建方式和应用场景

数组是语言中常用的一种结构&#xff0c;在c语言中可以使用多种方式来创建数组&#xff0c;每种语法对应于不同的应用场景。 1、在声明数组时指定数组的长度 语法 <类型> <变量>[<长度>]; 当填充数组的内容为运行时动态加入时可以使用此语法&#xff0c;…

高压放大器在无线电能中应用有哪些

高压放大器是一种用于放大电信号的放大器&#xff0c;可以将输入的低电压信号放大到更高的输出电压水平。在无线电通信和其他相关领域中&#xff0c;高压放大器具有广泛的应用。本文将详细介绍高压放大器在无线电能中的应用。 无线电发射&#xff1a;高压放大器在无线电发射中起…

基于Delta Lake的Upserts数据湖方案

导读 基于HDFS的传统数据存储方案由于HDFS等存储平台的限制&#xff0c;只能增加文件不能修改文件中的内容。想要实现某条记录的变更&#xff0c;就需要读取对应的文件并进行重写&#xff0c;效率极低&#xff0c;而且容易引起数据不一致和冲突。Delta Lake是基于Apache Spark…

微前端四:qiankun在开发中遇到的问题

在qiankun开发中会遇到很多问题&#xff0c;上一篇微前端三&#xff1a;qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题&#xff0c;下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…

idea Java代码格式化规范

引入 最近在公司开发中&#xff0c;遇到了一点小问题&#xff0c;组内各同事的格式化规范不一致。一来导致代码样式并不统一&#xff0c;二来有时候合并代码会出现冲突&#xff0c;因此做一套统一代码格式化规范很有必要。 基础知识 在idea中&#xff0c;可以通过快捷键Ctrl…

数字孪生技术:煤矿运输的未来革命

煤矿是我国能源工业的重要支柱&#xff0c;然而&#xff0c;煤矿运输过程中一直存在着诸多问题&#xff0c;如安全隐患、能源浪费、效率低下等&#xff0c;这不仅对煤矿行业的可持续发展构成威胁&#xff0c;也对环境造成负面影响。因此&#xff0c;数字孪生技术应运而生&#…

2023年中国有创呼吸机产量、需求量及行业市场规模分析[图]

有创呼吸机主要是通过气管插管或者气管切开&#xff0c;然后通过管道连接在呼吸机上&#xff0c;为患者提供呼吸支持&#xff0c;主要针对的患者是昏迷的&#xff0c;无自主呼吸或不能耐受无创呼吸机的患者。 有创呼吸机是高端医疗装备&#xff0c;设计、生产和临床验证都必须经…

element-ui中表格树类型数据的显示

项目场景&#xff1a; 1&#xff1a;非懒加载的情况 1&#xff1a;效果展示 2&#xff1a;问题描述以及解决 1&#xff1a;图片展示 2&#xff1a;html <-- default-expand-all 代表默认展开 如果不展开删除就行 --> <el-tableref"refsTable"v-loadin…

2023年中国热电厂发电装机量、热电厂发电量及市场需求分析[图]

热电厂是以热定电&#xff0c;以供热为主要目的发电厂。热电厂是同时生产供应热和电的工厂&#xff0c;既是可以对外供热的发电厂&#xff0c;也是可以发电上网的供热站&#xff0c;其核心技术就是“热电联产”。热电厂的主要应用领域涵盖了工业生产、城市供热、电力系统支撑等…

2023年中国液晶显示板产量、需求量、市场规模及价格趋势分析[图]

显示面板主要包括LCD和OLED&#xff0c;液晶显示技术&#xff08;LCD&#xff09;是利用电场改变液晶分子排列状态而调制外界背光源的一种非自发光性显示技术&#xff0c;液晶面板是决定液晶显示器亮度、对比度、色彩、可视角度的材料&#xff0c;目前液晶显示面板的主流为TFT-…

eVTOL无人驾驶载人航空器动力测试系统:500kg级-高精度专业测试系统

平台功能强大的软件操作系统&#xff0c;专用于eVTOL大型电机和螺旋桨动力系统测试。 系统简介 Flight Stand 500测试台通过测量电机和螺旋桨的拉力、扭矩、转速、电流、电压、温度、螺旋桨效率和电机效率来精准地描述和评估无人机动力系统的性能。 技术规格 技术优势 Fligh…

postgresql字符串处理的函数

1. SPLIT_PART SPLIT_PART() 函数通过指定分隔符分割字符串&#xff0c;并返回第N个子串。语法&#xff1a; SPLIT_PART(string, delimiter, position) string : 待分割的字符串 delimiter&#xff1a;指定分割字符串 position&#xff1a;返回第几个字串&#xff0c;从1开始&…

【C++心愿便利店】No.9---C++之内存管理

文章目录 前言一、 C/C内存分布二、 C语言中动态内存管理方式三、 C中动态内存管理四、 operator new与operator delete函数五、 new和delete的实现原理六、 定位new表达式(placement-new)七、 malloc/free和new/delete的区别八、 内存泄漏 前言 &#x1f467;个人主页&#xf…

基于内存的分布式NoSQL数据库Redis(六)AOF设计

文章目录 知识点21&#xff1a;Redis持久化&#xff1a;AOF设计知识点22&#xff1a;Redis持久化&#xff1a;AOF实现附录一&#xff1a;Jedis Maven依赖 知识点21&#xff1a;Redis持久化&#xff1a;AOF设计 目标&#xff1a;掌握Redis的AOF持久化机制 路径 step1&#xff1…

FPGA 图像缩放 1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…

从0到1,申请cos服务器并上传图片到cos文件服务器

目录 准备工作 Java代码编写 控制台打印 整理成工具类 编写接口 Postman测试 准备工作 1.进入网址腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 2.搜索cos,点击立即使用&#xff0c;刚开始会免费赠送你 3.存储都是基于桶的&#xff0c;先创建桶&#xff0c;在桶里面创…