pthread_setaffinity_np(3) - wariua/manpages-ko GitHub Wiki
pthread_setaffinity_np, pthread_getaffinity_np - ์ค๋ ๋์ CPU ์นํ์ฑ ์ค์ ํ๊ธฐ/์ป๊ธฐ
#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
๋ก ์ปดํ์ผ ๋ฐ ๋งํฌ.
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 ์ธํธ ๋์ ํ ๋น์ ์ํ ๋งคํฌ๋ก๋ค์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ์ด๋ค ๋ค๋ฅธ ๊ฐ์ผ ์๋ ์๋ค.)
์ฑ๊ณต ์ ์ด ํจ์๋ค์ 0์ ๋ฐํํ๋ค. ์ค๋ฅ ์ 0 ์๋ ์ค๋ฅ ๋ฒํธ๋ฅผ ๋ฐํํ๋ค.
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
์ธ ์ค๋ ๋๋ฅผ ์ฐพ์ ์ ์๋ค.
glibc ๋ฒ์ 2.3.4๋ถํฐ ์ด ํจ์๋ค์ ์ ๊ณตํ๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
pthread_setaffinity_np() ,pthread_getaffinity_np()
|
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
์ด ํจ์๋ค์ ๋นํ์ค GNU ํ์ฅ์ด๋ค. ๊ทธ๋์ ์ด๋ฆ ๋ค์ "_np"(nonportable: ์ด์์ฑ ์์)๊ฐ ๋ถ์ด ์๋ค.
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 ์นํ์ฑ ๋ง์คํฌ ์ฌ๋ณธ์ ๋ฌผ๋ ค๋ฐ๋๋ค.
๋ค์ ํ๋ก๊ทธ๋จ์์ ์ฃผ ์ค๋ ๋๋ 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, j;
cpu_set_t cpuset;
pthread_t thread;
thread = pthread_self();
/* CPU 0์์ 7๊น์ง ํฌํจํ๋๋ก ์นํ์ฑ ๋ง์คํฌ ์ค์ */
CPU_ZERO(&cpuset);
for (j = 0; j < 8; j++)
CPU_SET(j, &cpuset);
s = pthread_setaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_setaffinity_np");
/* ์ค๋ ๋์ ์นํ์ฑ ๋ง์คํฌ๊ฐ ์ค์ ๋ถ์ฌ๋์๋์ง ํ์ธ */
s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset);
if (s != 0)
handle_error_en(s, "pthread_getaffinity_np");
printf("Set returned by pthread_getaffinity_np() contained:\n");
for (j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %d\n", j);
exit(EXIT_SUCCESS);
}
sched_setaffinity(2), CPU_SET(3), pthread_attr_setaffinity_np(3), pthread_self(3), sched_getcpu(3), cpuset(7), pthreads(7), sched(7)
2019-03-06