浅谈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 上,通过任务管理器即可手动调整。     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701369.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32如何使用PSRAM

ESP32的内部RAM的设计做了内存扩展。您可以通过寻址高达4MB的外部SPI RAM内存来进一步扩展它。在本文中,探讨如何在项目中使用PSRAM,针对ESP32-WROVER模块进行特别的讨论。 关键问题: 如何确保PSRAM在应用程序代码中可用?如何分…

HOOPS Visualize:工业级3D可视化SDK,打造移动端和PC端工程应用程序

HOOPS Visualize是一种高性能的软件开发工具包(SDK),旨在帮助开发人员轻松构建和集成高质量的3D可视化功能。这是一种全功能的,以工程为重点的场景图技术,我们称为Core Graphics。Core Graphics可集成到一个框架中&…

uniapp高性能图片裁剪插件,可添加水印

效果图&#xff1a; 插件地址&#xff1a;高性能图片裁剪&#xff0c;裁剪图片后自动添加水印 - DCloud 插件市场 示例&#xff1a; <template> <view><button click"select">选择图片</button><image mode"widthFix" :src&qu…

鸿蒙内核源码分析 (内核启动篇) | 从汇编到 main ()

这应该是系列篇最难写的一篇&#xff0c;全是汇编代码&#xff0c;需大量的底层知识&#xff0c;涉及协处理器&#xff0c;内核镜像重定位&#xff0c;创建内核映射表&#xff0c;初始化 CPU 模式栈&#xff0c;热启动&#xff0c;到最后熟悉的 main() 。 内核入口 在链接文件…

python的标准数据类型

四、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色&#xff1a; 对机器而言&#xff0c;类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言&#xff0c;类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

LQ杯当时的WP

RC4 32位程序用IDA打开看看 进行反汇编 RC4提示&#xff0c;就是一个加密 在sub_401005函数中找到输出的变量&#xff0c;并且立下断点 动调 Packet 字符串搜索flag 看到是给192.168.11.128发送了cat flag的命令 看到它回传 Base64加密了 解一下密码就可以 CC 密码这…

2024年【电工(高级)】考试题及电工(高级)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;高级&#xff09;考试题是安全生产模拟考试一点通总题库中生成的一套电工&#xff08;高级&#xff09;考试报名&#xff0c;安全生产模拟考试一点通上电工&#xff08;高级&#xff09;作业手机同步…

如何快速在线做视频二维码?在线视频生码的3步操作技巧

现在很多人会选择生成二维码的方式来查看视频内容&#xff0c;将视频生成二维码后分享给其他人在手机扫码查看&#xff0c;有利于提升视频内容传播的速度&#xff0c;提高用户获取视频的便捷性。视频二维码有很多的用途可以使用&#xff0c;比如使用教程、个人展示、产品介绍、…

漫谈AI时代的手机

以chatGPT 为代表的大语言的横空出世使人们感受到AI 时代的到来&#xff0c;大语言模型技术的最大特点是机器能”懂人话“&#xff0c;”说人话“了。如同历史上任何一个革命性工具的出现一样&#xff0c;它必将对人类生活和工作产生巨大的影响。 在这里。我们不妨畅想一下啊AI…

【C++语言】动态内存管理

文章目录 前言内存管理数据存储位置C语言动态内存管理方式C动态内存管理方式&#xff1a;new/deleteoperator new与operator delete函数new和delete的实现原理定位new表达式&#xff08;了解&#xff09;常见面试题 总结C语言系列学习目录 前言 本章要介绍的是动态内存管理&am…

网络工程师----第二十七天

计算机基 第四章&#xff1a;网络层 网络层提供服务的特点&#xff1a;网络层向上只提供简单的、无连接的、尽最大努力交付的数据报服务&#xff0c;不保证可靠通信。 网际协议IP&#xff1a; *地址解析协议ARP(Address Resolution Protocol) *网际控制报文协议ICMP(Inter…

Android 集成Bugly完成线上的异常Exception收集及处理

文章目录 &#xff08;一&#xff09;添加产品APP&#xff08;二&#xff09;集成SDK&#xff08;三&#xff09;参数配置权限混淆 &#xff08;四&#xff09;初始化 &#xff08;一&#xff09;添加产品APP 一&#xff09;在个人头像 -> 我的头像 -> 新建产品 二&…