sched_setaffinity(2) - wariua/manpages-ko GitHub Wiki

NAME

sched_setaffinity, sched_getaffinity - ์Šค๋ ˆ๋“œ์˜ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ ์„ค์ •ํ•˜๊ณ  ์–ป๊ธฐ

SYNOPSIS

#define _GNU_SOURCE             /* feature_test_macros(7) ์ฐธ๊ณ  */
#include <sched.h>

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

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

DESCRIPTION

์Šค๋ ˆ๋“œ์˜ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋Š” ๊ทธ ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค CPU๋“ค ์œ„์—์„œ ๋Œ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. ๋‹ค์ค‘ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์—์„œ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ฑ๋Šฅ ์ด๋“์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ CPU๋ฅผ ํŠน์ • ์Šค๋ ˆ๋“œ์—๊ฒŒ ๋…์ ์‹œํ‚ค๋ฉด (์ฆ‰, ๊ทธ ์Šค๋ ˆ๋“œ์˜ ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋ฅผ ํ•œ CPU๋งŒ ๋‚˜ํƒ€๋‚ด๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋ฅผ ๊ทธ CPU๋ฅผ ๋ฐฐ์ œํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด) ๊ทธ ์Šค๋ ˆ๋“œ์— ์ตœ๋Œ€ํ•œ์˜ ์‹คํ–‰ ์†๋„๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ํ•œ CPU์—์„œ๋งŒ ๋Œ๋„๋ก ์ œ์•ฝํ•˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ํ•œ CPU์—์„œ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ณ  ๋‹ค๋ฅธ CPU์—์„œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์บ์‹œ ๋ฌดํšจํ™”๋กœ ์ธํ•œ ์„ฑ๋Šฅ ๋น„์šฉ์„ ํ”ผํ•˜๊ฒŒ ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

mask๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” "CPU ์„ธํŠธ"์ธ cpu_set_t ๊ตฌ์กฐ์ฒด๋กœ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. CPU ์„ธํŠธ๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๋งคํฌ๋กœ๋“ค์„ CPU_SET(3)์—์„œ ๊ธฐ์ˆ ํ•œ๋‹ค.

sched_setaffinity()๋Š” ID๊ฐ€ pid์ธ ์Šค๋ ˆ๋“œ์˜ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋ฅผ mask๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. pid๊ฐ€ 0์ด๋ฉด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. cpusetsize ์ธ์ž๋Š” mask๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ์˜ (๋ฐ”์ดํŠธ ๋‹จ์œ„) ๊ธธ์ด์ด๋‹ค. ๋ณดํ†ต์€ ์ด ์ธ์ž๋ฅผ sizeof(cpu_set_t)๋ผ๊ณ  ์ง€์ •ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

pid๋กœ ์ง€์ •ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜„์žฌ mask์— ์ง€์ •ํ•œ CPU๋“ค ์ค‘ ํ•˜๋‚˜์—์„œ ๋Œ๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด mask์— ์ง€์ •ํ•œ CPU๋“ค ์ค‘ ํ•˜๋‚˜๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์˜ฎ๊ธด๋‹ค.

sched_getaffinity()๋Š” ID๊ฐ€ pid์ธ ์Šค๋ ˆ๋“œ์˜ ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋ฅผ mask๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” cpu_set_t ๊ตฌ์กฐ์ฒด์— ์จ๋„ฃ๋Š”๋‹ค. cpusetsize ์ธ์ž๋Š” mask์˜ (๋ฐ”์ดํŠธ ๋‹จ์œ„) ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. pid๊ฐ€ 0์ด๋ฉด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ์˜ ๋งˆ์Šคํฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ sched_setaffinity()์™€ sched_getaffinity()๋Š” 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ errno๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•œ๋‹ค.

ERRORS

