sched_setaffinity() - Unix、Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

sched_setaffinity() - Unix、Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

sched_setaffinity、sched_getaffinity、CPU_CLR、CPU_ISSET、CPU_SET、CPU_ZERO - 設定和獲取程序的 CPU 親和性掩碼

摘要

#include <sched.h> 

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

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

void CPU_CLR(int cpu, cpu_set_t *set);
int CPU_ISSET(int cpu, cpu_set_t *set);
void CPU_SET(int cpu, cpu_set_t *set);
void CPU_ZERO(cpu_set_t *set);

描述

程序的 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 編號的值。

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為零,則返回呼叫程序的掩碼。

返回值

成功時,sched_setaffinity() 和sched_getaffinity() 返回 0。錯誤時,返回 -1,並且errno被相應地設定。

錯誤

標籤描述
EFAULT 提供的記憶體地址無效。
EINVAL 親和性位掩碼mask不包含物理存在於系統上的處理器,或者cpusetsize小於核心使用的親和性掩碼的大小。
EPERM 呼叫程序沒有相應的許可權。呼叫sched_setaffinity() 的程序需要一個等於由pid標識的程序的使用者 ID 或有效使用者 ID 的有效使用者 ID,或者它必須擁有CAP_SYS_NICE功能。
ESRCH 找不到 ID 為pid的程序。

符合標準

這些系統呼叫是 Linux 特定的。

備註

親和性掩碼實際上是一個每個執行緒的屬性,可以獨立地為執行緒組中的每個執行緒進行調整。從對gettid(2) 的呼叫返回的值可以作為引數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 中被恢復。

參見

sched_setscheduler(2) 對 Linux 排程方案進行了描述。

previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.