NAME
pthread_setaffinity_np, pthread_getaffinity_np - 스레드의 CPU 친화성 설정하기/얻기
SYNOPSIS
#define _GNU_SOURCE /* feature_test_macros(7) 참고 */
#include <pthread.h>
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
cpu_set_t *cpuset);
-pthread
로 컴파일 및 링크.
DESCRIPTION
pthread_setaffinity_np()
함수는 스레드 thread
의 CPU 친화성 마스크를 cpuset
이 가리키는 CPU 세트로 설정한다. 호출이 성공하고 스레드가 현재 cpuset
의 한 CPU에서 돌고 있지 않으면 그 CPU들 중 하나로 스레드를 옮긴다.
pthread_getaffinity_np()
함수는 스레드 thread
의 CPU 친화성 마스크를 cpuset
이 가리키는 버퍼로 반환한다.
CPU 친화성 마스크에 대한 더 자세한 내용은 sched_setaffinity(2)를 보라. CPU 세트 조작과 검사에 사용할 수 있는 매크로들에 대한 설명은 CPU_SET(3)을 보라.
cpusetsize
인자는 cpuset
이 가리키는 버퍼의 (바이트 단위) 길이이다. 보통은 이 인자를 sizeof(cpu_set_t)
로 지정할 것이다. (CPU_SET(3)에서 기술하는 CPU 세트 동적 할당을 위한 매크로들을 사용하고 있다면 어떤 다른 값일 수도 있다.)
RETURN VALUE
성공 시 이 함수들은 0을 반환한다. 오류 시 0 아닌 오류 번호를 반환한다.
ERRORS
EFAULT
- 제공한 메모리 주소가 유효하지 않다.
EINVAL
- (
pthread_setaffinity_np()
) 친화성 비트 마스크mask
가 현재 물리적으로 시스템 상에 있으면서 cpuset(7)에서 기술하는 "cpuset" 메커니즘으로 부과할 수 있는 제약에 따라 스레드에게 허용된 프로세서를 하나도 포함하고 있지 않다. EINVAL
- (
pthread_setaffinity_np()
)cpuset
으로 커널에서 지원하는 집합을 벗어나는 CPU를 지정했다. (커널 구성 옵션CONFIG_NR_CPUS
가 CPU 집합 표현에 쓰는 커널 데이터 타입이 지원하는 집합의 범위를 규정한다.) EINVAL
- (
pthread_getaffinity_np()
)cpusetsize
가 커널에서 쓰는 친화성 마스크의 크기보다 작다. ESRCH
- ID가
thread
인 스레드를 찾을 수 없다.
VERSIONS
glibc 버전 2.3.4부터 이 함수들을 제공한다.
ATTRIBUTES
이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.
인터페이스 | 속성 | 값 |
---|---|---|
pthread_setaffinity_np() ,pthread_getaffinity_np() |
스레드 안전성 | MT-Safe |
CONFORMING TO
이 함수들은 비표준 GNU 확장이다. 그래서 이름 뒤에 "_np"(nonportable: 이식성 없음)가 붙어 있다.
NOTES
pthread_setaffinity_np()
호출 후에 스레드가 실제로 돌게 될 CPU들의 집합은 cpuset
인자에 지정한 집합과 시스템에 실제 존재하는 CPU들의 집합의 교집합이다. cpuset(7)에서 기술하는 "cpuset" 메커니즘을 사용하고 있으면 스레드가 도는 CPU 집합을 시스템에서 추가로 제약할 수도 있다. 스레드가 돌게 될 실제 CPU들의 집합에 대한 이 제약들은 커널이 조용히 적용한다.
이 함수들은 sched_setaffinity(2) 및 sched_getaffinity(2) 시스템 호출 위에 구현되어 있다.
glibc 2.3.3에 한해 제공됐던 버전에 cpusetsize
인자가 없었다. 기반 시스템 호출에게 주는 CPU 세트 크기가 항상 sizeof(cpu_set_t)
였다.
pthread_create(3)로 생성한 신규 스레드는 자기를 생성한 스레드의 CPU 친화성 마스크 사본을 물려받는다.
EXAMPLES
다음 프로그램에서 주 스레드는 pthread_setaffinity_np()
를 이용해 CPU 0에서 7까지를 (시스템에서 모두 사용 가능하지는 않을 수도 있음) 포함하도록 자기 CPU 친화성 마스크를 설정하고서 pthread_getaffinity_np()
를 호출해 그렇게 바꾼 스레드의 CPU 친화성 마스크를 확인한다.
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
int
main(int argc, char *argv[])
{
int s;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
/* CPU 0에서 7까지 포함하도록 친화성 마스크 설정하기. */
CPU_ZERO(&cpuset);
for (int j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpuset), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");
/* 스레드에 친화성 마스크가 실제 부여되었는지 확인하기. */
s = pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_getaffinity_np");
printf("Set returned by pthread_getaffinity_np() contained:\n");
for (int j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %d\n", j);
exit(EXIT_SUCCESS);
}
SEE ALSO
sched_setaffinity(2), CPU_SET(3), pthread_attr_setaffinity_np(3), pthread_self(3), sched_getcpu(3), cpuset(7), pthreads(7), sched(7)
2021-03-22