EFAULT
์ œ๊ณตํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค.
EINVAL
์นœํ™”์„ฑ ๋น„ํŠธ ๋งˆ์Šคํฌ mask๊ฐ€ ํ˜„์žฌ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์‹œ์Šคํ…œ ์ƒ์— ์žˆ์œผ๋ฉด์„œ cpuset cgroup์ด๋‚˜ cpuset(7)์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” "cpuset" ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋ถ€๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์•ฝ์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ์—๊ฒŒ ํ—ˆ์šฉ๋œ ํ”„๋กœ์„ธ์„œ๋ฅผ ํ•˜๋‚˜๋„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค.
EINVAL
(sched_getaffinity(), ๊ทธ๋ฆฌ๊ณ  2.6.9 ์ „์˜ ์ปค๋„์—์„œ๋Š” sched_setaffinity()๋„) cpusetsize๊ฐ€ ์ปค๋„์—์„œ ์“ฐ๋Š” ์นœํ™”์„ฑ ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘๋‹ค.
EPERM
(sched_setaffinity()) ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ์ ˆํ•œ ํŠน๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ํ˜ธ์ถœ์ž์˜ ์‹คํšจ ์‚ฌ์šฉ์ž ID๊ฐ€ `pid`๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์Šค๋ ˆ๋“œ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ID๋‚˜ ์‹คํšจ ์‚ฌ์šฉ์ž ID์™€ ๊ฐ™๊ฑฐ๋‚˜ ํ˜ธ์ถœ์ž๊ฐ€ ์Šค๋ ˆ๋“œ pid์˜ ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ CAP_SYS_NICE ์—ญ๋Šฅ์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
ESRCH
ID๊ฐ€ pid์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.5.8์—์„œ CPU ์นœํ™”์„ฑ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์ด ๋„์ž…๋˜์—ˆ๋‹ค. glibc 2.3์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ž˜ํผ๋“ค์ด ๋„์ž…๋˜์—ˆ๋‹ค. ์ฒ˜์Œ์— glibc ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” unsigned int ํƒ€์ž…์ธ cpusetsize ์ธ์ž๊ฐ€ ํฌํ•จ๋ผ ์žˆ์—ˆ๋‹ค. glibc 2.3.3์—์„œ cpusetsize ์ธ์ž๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค๊ฐ€ glibc 2.3.4์—์„œ size_t ํƒ€์ž…์œผ๋กœ ๋˜์‚ด์•„๋‚ฌ๋‹ค.

CONFORMING TO

์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

NOTES

sched_setaffinity() ํ˜ธ์ถœ ํ›„์— ์Šค๋ ˆ๋“œ๊ฐ€ ์‹ค์ œ๋กœ ๋Œ๊ฒŒ ๋  CPU๋“ค์˜ ์ง‘ํ•ฉ์€ mask ์ธ์ž์— ์ง€์ •ํ•œ ์ง‘ํ•ฉ๊ณผ ์‹œ์Šคํ…œ์— ์‹ค์ œ ์กด์žฌํ•˜๋Š” CPU๋“ค์˜ ์ง‘ํ•ฉ์˜ ๊ต์ง‘ํ•ฉ์ด๋‹ค. cpuset(7)์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” "cpuset" ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋„๋Š” CPU ์ง‘ํ•ฉ์„ ์‹œ์Šคํ…œ์—์„œ ์ถ”๊ฐ€๋กœ ์ œ์•ฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ๊ฒŒ ๋  ์‹ค์ œ CPU๋“ค์˜ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์ด ์ œ์•ฝ๋“ค์€ ์ปค๋„์ด ์กฐ์šฉํžˆ ์ ์šฉํ•œ๋‹ค.

์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CPU๋“ค์˜ ์ˆ˜๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. /proc/cpuinfo์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, sysconf(3)๋ฅผ ์ด์šฉํ•ด _SC_NPROCESSORS_CONF ๋ฐ _SC_NPROCESSORS_ONLN ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์–ป๊ฑฐ๋‚˜, /sys/devices/system/cpu/ ํ•˜์˜ CPU ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ชฉ๋ก์„ ๋“ค์—ฌ๋‹ค ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

