浅谈Windows 上的线程亲和性(Thread affinity)

2024-05-08 21:12

本文主要是介绍浅谈Windows 上的线程亲和性(Thread affinity),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        线程属性包括是否分离、亲和性、调度策略和优先级等。Linux默认的调度策略是CFS(完全公平调度算法),而 Windows 是基于优先级抢占式的策略。

        在这些方面,Windows 和 Linux 差异巨大。本文仅针对 Windows 系统的线程亲和性进行探讨。

线程亲和性(Thread affinity)

什么是线程亲和性(Thread affinity)?

        线程亲和性(Thread affinity)指进程和 CPU 核的亲和性,即线程在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。

        通俗的说就是将线程绑定到 CPU 上某一个或多个核上。注意,此处的核是指逻辑核心,而非物理核心。

        称为线程绑定CPU,更好理解一些。

为什么要设置线程亲和性(Thread affinity)?

        简单说,为了提升执行效率。

        首先,这个问题是随着CPU多核多线程技术而来的。

        对于应用程序来说,感知到的是逻辑CPU,物理 CPU(主板上插着的CPU)包含多个核心,如常说8核CPU,就对应了8个逻辑CPU。超线程技术(Hyper-Threading)进一步,利用特殊的硬件指令将两个逻辑CPU模拟成两个两个物理CPU,实现了多核多线程。

        最终,逻辑CPU数量 = 物理CPU数量 x CPU cores x 2(如果支持并开启HT)

        在多核系统上,操作系统通常可以在不同内核之间自由移动进程和线程,以确保整体工作负载均匀分布在可用内核上。这在通用计算机(如同时运行大量应用程序的笔记本电脑)上非常有用。

        但是,移动进程和线程可能会导致性能问题。

        每个 CPU 有独立的缓存,即CPU cache(高速缓冲存储器)。缓存着进程、线程的数据。在不绑定 CPU 的情况下,线程会被系统调度到其他 CPU 上,CPU cache 命中率很低,需要从内存、硬盘加载对应的数据,代价非常昂贵。而绑定 CPU 后,线程始终(或大概率)跑在指定的CPU上,性能会有进一步的提升。        

       

        通过绑定CPU,减少上下文切换、缓存未命中和内存访问延迟提高了程序的执行效率。

什么时候需要设置线程亲和性(Thread affinity)?

        那么,是不是任何时候将线程绑定到特定 CPU 就能达到最佳执行效率呢?        

        不!

        设置线程亲和性通常是为了优化特定类型的应用程序的性能,特别是在那些对性能要求极高的场景中。例如高性能计算(High-Performance Computing, HPC)、实时系统(Real-time Systems)、数据库、多级缓存优化、特定硬件操作等。

        对于大多数常规的应用程序,操作系统的调度器已经足够智能,能够根据当前的系统负载和资源使用情况做出合理的调度决策。强制设置线程亲和性可能不会带来显著的性能提升,甚至可能引起一些问题,如资源利用率不均、系统响应性下降、兼容性问题、热管理问题甚至性能下降。

        在大多数情况下,让操作系统的调度器来管理线程调度是更好的选择。

如何设置线程亲和性

        在 Windows 上,通过任务管理器即可手动调整。     

这篇关于浅谈Windows 上的线程亲和性(Thread affinity)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971447

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、