程序的 CPU 親和性掩碼決定了它可以執行的 CPU 集。在多處理器系統上,設定 CPU 親和性掩碼可以用來獲得性能優勢。例如,透過將一個 CPU 專用於特定程序(即,將該程序的親和性掩碼設定為指定單個 CPU,並將所有其他程序的親和性掩碼設定為排除該 CPU),可以確保該程序的最大執行速度。將程序限制在單個 CPU 上執行還可以避免由於程序停止在一個 CPU 上執行然後在另一個 CPU 上重新執行而導致的快取失效造成的效能損失。
CPU 親和性掩碼由cpu_set_t結構(一個“CPU 集”)表示,該結構由mask指向。提供四個宏來操作 CPU 集。CPU_ZERO() 清除一個集合。CPU_SET() 和CPU_CLR() 分別向集合中新增和刪除給定的 CPU。CPU_ISSET() 測試一個 CPU 是否是集合的一部分;這在sched_getaffinity() 返回後很有用。系統上第一個可用的 CPU 對應於cpu值為 0,下一個 CPU 對應於cpu值為 1,以此類推。常量CPU_SETSIZE (1024) 指定一個值,該值比可以儲存在 CPU 集中的最大 CPU 編號大 1。
sched_setaffinity() 將 ID 為pid的程序的 CPU 親和性掩碼設定為mask指定的值。如果pid為零,則使用呼叫程序。引數cpusetsize是指向mask的資料的長度(以位元組為單位)。通常,此引數將指定為sizeof(cpu_set_t)。
如果pid指定的程序當前未在mask中指定的 CPU 之一上執行,則該程序將遷移到mask中指定的 CPU 之一。
sched_getaffinity() 將 ID 為pid的程序的親和性掩碼寫入mask指向的cpu_set_t結構中。cpusetsize引數指定mask的大小(以位元組為單位)。如果pid為零,則返回呼叫程序的掩碼。
透過fork(2) 建立的子程序繼承其父程序的 CPU 親和性掩碼。親和性掩碼在execve(2) 中被保留。
本手冊頁描述了 CPU 親和性呼叫的 glibc 介面。實際的系統呼叫介面略有不同,其中mask的型別為unsigned long *,這反映了 CPU 集的底層實現是一個簡單的位掩碼。成功時,原始sched_getaffinity() 系統呼叫返回核心內部用來表示 CPU 集位掩碼的cpumask_t資料型別的 size(以位元組為單位)。
歷史
CPU 親和性系統呼叫是在 Linux 核心 2.5.8 中引入的。庫介面是在 glibc 2.3 中引入的。最初,glibc 介面包含一個cpusetsize引數。在 glibc 2.3.2 中,cpusetsize引數被刪除,但在 glibc 2.3.4 中又恢復了這個引數。