sched(7)์—์„œ ๋ฆฌ๋ˆ…์Šค ์Šค์ผ€์ค„๋ง ์ฒด๊ณ„๋ฅผ ๊ธฐ์ˆ ํ•œ๋‹ค.

์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋Š” ์Šค๋ ˆ๋“œ๋ณ„ ์†์„ฑ์ด๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน ๋‚ด์˜ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. gettid(2) ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ pid ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. pid๋ฅผ 0์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ฒŒ ๋˜๊ณ  getpid(2) ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์˜ ์ฃผ ์Šค๋ ˆ๋“œ์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค. (POSIX ์Šค๋ ˆ๋“œ API๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค๋ฉด sched_setaffinity() ๋Œ€์‹  pthread_setaffinity_np(3)๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.)

isolcpus๋ผ๋Š” ๋ถ€ํŒ… ์˜ต์…˜์„ ์ด์šฉํ•ด ๋ถ€ํŒ… ์‹œ์ ์— ํ•œ ๊ฐœ ์ด์ƒ์˜ CPU๋ฅผ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ CPU๋“ค๋กœ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋„ ์Šค์ผ€์ค„ ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ถ€ํŒ… ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ๋‹ค์Œ์—๋Š” sched_setaffinity()๋‚˜ cpuset(7) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด์„œ๋งŒ ๊ทธ ๊ฒฉ๋ฆฌ๋œ CPU๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ปค๋„ ์†Œ์Šค ํŒŒ์ผ Documentation/admin-guide/kernel-parameters.txt๋ฅผ ๋ณด๋ผ. ๊ทธ ํŒŒ์ผ์—์„œ ์–ธ๊ธ‰ํ•˜๋“ฏ isolcpus๊ฐ€ CPU๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ์„ ํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. (์ด์— ๋Œ€๋น„๋˜๋Š” ๊ฒƒ์€ ์‹œ์Šคํ…œ ์ƒ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋“ค์˜ CPU ์นœํ™”์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.)

fork(2)๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ž์‹์€ ๋ถ€๋ชจ์˜ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๋ฅผ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค. execve(2)๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๊ฐ€ ๋ณด์กด๋œ๋‹ค.

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ปค๋„ ์ฐจ์ด

์ด ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์€ CPU ์นœํ™”์„ฑ ํ˜ธ์ถœ์˜ glibc ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ์‹ค์ œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‚ด์ง ๋‹ค๋ฅธ๋ฐ, CPU ์„ธํŠธ์˜ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•œ ๋น„ํŠธ ๋งˆ์Šคํฌ๋ผ๋Š” ์‚ฌ์‹ค์„ ๋ฐ˜์˜ํ•˜์—ฌ mask์˜ ํƒ€์ž…์ด unsigned long *์ด๋‹ค.

์„ฑ๊ณต ์‹œ ์ง„์งœ sched_getaffinity() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ mask ๋ฒ„ํผ๋กœ ๋ณต์‚ฌ๋œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” cpusetsize์™€ ์ปค๋„ ๋‚ด๋ถ€์—์„œ CPU ์ง‘ํ•ฉ ํ‘œํ˜„์— ์“ฐ๋Š” cpumask_t ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ (๋ฐ”์ดํŠธ ๋‹จ์œ„) ํฌ๊ธฐ ์ค‘ ์ž‘์€ ์ชฝ์ด๋‹ค.

CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๊ฐ€ ํฐ ์‹œ์Šคํ…œ ๋‹ค๋ฃจ๊ธฐ

(unsigned long * ํƒ€์ž… ๋น„ํŠธ ๋งˆ์Šคํฌ๋กœ CPU ๋งˆ์Šคํฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š”) ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์—์„œ๋Š” CPU ๋งˆ์Šคํฌ์˜ ํฌ๊ธฐ์— ์–ด๋–ค ์ œ์•ฝ๋„ ๋‘์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ glibc์—์„œ ์“ฐ๋Š” cpu_set_t ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ํฌ๊ธฐ๊ฐ€ 128๋ฐ”์ดํŠธ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ CPU ๋ฒˆํ˜ธ๊ฐ€ 1023์ด๋‹ค. ์ปค๋„์˜ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๊ฐ€ 1024๋ณด๋‹ค ํฌ๋ฉด ๋‹ค์Œ ํ˜•ํƒœ์˜ ํ˜ธ์ถœ์ด EINVAL ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ๋‹ค.

