我有一個簡單的單線程應用程序在做幾乎純加工無法完全分配CPU爲我的過程
- 它同樣採用了尺寸
- 的兩個int緩衝區它讀取一個逐第一緩衝
- 每個值之一中的所有值是在所述第二緩衝器中的隨機索引
- 它讀取在第二緩衝器中的索引處的值
- 它總結從第二緩衝器採取的所有值
- 它完成了所有的前面的步驟越來越大
- 最後,我打印的份數自願和非自願CPU上下文切換
如果緩衝區的大小變得相當大了,我的電腦開始變慢:爲什麼呢?我有4個超線程核心,所以3個核心都是剩餘的。只有一個是百分之百忙碌。是否因爲我的過程幾乎100%用於「RAM總線」?
然後,我創建了一個CPU集,我想獻給我的過程(我的CPU-集包含相同的核心的兩個CPU線程)
$ cat /sys/devices/system/cpu/cpu3/topology/core_id
3
$ cat /sys/devices/system/cpu/cpu7/topology/core_id
3
$ cset set -c 3,7 -s my_cpuset
$ cset set -l
cset:
Name CPUs-X MEMs-X Tasks Subs Path
------------ ---------- - ------- - ----- ---- ----------
root 0-7 y 0 y 934 1/
my_cpuset 3,7 n 0 n 0 0 /my_cpuset
似乎完全沒有任務在所有正在我的CPU集上運行。我可以重新啓動我的程序,它運行時,我啓動:
$ taskset -c 7 ./TestCpuset # Here, I launch my process
...
$ ps -mo pid,tid,fname,user,psr -p 25244 # 25244 being the PID of my process
PID TID COMMAND USER PSR
25244 - TestCpus phil -
- 25244 - phil 7
PSR = 7:我的過程是預期的CPU線程上運行良好。我希望這是唯一一個就可以了,但在運行結束,我的過程顯示:
Number of voluntary context switch: 2
Number of involuntary context switch: 1231
如果讓我不由自主的上下文切換,這意味着其他進程在我的核心運行:這怎麼可能?我必須做些什麼才能獲得無意識上下文切換的數量= 0?
最後一個問題:當我的進程正在運行,如果我再次推出
$ cset set -l
cset:
Name CPUs-X MEMs-X Tasks Subs Path
------------ ---------- - ------- - ----- ---- ----------
root 0-7 y 0 y 1031 1/
my_cpuset 3,7 n 0 n 0 0 /my_cpuset
我讓我的CPU設置0的任務。但我知道有一個過程在運行:似乎任務不是一個過程?