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

返回值

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

錯誤

標籤描述
EFAULT 提供的記憶體地址無效。
EINVAL 親和性位掩碼mask不包含物理上位於系統上的處理器,或者cpusetsize小於核心使用的親和性掩碼的大小。
EPERM 呼叫程序沒有相應的許可權。呼叫sched_setaffinity() 的程序需要一個有效的使用者 ID 等於pid標識的程序的使用者 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.