sched_getaffinity(pid, sizeof(cpu_set_t), &mask);

๊ทธ ์˜ค๋ฅ˜๋Š” cpusetsize์— ์ง€์ •๋œ mask ํฌ๊ธฐ๊ฐ€ ์ปค๋„์—์„œ ์“ฐ๋Š” ์นœํ™”์„ฑ ๋งˆ์Šคํฌ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์— ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋‚ด๋†“๋Š” ๊ฒƒ์ด๋‹ค. (์‹œ์Šคํ…œ CPU ํ† ํด๋กœ์ง€์— ๋”ฐ๋ผ์„  ์ปค๋„ ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๊ฐ€ ์‹œ์Šคํ…œ ์ƒ์˜ ํ™œ์„ฑ CPU ๊ฐœ์ˆ˜๋ณด๋‹ค ์ƒ๋‹นํžˆ ํด ์ˆ˜ ์žˆ๋‹ค.)

์ปค๋„ CPU ์นœํ™”์„ฑ ๋งˆ์Šคํฌ๊ฐ€ ํฐ ์‹œ์Šคํ…œ์—์„œ ์ž‘์—…ํ•  ๋•Œ๋Š” mask ์ธ์ž๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค (CPU_ALLOC(3) ์ฐธ๊ณ ). ํ˜„์žฌ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋งˆ์Šคํฌ ํฌ๊ธฐ๋ฅผ ๋Š˜์ด๋ฉฐ (ํ˜ธ์ถœ์ด EINVAL ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€) sched_getaffinity() ํ˜ธ์ถœ์„ ํ•ด์„œ ํ•„์š”ํ•œ ๋งˆ์Šคํฌ ํฌ๊ธฐ๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

CPU_ALLOC(3)์ด ์š”์ฒญํ•œ ๊ฒƒ๋ณด๋‹ค ์‚ด์ง ํฐ CPU ์„ธํŠธ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ์Œ์— ์œ ์˜ํ•˜๋ผ. (CPU ์„ธํŠธ๊ฐ€ sizeof(long) ๋‹จ์œ„๋กœ ํ• ๋‹น๋œ ๋น„ํŠธ ๋งˆ์Šคํฌ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.) ๊ทธ๋กœ ์ธํ•ด sched_getaffinity()๊ฐ€ ์š”์ฒญํ•œ ํ• ๋‹น ํฌ๊ธฐ ๋„ˆ๋จธ์—์„œ ๋น„ํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ปค๋„์€ ๊ทธ ๋ช‡ ๊ฐœ์˜ ์ถ”๊ฐ€ ๋น„ํŠธ๋ฅผ ๋ณด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธ์ถœ์ž๊ฐ€ (ํ• ๋‹น ์š”์ฒญ์„ ํ–ˆ๋˜ ๋น„ํŠธ ์ˆ˜๋งŒํผ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ) ๋ฐ˜ํ™˜๋œ ์„ธํŠธ์˜ ๋น„ํŠธ๋“ค์„ ์ˆœํšŒํ•˜๋ฉฐ ์„ค์ •๋œ ๋น„ํŠธ ์ˆ˜๋ฅผ ์„ธ๋‹ค๊ฐ€ CPU_COUNT(3)๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ๋ฉˆ์ถฐ์•ผ ํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ์™€ ์ž์‹์€ ๊ฐ๊ฐ ์ง€์ •ํ•œ CPU์— ์ž๊ธฐ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ๋™์ผํ•œ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•ด์„œ CPU ์‹œ๊ฐ„์„ ์ข€ ์†Œ๋ชจํ•œ๋‹ค. ์ข…๋ฃŒ ์ „์— ๋ถ€๋ชจ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ช…๋ น ํ–‰ ์ธ์ž๋ฅผ ์„ธ ๊ฐœ ๋ฐ›๋Š”๋‹ค. ๋ถ€๋ชจ์šฉ CPU ๋ฒˆํ˜ธ, ์ž์‹์šฉ CPU ๋ฒˆํ˜ธ, ๊ทธ๋ฆฌ๊ณ  ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋ฃจํ”„ ๋ฐ˜๋ณต ํšŸ์ˆ˜์ด๋‹ค.

