为什么要把进程/线程绑定到特定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()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像间距pitch是什么?(linesi
- 下一篇: 结构体命名中的尾标ST是什么意思?(st