《Windows核心编程》第7章 线程调度、优先级和关联性

墨水屏高效开发:架构、开源库与实战优化指南 嵌入式显示技术中,电子墨水屏以其类纸观感和超低功耗特性,在电子书阅读器、智能办公本及工业仪表等场景中占据独特地位。其工作原理基于微胶囊电泳技术,仅在画面刷新时消耗电能,静态显示时功耗近乎为零,这带来了极致的续航优势。为实现流畅的交互体验,开发者需构建分层渲染架构,通过硬件抽象层统一驱动接口,并引入帧缓冲与差异比较算法智能决策局部刷新区域,从而大幅降低刷新延迟与功耗。开源库如GxEPD2和LVGL为墨水屏适配提供了关键支持,结合波形文件管理与电源优化策略,能有效解决残影与卡顿问题。本文聚焦于eink墨水屏高效 阅读详情

每个线程都有一个上下文,后者保存在线程的内核对象中。这个上下文反映了线程 执行时CPU寄存器的状态。

Windows被称为抢占式多线程操作系统,它可以在任何时刻停止一个线程而另行调度另外一个线程。

如果ResumeThread函数成功,它将返回线程的前一个挂起计数;否则它将返回0xFFFFFFFF。一个线程可以被多次挂起。线程被挂起多少次,就必须恢复多少次,这样才能变为可调度状态。挂起线程可以使用SuspendThread函数,它也返回线程之前的挂起计数。

线程可以通过调用Sleep函数告诉系统,在一段时间内自己不需要调度。关于Sleep函数,需要注意几点:
●    调用Sleep函数,这将使线程自愿放弃属于它的时间片中剩余的部分。
●    系统设置线程不可调度的时间只是“近似于”所设定的毫秒数。
●    可以给Sleep传入参数INFINITE,这是在告诉系统,永远不要调度这个线程。
●    可以给Sleep传入参数0,这是在告诉系统,主调线程放弃了时间片的剩余部分,它强制系统调度其他线程。但是系统也有可能重新调度刚刚调用了Sleep的那个线程。

系统提供名为SwitchToThread函数,如果存在另一个可调度线程,那么系统会让此线程运行。通过这个函数,需要某个资源的线程可以强制一个可能拥有该资源的低优先级的线程放弃资源。调用SwitchToThread和调用Sleep并传入0ms超时类似。区别在于,前者允许执行低优先级线程,后者会立即重新调度主调线程,即使低优先级线程还处于饥饿状态。

如果要想知道一个线程已经获得CPU调度时间量,可以使用GetThreadTimes函数。其函数原型为:BOOL GetThreadTimes(
            HANDLE hThread,             //以下时间都用100ns为单位
            PFILETIME pftCreateTime,//返回线程创建时间的绝对值
            PFILETIME pftExitTime,//返回线程退出时间的绝对值,用100ns为的单位
                PFILETIME pftKernelTime,//返回线程执行内核模式下的操作系统代码所用
                                           时间的绝对值
            PFILETIME pftUserTime//返回线程执行应用代码所用时间的绝对值
            );

我们可以调用GetThreadContext来查看线程的内核对象的内部,并获取当前CPU寄存器的集合。一个线程实际上有两个上下文(CONTEXT):用户模式和内核模式。同样我们可以通过调用SetThreadContext来改变结构中的成员,并把新的寄存器值放回到线程的内核对象中。注意,这里在调用GetThreadContext还是SetThreadContext之前,都应该调用SuspendThread来暂停线程。

较高优先级的线程总是会抢占较低优先级的线程,无论较低优先级的线程是否正在执行。例如,如果有一个优先级为5的线程正在执行,而系统确定有较高优先级的线程已经准备好可以运行,它会立即暂停较低优先级的线程(即使后者的时间片还没有用完),并将CPU分配给较高优先级的线程,该线程获得一个完整的时间片。

系统启动时,将创建一个名为页面清零线程的特殊线程。该线程的优先级为0,它是整个系统中唯一一个优先级为0的线程。页面清零线程负责在没有其他进程需要执行的时候,将系统内存中的所有闲置页面清零。

进程优先级和相对线程优先级与优先级值的映射



进程永远不能调度,能调度的是线程。进程 优先级只是微软提出的一个抽象概念。进程可以通过调用SetPriorityClass/GetPriorityClass来设置或获取自己的优先级。通过命令行界面调用程序时,程序的起始优先级是normal。但如果使用START命令调用程序,可以使用一个开关指定的起始优先级。如下所示命令将以idle优先级运行计算器程序:
C:/>START /LOW CALC.EXE

为了设置/获取线程的相对优先级,可调用函数SetThreadPriority/GetThreadPriority。