์•„๋ž˜ ๊ฒฌ๋ณธ์ด ๋ณด์—ฌ ์ฃผ๋“ฏ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์‹œ ์“ฐ๋Š” ์‹ค์ œ ์‹œ๊ฐ„๊ณผ CPU ์‹œ๊ฐ„์˜ ์–‘์€ ์ฝ”์–ด ๋‚ด ์บ์‹ฑ ํšจ๊ณผ์™€ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๊ฐ™์€ CPU๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

๋จผ์ € lscpu(1)๋ฅผ ์ด์šฉํ•ด ์ด (x86) ์‹œ์Šคํ…œ์— ๋‘ ์ฝ”์–ด๊ฐ€ ์žˆ๊ณ  ๊ฐ๊ฐ์— ๋‘ CPU๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‚ธ๋‹ค.

$ lscpu | egrep -i 'core.*:|socket'
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1

๊ทธ๋ฆฌ๊ณ  ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ์—์„œ ์˜ˆ์‹œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘ ์‹œ๊ฐ„์„ ์žฐ๋‹ค. ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ CPU์—์„œ ๋Œ ๋•Œ, ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ์ฝ”์–ด์˜ ๋‹ค๋ฅธ CPU์—์„œ ๋Œ ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ์ฝ”์–ด์˜ ๋‹ค๋ฅธ CPU์—์„œ ๋Œ ๋•Œ์ด๋‹ค.

$ time -p ./a.out 0 0 100000000
real 14.75
user 3.02
sys 11.73
$ time -p ./a.out 0 1 100000000
real 11.52
user 3.98
sys 19.06
$ time -p ./a.out 0 3 100000000
real 7.89
user 3.29
sys 12.07

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)

int
main(int argc, char *argv[])
{
    cpu_set_t set;
    int parentCPU, childCPU;
    int nloops, j;

    if (argc != 4) {
        fprintf(stderr, "Usage: %s parent-cpu child-cpu num-loops\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

    parentCPU = atoi(argv[1]);
    childCPU = atoi(argv[2]);
    nloops = atoi(argv[3]);

    CPU_ZERO(&set);

    switch (fork()) {
    case -1:            /* ์˜ค๋ฅ˜ */
        errExit("fork");

    case 0:             /* ์ž์‹ */
        CPU_SET(childCPU, &set);

        if (sched_setaffinity(getpid(), sizeof(set), &set) == -1)
            errExit("sched_setaffinity");

        for (j = 0; j < nloops; j++)
            getppid();

        exit(EXIT_SUCCESS);

    default:            /* ๋ถ€๋ชจ */
        CPU_SET(parentCPU, &set);

        if (sched_setaffinity(getpid(), sizeof(set), &set) == -1)
            errExit("sched_setaffinity");

        for (j = 0; j < nloops; j++)
            getppid();

        wait(NULL);     /* ์ž์‹ ์ข…๋ฃŒ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ */
        exit(EXIT_SUCCESS);
    }
}

SEE ALSO

lscpu(1), nproc(1), taskset(1), clone(2), getcpu(2), getpriority(2), gettid(2), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getscheduler(2), sched_setscheduler(2), setpriority(2), CPU_SET(3), get_nprocs(3), pthread_setaffinity_np(3), sched_getcpu(3), capabilities(7), cpuset(7), sched(7), numactl(8)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