为什么要把进程/线程绑定到特定cpu核上运行?(cpu core id coreIdx)opdevsdk_sys_bindThreadCoreId()

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么要把进程/线程绑定到特定cpu核上运行?(cpu core id coreIdx)opdevsdk_sys_bindThreadCoreId()相关的知识,希望对你有一定的参考价值。

看海康hikflow_demo代码,在线程处理函数里调用了绑定函数,把这个线程绑定到某个cpu核上,不知为何要这么做?

原因

答1

现在大家使用的基本上都是多核cpu,一般是4核的。平时应用程序在运行时都是由操作系统管理的。操作系统对应用进程进行调度,使其在不同的核上轮番运行。

对于普通的应用,操作系统的默认调度机制是没有问题的。但是,当某个进程需要较高的运行效率时,就有必要考虑将其绑定到单独的核上运行,以减小由于在不同的核上调度造成的开销。

把某个进程/线程绑定到特定的cpu核上后,该进程就会一直在此核上运行,不会再被操作系统调度到其他核上。但绑定的这个核上还是可能会被调度运行其他应用程序的。

参考文章:linux下把进程/线程绑定到特定cpu核上运行

答2

C语言作为语言本身,并没有强制把线程、进程绑定到特定CPU核的要求和机制,绑定的方法有,与硬件架构和操作系统密切相关,但与C语言无关。

线程、进程绑定cpu内核的原因是为了优化、加速运行或者特定CPU架构和操作系统要求,特别是操作系统要求(及实现)。

最传统的多核架构是SMP,每个CPU核完全平等甚至无法区分,cache,内存都是全局的,在这种情况下,绑定CPU核无意义,而且也违背架构设计的基础:对上层OS和应用透明。但随着CPU核增多,SMP架构的全局平等方案导致用于一致性、互联的实现成本越来越高(互联电路、冲突处理等等),最后当CPU核心很多时,通用计算系统不得不采用更经济的架构,例如NUMA这种一层一层局部互联、分组互联,最终全局互联的方案,这时候绑定CPU就有意义了,其实也是需要通过绑定CPU核配合CPU核之间不再是完全平等的,是有所谓“远、近”区别的。绑定的目的是使存放该线程、进程的存储(内存、cache)与运行这些数据指令的CPU核更贴近,而不用从远处的内存、cache获取(因为内存、cache访问不再是全局的,而是局部的,只是具有虚拟的全局可访问性)。这种方案一般只在操作系统调度算法中会显式使用,其它程序基本不会主动去探测,因为线程、进程自己没有能力去强制改变运行自己的CPU核,只能检测。检测出来运行自己的CPU核之后,难道自己把自己挂掉?依然没效率。所以除了编写OS中进程、线程调度算法部分,你是看不到有关指令的。

大部分相关指令是一种编程技巧,就是利用CPU核自身ID去获得唯一的数据队列标志,每个CPU核分配一个队列(一般是环形队列),这样就物理上保证了队列不会有多个consumer或producer,天然不用考虑锁问题。在操作系统和驱动程序编程中,经常用到这种技巧。

参考文章:C语言为什么要把线程/进程绑定到特定的cpu核运行? - harry4112的回答 - 知乎

以上是关于为什么要把进程/线程绑定到特定cpu核上运行?(cpu core id coreIdx)opdevsdk_sys_bindThreadCoreId()的主要内容,如果未能解决你的问题,请参考以下文章

Linux 进程线程运行在指定CPU核上

如何查看linux线程 运行在哪个cpu核上

绑定 Nginx 进程到不同的 CPU 上

java能利用多核cpu吗

netty系列之:在netty中实现线程和CPU绑定

netty系列之:在netty中实现线程和CPU绑定