其实就是做个实验,看看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核心编程》第七章——进程优先级实验的更多相关文章

  1. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  2. windows核心编程---第七章 用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

  3. Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)

    第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...

  4. windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题

    // 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...

  5. windows核心编程 第5章job lab示例程序 解决小技巧

    看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里”         用process explorer程序查看 ...

  6. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

  7. windows核心编程---第六章 线程的调度

    每个线程都有一个CONTEXT结构,保存在线程内核对象中.大约每隔20ms windows就会查看所有当前存在的线程内核对象.并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入c ...

  8. Windows核心编程 第27章 硬件输入模型和局部输入状态

    第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...

  9. Windows核心编程 第十七章 -内存映射文件(下)

    17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该 ...

随机推荐

  1. #CSS 文本溢出部分显示省略号

    单行结尾溢出: 用text-overflow:ellipsis属性实现,当然还需要加宽度width属来兼容部分浏览. width:300px;overflow: hidden; text-overfl ...

  2. 「长乐集训 2017 Day10」划分序列 (二分 dp)

    「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...

  3. OptParse选项工具模块

    OptParse是一个从Python2.3版本起引入的一个编写命令行工具模块,示例如下 ######example.py###### import optparse if __name__ == &q ...

  4. Highmaps网页图表教程之Highmaps第一个实例与图表构成

    Highmaps网页图表教程之Highmaps第一个实例与图表构成 Highmaps第一个实例 下面我们来实现本教程的第一个Highmaps实例. [实例1-1:hellomap]下面来制作一个中国地 ...

  5. Centos7下shell脚本添加开机自启动

    添加开机自启脚本,注意都需要用绝对路径 psubscribe.sh脚本中的内容: nohup /usr/bin/php -f /data/aliyun51015cn/redisChannel/psub ...

  6. QQ怎么 发送 已经录好的视频

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha QQ发送 已经录好的视频 直接放过去,对方是需要下载的. 只有通过QQ录制的,才是直接就 ...

  7. CodeForces1070A Find a Number 图论

    令状态$f(i, j)$表示模$d$为$i$,和为$j$时的最小数 可以通过$bfs$来转移 然而就没了... 复杂度$O(10ds)$ #include <queue> #include ...

  8. [LOJ#2980][THUSCH2017]大魔法师(线段树+矩阵)

    每个线段树维护一个行向量[A,B,C,len]分别是这个区间的A,B,C区间和与区间长度,转移显然. 以及此题卡常,稍微哪里写丑了就能100->45. #include<cstdio> ...

  9. bzoj 2466 异或方程组

    对于每个灯,我们用一个变量表示其决策,xu=0表示不选,xu=1表示选.因为每个灯最后必须都亮,所以每个等都对应一个异或方程. 解这个异或方程组,有几种情况: 1.存在唯一解(得到的上三角系数矩阵的主 ...

  10. Oracle连接步骤

    JDBC实现数据所有的操作: 数据库连接需要的步骤 1.数据库的驱动程序:oracle.jdbc.driver.OracleDriver; 2.连接地址:jdbc:oracle:thin:@主机地址: ...