新負責的程序采用生產者和消費者的模式,生產者的速度非常快,數據幾乎都在內存裡,處理起來很快。而消費者要頻繁的I/O。所以打算給生產者和消費者分配不一樣的核心。
生產者只需要一個核心就夠了,其余分配給消費者。
查了下這方面的資料,shell端有taskset命令可用。
taskset:
-p 正在運行的進程pid
-c 列表形式顯示指定cpu
-v version
-h help
用法:i.e.
# taskset -cp 1,2,3 4321
# taskset -c 1,2,3-5 /usr/bin/XXX
linux提供了兩個函數
sched_set_affinity()
(用來修改位掩碼)sched_get_affinity()
(用來查看當前的位掩碼)cpu_affinity
會被傳遞給子線程,因此應該適當地調用 sched_set_affinity
每個核心對應一位掩碼,相應位設為1
為每個線程設置 CPU 親和性(affinity)
cpu_set_t mask; /* CPU_ZERO initializes all the bits in the mask to zero. */ CPU_ZERO( &mask ); /* CPU_SET sets only the bit corresponding to cpu. */ CPU_SET( created_thread, &mask ); /* sched_setaffinity returns 0 in success */ if( sched_setaffinity( 0, sizeof(mask), &mask ) == -1 ) { printf("WARNING: Could not set CPU Affinity, continuing...\n"); }
獲取系統處理器數量
int NUM_PROCS = sysconf(_SC_NPROCESSORS_CONF);