博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Win32线程——优先权
阅读量:5843 次
发布时间:2019-06-18

本文共 2536 字,大约阅读时间需要 8 分钟。

《Win32多线程程序设计》–Jim Beveridge & Robert Wiener

Win32 优先权是以数值表现的,并以进程的“优先权类别(priority class)”线程的“优先权层级 (priority level)”和操作系统当时采用的“动态提升(Dynamic Boost)”作为计算基准。 所有因素放在一起,最后获得一个0~31 的数值。拥有最高优先权之线程,即为下一个将执行起来的线程。如果你有一大把 worker 线程,其“优先权类别”和“优先权层级”都相同,那么就每一个轮流执行。这是所谓的 “round robin” 调度方式。如果你有一个线程总是拥有最高优先权,那么它就永远获得 CPU 时间,别人都别玩了。这就是为什么必须明智而谨慎地使用优先权的原因。

优先权类别( Priority Class)

“优先权类别”是进程的属性之一。这个属性可以表现出这一进程和其他进程比较之下的重要性。

优先权类别(Priority Classes) 基础优先权值(base priority)
HIGH_PRIORITY_CLASS 13
IDLE_PRIORITY_CLASS 4
NORMAL_PRIORITY_CLASS 7 or 8(译注:有些资料上写 7 or 9)
REALTIME_PRIORITY_CLASS 24

大部分程序:使用 NORMAL_PRIORITY_CLASS 。少数情况下才会考虑使用其他类别。 

Task Manager:使用 HIGH_ PRIORITY_CLASS,所以即使其他程序处于非常忙碌的状态下,它也总是能够有所反应。 
屏幕保护程序(screen saver ):使用IDLE_PRIORITY_CLASS,只会在 CPU 绝对空闲的时候才执行。 
和时间有密切关系的程序:使用REALTIME_ PRIORITY_CLASS。可以使该进程甚至优于核心进程和设备驱动程序。这个优先权类别不应该用于标准 GUI 程序或甚至于典型的服务器程序。

优先权层级(Priority Level)

调整同一个进程内的各线程的相对重要性。

优先权层级(Priority Levels) 调整值
THREAD_PRIORITY_HIGHEST +2
THREAD_PRIORITY_ABOVE_NORMAL +1
THREAD_PRIORITY_NORMAL 0
THREAD_PRIORITY_BELOW_NORMAL –1
THREAD_PRIORITY_LOWEST –2
THREAD_PRIORITY_IDLE Set to 1
THREAD_PRIORITY_TIME_CRITICAL Set to 15

注意: 对于 REALTIME_PRIORITY_CLASS 的调整值,有点不同于上表所列。

BOOL SetThreadPriority(HANDLE hThread, int nPriority); 

int GetThreadPriority(HANDLE hThread);

动态提升( Dynamic Boost)

决定线程真正优先权的最后一个因素是其目前的动态提升值(Dynamic Boost)。所谓动态提升是对优先权的一种调整,使系统能够机动对待线程,以强化程序的可用性。

Windows系统中的“动态提升”被设定为最大:这使得拥有键盘焦点的程序(前台程序)的优先权得以提升 +2 。这个设定使得前台程序比后台程序获得较多的 CPU 时间,因此即使系统忙碌,前台程序还是容易保持其 UI 敏感度

一个进程的线程:只要线程获得键盘输入,该线程就得到一个 +5 的优先权调整值。这使得该线程有机会处理那个输入,并且提供立即的回应给用户。其他可能引起优先权动态提升的情况还包括鼠标消息、计时器消息等等。

任何一个线程(不限属于哪一个进程):那是在一个“等待状态”获得满足时发生的,例如有一个线程正在等待一个 mutex,当 Wait…() 返回时,该线程的优先权会获得动态提升。这样的提升意味着 critical sections 将尽可能地被快速处理,而等待时间将尽可能地缩短。

(示例:创建初始挂起线程,设置优先级后取消挂起执行)

#include 
#include
#include
DWORD WINAPI Thread(void *arg) { for (int i = 0; i < 5; i++) { printf("Run #%d\n", (int)time(NULL)); Sleep(1000); } return 0;}int main(void) { HANDLE hThread = CreateThread(NULL, 0, Thread, NULL, CREATE_SUSPENDED, NULL); // 创建线程,挂起不执行 SetThreadPriority(hThread, THREAD_PRIORITY_IDLE); // 设置线程优先级 Sleep(3000); printf("resume hThread\n"); ResumeThread(hThread); // 3s后继续执行线程hThread Sleep(3000); printf("suspend hThread\n"); SuspendThread(hThread); // 3s后挂起不执行线程hThread Sleep(3000); printf("resume hThread\n"); ResumeThread(hThread); // 3s后继续执行线程hThread WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); return 0;}

参考链接:

转载地址:http://ckqcx.baihongyu.com/

你可能感兴趣的文章
算法 - 最好、最坏、平均复杂度
查看>>
MySQL 不落地迁移、导入 PostgreSQL - 推荐 rds_dbsync
查看>>
二叉树的蛇形遍历 leetcode 103
查看>>
Linux设备驱动之IIO子系统——IIO框架及IIO数据结构
查看>>
【Util】 时间天数增加,时间比较。
查看>>
[Erlang 0004] Centos 源代码编译 安装 Erlang
查看>>
51 Nod 1027 大数乘法【Java大数乱搞】
查看>>
20.4. myisamchk — MyISAM Table-Maintenance Utility
查看>>
三维重建技术概述
查看>>
Go语言与数据库开发:01-09
查看>>
Python连续攀升,其他的脚本语言去哪了?
查看>>
socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少
查看>>
中文分词之HMM模型详解
查看>>
山东青岛市南区:创建"物联网" 信息化管理涉案财物
查看>>
《爆发》作者:大数据领域将有新赢家
查看>>
AI x 量化:华尔街老司机解密智能投资正确姿势
查看>>
IT史上十大收购案
查看>>
数据切分——Atlas介绍
查看>>
云计算时代,互联网金融背后的想象空间
查看>>
游戏引擎cocos2d-android使用大全
查看>>