菜鳥的三年成長史

鎖定thread在特定CPU

這篇其實是multithreaded UDP server的續章,為什麼需要『鎖定thread在特定CPU』?

因為在Linux上,每一個thread其實就是一個獨立的process,因此在context switch上,一條thread一定得要佔一個人頭,但multicore的環境中,了不起就N個核同時一起跑,開越多條thread並不會越快。另外,若是任由kernel自行去分配thread到空閒CPU,常會導致I/O time去搶奪CPU time。

這也就是這篇提出來最主要的原因,作法其實並不困難。首先,必須要先知道系統有幾個核

procs = (int)sysconf( _SC_NPROCESSORS_ONLN );

接著就是分配的工作

cpu_set_t set;
CPU_ZERO( &set );
CPU_SET( proc_num, &set );
sched_setaffinity( gettid(), sizeof( cpu_set_t ), &set );

補充一點,要compile過通常要加上

#define _GNU_SOURCE

再另外說明一下好了,一定得要gettid,因為所有的thread共用同一個pid,做法是

syscall( __NR_gettid )

or

syscall(SYS_gettid);

這些code的片段組起來就可以做到。