發乙個多CPU中程序與CPU繫結的例子

2021-05-24 01:54:18 字數 2110 閱讀 1500

現在多cpu的趨勢越來越大了. 有時候為了更好地操作機器, 需要將某個程序繫結到具體的cpu上去. 下面給出了乙個程序繫結到具體的cpu上去的乙個例子.

下面是在兩個終端分別執行了./cpu 0  ./cpu 2 後得到的結果. 效果比較明顯.

cpu0  :  5.3%us,  5.3%sy,  0.0%ni, 87.4%id,  0.0%wa,  0.0%hi,  2.0%si,  0.0%st

cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

cpu2  :  5.0%us, 12.2%sy,  0.0%ni, 82.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

cpu4  :  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.3%wa,  0.0%hi,  0.0%si,  0.0%st

cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

cpu affinity (cpu親合力)

cpu親合力就是指在linux系統中能夠將乙個或多個程序繫結到乙個或多個處理器上執行.

乙個程序的cpu親合力掩碼決定了該程序將在哪個或哪幾個cpu上執行.在乙個多處理器系統中,設定cpu親合力的掩碼可能會獲得更好的效能.

乙個cpu的親合力掩碼用乙個cpu_set_t結構體來表示乙個cpu集合,下面的幾個巨集分別對這個掩碼集進行操作:

cpu_zero() 清空乙個集合

cpu_set()與cpu_clr()分別對將乙個給定的cpu號加到乙個集合或者從乙個集合中去掉.

cpu_isset()檢查乙個cpu號是否在這個集合中.

其實這幾個的用法與select()函式那幾個呼叫差不多.

下面兩個函式就是最主要的了:

sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)

該函式設定程序為pid的這個程序,讓它執行在mask所設定的cpu上.如果pid的值為0,則表示指定的是當前程序,使當前程序執行在mask所設定的那些cpu上.第二個引數cpusetsize是

mask所指定的數的長度.通常設定為sizeof(cpu_set_t).如果當前pid所指定的cpu此時沒有執行在mask所指定的任意乙個cpu上,則該指定的程序會從其它cpu上遷移到mask的指定的

乙個cpu上執行.

sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)

該函式獲得pid所指示的程序的cpu位掩碼,並將該掩碼返回到mask所指向的結構中.即獲得指定pid當前可以執行在哪些cpu上.同樣,如果pid的值為0.也表示的是當前程序.

這幾個巨集與函式的具體用法前面已經有講解.

關於cpu_set_t的定義

在我的機器上sizeof(cpu_set_t)的大小為128,即一共有1024位.第一位代表乙個cpu號.某一位為1則表示某程序可以執行在該位所代表的cpu上.例如

cpu_set(1, &mask);

則mask所對應的第2位被設定為1.

此時如果printf("%d/n", mask.__bits[0]);就列印出2.表示第2位被置為1了.

具體我是參考man sched_setaffinity文件中的函式的.

然後再參考了一下ibm的 developerworks上的乙個講解.

鎖定程序只用乙個CPU

昨天除錯osg程式的時候很鬱悶啊,好像是osg有一些bug,我那個程式如果在多個cpu上執行的話就會出現一些莫名其妙的問題。我想可能是執行緒爭用的問題。我在任務管理器裡面將程式設定為只使用乙個cpu,問題就解決了,很奇怪。現在還沒有時間找什麼原因引起的,而每次除錯都要去設定cpu關係很麻煩。只好寫了...

定義乙個CPU類

定義乙個cpu類,包含等級 rank 頻率 frequency 電壓 voltage 等屬性,有兩個共有成員函式run stop。其中,rank為列舉型別定義為enum cpu ranl,frequency為單位是mhz的整數,voltage為浮點型的電壓值。觀察建構函式和析構函式的呼叫順序。inc...

乙個手機有幾個cpu???

是乙個晶元上有幾個cpu還是只有乙個cpu,然後乙個cpu中是多核?乙個智慧型手機有幾個晶元,幾個cpu,cpu和微控制器的區別 手機只有乙個cpu,但是晶元就多了啊,首先手機有運存吧,一般這顆ic叫做sdram,然後64g記憶體,這個ic叫flash,這是最重要的3棵晶元,其他一些小晶元就不一一舉...