系统通过线程的相对优先级加上线程所属进程的优先级来确定线程的优先机值。这个优先级值也被称为线程的基本优先级值。线程的当前优先级低于线程的基本优先级。

函数SetProcessPriorityBoost允许或禁止系统提升一个进程中所有线程的优先级;而函数SetThreadPriorityBoost则允许或禁止提升某个线程的优先级。这两个函数都有相应的用来判断当前是否启用优先级提升的函数:
GetProcessPriorityBoost/GetThreadPriorityBoost。
 


不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤 不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤 一般情况下,我们使用西门子的S7通信时都是将网络中的PLC的IP设置在同一网段,那么如果涉及到旧项目改造时,不方便修改IP地址,只能进行2个网段通信时,可以参考以下步骤: 准备条件: 2个路由器 CPU 1212C 主动连接 CPU 314C-2PN/DP 被动连接 网络搭建如下图所示: S7-1212C一侧 建立S7主动连接 ,IP地址:192.168.5.40,编写get/put 通信程序 S7-300 IP地址:192.168.0 阅读详情

相关推荐

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

windows核心编程7

 第7章线程的调度、优先级和亲缘性抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间。每个线程拥有一个上下文结构的,这个结构维护在线程的内核对象中。这个上下文结构反映了线程上次运行时该线程的C P U寄存器的状态。每隔2 0 m s左右,Wi n d o w s要查看当前存在的所有线程内核对象。在这些对象中,只有某些对象被视为可以调度的对象。Wi n d o

freedom0203的专栏 1167

Elsevier期刊LaTeX双栏模板(cas-dc)实战:从Overleaf配置到投稿全流程

本文详细介绍了Elsevier期刊LaTeX双栏模板(cas-dc)在Overleaf平台上的配置与使用全流程,包括模板结构解析、标题与作者信息规范、摘要与关键词特殊格式、正文写作技巧、参考文献管理以及投稿前检查清单。特别针对Elsevier期刊投稿需求,提供了从模板安装到最终投稿的实用指南,帮助研究者高效完成论文排版工作。

weixin_28455801的博客 1323

[笔记]Windows核心编程《七》用户模式下的线程同步

参考1 文章目录原子访问:Interlocked 系列函数原子访问原子 加原子 设值原子 比较交换地址实现旋转锁高速缓存行结构体设计高级线程同步关键段Slim 读/写锁AcquireSRWLockExclusive(&g_lock);ReleaseSRWLockExclusive(&g_lock);条件变量SleepConditionVariableCS/SleepConditionVariableSRWWakeConditionVariable/WakeAllConditionVariab

二次元怪兽的博客 880

FSMC驱动LCD显示屏学习2

液晶显示器,简称 LCD(Liquid Crystal Display)相对于上一代 CRT 显示器 (阴极射线管显示器),LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备液晶是一种介于固体和液体之间的特殊物质,它是一种有机化合物,常态下呈液态,但是它的分 子排列却和固体晶体一样非常规则,因此取名液晶。

usjjjsj的博客 1695

ISP调试工程师相关面试问题_001

Qualcomm、MTK等ISP pipeline的框架原理及算法原理,还有调试经验。

notgoodenouf的博客 3549

Windows下多线程编程

前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常。Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求。 进程与线程 1. 进程的概念 进程就是正在运行的程序。主要包括两部分: • 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。 • 另一个是地址空间...

qq_32619837的博客 1万+

本体研究综述(转)

