《Windows核心编程》第七章——进程优先级实验
其实就是做个实验,看看SetPriorityClass是否真的会生效。
设计思路:主线程一直在进行某种操作(这里是写文件操作),以保证有一定的CPU占用率;生成的子线程来接收你的命令,决定将进程改变为什么级别。
代码逻辑如下:
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include <process.h>
#include <fstream> using namespace std;
unsigned int WINAPI ThreadFunc(PVOID pvParam){
HANDLE hPThread = (HANDLE)pvParam;
printf("Enter thread\n");
while (true){
char cPriority = getchar();
//SuspendThread(hPThread);
if (cPriority == 'a')
{
if (!SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS))
{
printf("SetPriorityClass failed:%d\n", GetLastError());
return FALSE;
}
printf("IDLE_PRIORITY_CLASS\n");
}
if (cPriority == 'b')
{
if (!SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS))
{
printf("SetPriorityClass failed:%d\n", GetLastError());
return FALSE;
}
printf("BELOW_NORMAL_PRIORITY_CLASS\n");
}
if (cPriority == 'c')
{
if (!SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS))
{
printf("SetPriorityClass failed:%d\n", GetLastError());
return FALSE;
}
printf("NORMAL_PRIORITY_CLASS\n");
}
if (cPriority == 'd')
{
if (!SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS))
{
printf("SetPriorityClass failed:%d\n", GetLastError());
return FALSE;
}
printf("ABOVE_NORMAL_PRIORITY_CLASS\n");
}
if (cPriority == 'e')
{
if (!SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS))
{
printf("SetPriorityClass failed:%d\n", GetLastError());
return FALSE;
}
printf("HIGH_PRIORITY_CLASS\n");
}
if (cPriority == 'f')
{
if (!SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS))
{
printf("SetPriorityClass failed:%d\n", GetLastError());
return FALSE;
}
printf("REALTIME_PRIORITY_CLASS\n");
}
/*if (cPriority == 's')
{
Sleep(30000);
printf("Sleeping..\n");
}*/
//ResumeThread(hPThread);
}
CloseHandle(hPThread);
return TRUE;
} BOOL main(){
HANDLE hPThread;
if (!DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(),
&hPThread, THREAD_SUSPEND_RESUME, FALSE, DUPLICATE_SAME_ACCESS))
{
printf("Dupilicate failed:%d", GetLastError());
return FALSE;
} _beginthreadex(NULL, , ThreadFunc, NULL, , NULL); int i = ;
printf("Enter while\n");
while (TRUE){
i++;
ofstream outfile;
outfile.open("E:\\Coding\\test\\test2.txt");
outfile << "Run service success..\n" << endl;
outfile.close();
}
return TRUE;
}
当启动这个线程和它的副本的时候,二者CPU占用率差不多:

现在调低188.exe的优先级,调到IDLE优先级后,其CPU占用率立即下降:

如果改成实时的优先级,其CUP占用率就会提升:

确实会有变化,但是并不像书中说的那么明显。
《Windows核心编程》第七章——进程优先级实验的更多相关文章
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...
- windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题
// 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...
- windows核心编程 第5章job lab示例程序 解决小技巧
看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里” 用process explorer程序查看 ...
- Windows核心编程 第三章 内核对象
第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...
- windows核心编程---第六章 线程的调度
每个线程都有一个CONTEXT结构,保存在线程内核对象中.大约每隔20ms windows就会查看所有当前存在的线程内核对象.并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入c ...
- Windows核心编程 第27章 硬件输入模型和局部输入状态
第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...
- Windows核心编程 第十七章 -内存映射文件(下)
17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...
随机推荐
- 【Java】 用PriorityQueue实现最大最小堆
PriorityQueue(优先队列),一个基于优先级堆的无界优先级队列. 实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆. Pri ...
- 把对象转换成JSON形式的html代码
function formatJson(msg) { var rep = "~"; var jsonStr = JSON.stringify(msg, null, rep) var ...
- 安卓RecylerView嵌套和事件处理
最近遇到了一个需求:RecylerView的某一项为listView,即listView嵌套,且要求内部ListView可以滑动,高度固定. 如果直接简单的写完,会发现有两个问题: 1.内部listV ...
- Linux 的文件权限与目录配置
用户和用户组 文件所有者 (owner) 用户组概念 (group) 其他人概念 (others) Linux文件权限概念 1. Linux文件属性 要了解Linux文件属性,那么有个重要的命令必须提 ...
- 【AI in 美团】深度学习在OCR中的应用
AI(人工智能)技术已经广泛应用于美团的众多业务,从美团App到大众点评App,从外卖到打车出行,从旅游到婚庆亲子,美团数百名最优秀的算法工程师正致力于将AI技术应用于搜索.推荐.广告.风控.智能调度 ...
- jQuery 插件写法示例
1.插件 taskStaticBar.js /**自定义任务进度条插件,用于发布任务单的显示进度 * 先初始化init() * 配置项type:1,任务发布方:type=2,生产方 * 然后传入sho ...
- NetStandard类库实现Log4Net集成
前面都是Log4Net集成到NetCore项目中,集成到NetStandard类库还是第一次,所以记录一下 小提示:NetStandard要想同时被NetCore和NetFramework调用,需要在 ...
- WebApi入门
饮水思源 http://www.cnblogs.com/guyun/p/4589115.html http://www.cnblogs.com/chutianshu1981/p/3288796.htm ...
- C#语法浮点型字面量
C#语法浮点型字面量 小数是生活中经常使用的一种数据表示形式.我们日常使用的5.5.0.6都是小数.在编程语言中,这种数据表示方式被称为浮点型数.浮点型数由整数部分.小数部分和小数点组成.浮点型字面量 ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...