(这篇文章是从http://imarine.blog.163.com/中转载过来的,个人觉得对本体的介绍比较全面!)本体综述本体作为一种能在语义和知识层次上描述领域概念的建模工具,其目标是捕获相关领域的知识,确定该领域内共同认可的词汇,通过概念之间的关系来描述概念的语义,提供对该领域知识的共同理解。语义Web(the Semantic Web)是在本体理论基础之上对现有Web所进行的扩展[

zhenshideni611的专栏 1838

Windows核心编程:第7章 线程调度、优先级和关联性

Github https://github.com/gongluck/Windows-Core-Program.git //第7章 线程调度、优先级和关联性.cpp: 定义应用程序的入口点。 // #include "stdafx.h" #include "第7章 线程调度、优先级和关联性.h" //线程函数 DWORD WINAPI ThreadProc(PVOID param) { ...

weixin_30763455的博客 147

L2正则化与Ridge回归的关系

非常感谢您提供的详细任务描述和要求。我会尽力按照您的指引来撰写这篇技术博客文章。 L2正则化与Ridge回归的关系 1. 背景介绍 机器学习模型在训练过程中容易出现过拟合的问题,这会导致模型在训练集上表现很好但在测试集上泛化性能较差。为了解决这一问题,正则化技术应运而生。其中

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 659

汇川AM系列ethercat控制伺服的使用说明(含转矩模式)

本文以一个实际例子,介绍ethercat伺服驱动器的工作原理,以及在汇川AM系列PLC中,如何点动、定位、速度、转矩控制ethercat伺服。

qq_34047402的博客 5111

windows核心编程之线程调度、优先级和关联性

文章目录1. 线程的挂起和恢复2. 进程的挂起和恢复3. 睡眠4. 切换到另一个进程5.线程的执行时间6. 线程优先级7. 优先级编程7.1 进程7.2 线程8. 动态提升线程优先级 抢占式操作系统必须使用某种算法确定对何时应对哪些线程进行调度,时间又为多长。 1. 线程的挂起和恢复 在线程内核对象中有一个值表示线程的挂起计数。调用CreateProcess或者 CreateThread时,系统将创建线程内核对象,并把挂起计数初始化为1。这样,就不会给这个线程调度CPU了。这正是我们所希望的,因为线程初始化

超级大洋葱的博客 2421

运行codex时出现登录失败:failed to start login server: 以一种访问权限不允许的方式做了一个访问套接字的尝试。 (os error 10013) 解决方案

本文主要介绍了运行codex时出现登录失败:failed to start login server: 以一种访问权限不允许的方式做了一个访问套接字的尝试。 (os error 10013) 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

《Windows核心编程》读书笔记七 线程调度,优先级和关联性

第七章 线程调度,优先级和关联性 本章内容 7.1 线程的挂起和恢复 7.2 进程的挂起和恢复 7.3 睡眠 7.4 切换到另一个线程 7.5 在超线程CPU上切换到另一个线程 7.6 线程的执行时间 7.7 在实际上下文中谈CONTEXT结构 7.8 线程优先级 7.9 从抽象角度看优先级 7.10 优先级编程 7.11 关联性 CONTEXT反应了线程上一次执

sesiria的博客 1759

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Windows核心编程(六)线程调度、优先级和关联性

1、每个线程都有一个上下文CONTEXT结构,保存在线程内核对象中。 这个上下文反映了线程上一次执行时CPU寄存器的状态。大约每隔20ms windows就会查看所有当前存在的线程内核对象。并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入cpu寄存器。这被称为上下文切换。(Windows实际上会记录每个线程运行的次数)。 大约又过20ms  windows将当前cpu寄

woshibendangao的专栏 1356

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

windows 核心编程 (线程调度,优先级和关联性)

<br />1、windows是抢占式多线程操作系统<br />  <br />    系统可以在任何时刻停止一个线程而另行调度另一个线程。<br />    我们无法保证线程总在运行,线程会获得整个处理器,系统将不允许运行其他线程。<br />    系统只调度可调度的线程,事实上,系统大多数线程都不是可调度的。有些线程对象的挂起计数大于0,这意味着该线程已经被挂起,不应该给它调度任何CPU时间。<br />    除了被挂起的线程外,还有其他很多线程无法调度,因为它们都在等待某种事件发生。<br /> 

wangsifu2009的专栏 1859

Windows核心编程——第7章 线程调度

线程的挂起和恢复         调用CreateProcess或CreateThread函数时,系统将创建线程内核对象,并把挂起计数初始化为1,在线程初始化之后,CreateProcess或CreateThread函数将查看是否有CREATE_SUSPENDED标志传入,如果有函数会返回并让新的线程处于挂起状态,否则函数会将线程的挂起计数挂起计数减为0,线程将成为可调度的。

Zane_Yu的专栏 698

Windows核心编程笔记(七) 线程调度 优先级 关联性

首先线程与系统时钟间隔参见http://blog.youkuaiyun.com/wangpengk7788/article/details/54287947 在抢占式多任务操作系统中,线程的运行是有限制的,系统会调度一个线程在一个时间块内占用CPU,在时间到了之后将线程的上下文(CONTEXT结构,保存线程切换前的CPU个寄存器的值)保存到线程内核对象中,从另一个可调度线程的CONTEXT中获取属于它的CP

春暖花开 5283

《Windows核心编程》——七 线程调度、优先级和关联性

前言     每个线程都有一个上下文(CONTEXT),后者保存在线程的内核对象中。这个上下文反映了线程上一次执行时CPU寄存器的状态。大约每隔20ms,Windows都会查看所有当前存在的线程内核对象。在这些对象中,只有一些被认为是可调度的。Windows在可调度的线程内核对象中选择一个,并将上次保存在线程上下文的值载入CPU寄存器。这一操作被称为上下文切换。Windows实际上会记录每个线程

andylauhuang2012的专栏 896

[笔记]Windows核心编程《十八》堆栈

文章目录前言一、进程的默认堆栈二、为什么要创建辅助堆栈2.1 保护组件2.2 更有效的内存管理2.3 进行本地访问2.4 减少线程同步的开销2.5 迅速释放堆栈三、如何创建辅助堆栈3.1 从堆栈中分配内存块3.2 改变内存块的大小3.3 了解内存块的大小3.4 释放内存块3.5 撤消堆栈3.6 用C + +程序来使用堆栈四、其他堆栈函数总结 前言 windows 对内存进行操作的机制: 虚拟内存 文件映射 堆栈 使用堆栈场景: 堆栈可以用来分配许多较小的数据块。 例如,若要对链接表和链接树进行管理,最

二次元怪兽的博客 1398

day4 windows核心编程总结 第二部分工作机理

第四章 进程 一、进程定义:分为两个部分 1、进程内核对象,一个内存块,一个数据结构,维护该内核对象的某些属性 。地址所在:我猜在内存中 2、进程地址空间,包含可执行文件或者dll模块的代码和数据。还包含动态内存分配。比如线程堆栈和堆的分配。地址所在:我猜在磁盘中 二、进程启动 启动流程:嵌入启动函数->入口点函数->入口点函数返回->嵌入启动函数返回 三、Creat...

qq_38188958的博客 496

Windows游戏性能优化:从资源调度原理到自动化脚本实践

在计算机系统中,资源调度是操作系统核心功能之一,它决定了CPU时间片、内存、磁盘I/O和GPU处理能力如何分配给各个进程。其基本原理是通过优先级队列和调度算法,在多任务环境下平衡系统响应与公平性。对于游戏这类对实时性要求极高的应用,资源调度的价值在于确保前台进程能获得充足且稳定的计算资源,从而提升帧率稳定性和加载速度。在实际应用场景中,后台进程(如杀毒软件、云同步服务)的资源争抢常导致游戏卡顿。通过调整进程优先级、CPU关联性和磁盘I/O策略,可以系统性地优化资源分配。本文聚焦于**游戏性能优化**和**自

weixin_34166847的博客 473

[笔记]Windows核心编程《二十》DLL的高级操作技术

文章目录前言一、DLL模块的显式加载和符号链接1.1 显式加载D L L模块1.2 显式卸载D L L模块1.3 显式链接到一个输出符号二、DLL的进入点函数2.1 DLL_PROCESS_ATTACH通知2.2 DLL_PROCESS_DETACH通知2.3 DLL_THREAD_ATTACH通知2.4 DLL_THREAD_DETACH通知2.5 顺序调用DllMain2.6 DllMain与C/C++运行期库三、延迟加载DLL四、函数转发器五、已知的DLL六、DLL转移七、改变模块的位置八、绑定模块总

二次元怪兽的博客 1446

[笔记]Windows核心编程《一》错误处理、字符编码

windows核心编程1.vs选中函数 按下f1 可进入msdn网页 函数具体详情2.vsF5运行,Cirl+F5 无调试运行,F7编译,3.工具栏-》错误查找 工具可以查找错误码对应的错误含义。

二次元怪兽的博客 1619

[笔记]Windows核心编程《十三》windows内存体系结构

参考 文章目录13.1 进程的虚拟地址空间进程的虚拟地址空间32位进程64位进程13.2 虚拟地址空间的分区13.2.1 空指针赋值区地址范围目的13.2.2 用户模式分区1.在x86 Windows下得到更大的用户模式分区2.在64位windows下得到2GB用户模式分区13.2.3 64KB禁入分区13.2.4 内核模式分区13.3 地址空间中区域预定地址空间中的一块区域13.4 给区域调拨物理储存器13.5 物理存储器和页交换器13.6 页面保护属性13.7 实例分析13.8 数据对齐的重要性 13.

二次元怪兽的博客 1712

AMD锐龙跑3DMax必看!这样设置CPU关联性让渲染效率翻倍(7800X实测)

本文针对AMD锐龙处理器在3DMax渲染中系统卡顿、效率低下的问题,提供了详细的性能调优指南。通过实测锐龙7 7800X,重点介绍了如何利用任务管理器设置CPU关联性和进程优先级,有效平衡渲染速度与系统响应性,实现渲染效率的显著提升。

weixin_29231221的博客 270
上一篇: 《Windows核心编程》第6章 线程基础
下一篇: 《Windows核心编程》第8章 用户模式下的线程同步
sockpuppet007
博客等级 码龄16年 4粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值