CPU_SET(3) - wariua/manpages-ko GitHub Wiki

NAME

CPU_SET, CPU_CLR, CPU_ISSET, CPU_ZERO, CPU_COUNT, CPU_AND, CPU_OR, CPU_XOR, CPU_EQUAL, CPU_ALLOC, CPU_ALLOC_SIZE, CPU_FREE, CPU_SET_S, CPU_CLR_S, CPU_ISSET_S, CPU_ZERO_S, CPU_COUNT_S, CPU_AND_S, CPU_OR_S, CPU_XOR_S, CPU_EQUAL_S - CPU μ„ΈνŠΈ μ‘°μž‘μ„ μœ„ν•œ 맀크둜

SYNOPSIS

#define _GNU_SOURCE             /* feature_test_macros(7) μ°Έκ³  */
#include <sched.h>

void CPU_ZERO(cpu_set_t *set);

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

int  CPU_COUNT(cpu_set_t *set);

void CPU_AND(cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_OR(cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_XOR(cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);

int  CPU_EQUAL(cpu_set_t *set1, cpu_set_t *set2);

cpu_set_t *CPU_ALLOC(int num_cpus);
void CPU_FREE(cpu_set_t *set);
size_t CPU_ALLOC_SIZE(int num_cpus);

void CPU_ZERO_S(size_t setsize, cpu_set_t *set);

void CPU_SET_S(int cpu, size_t setsize, cpu_set_t *set);
void CPU_CLR_S(int cpu, size_t setsize, cpu_set_t *set);
int  CPU_ISSET_S(int cpu, size_t setsize, cpu_set_t *set);

int  CPU_COUNT_S(size_t setsize, cpu_set_t *set);

void CPU_AND_S(size_t setsize, cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_OR_S(size_t setsize, cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);
void CPU_XOR_S(size_t setsize, cpu_set_t *destset,
             cpu_set_t *srcset1, cpu_set_t *srcset2);

int  CPU_EQUAL_S(size_t setsize, cpu_set_t *set1, cpu_set_t *set2);

DESCRIPTION

cpu_set_t 데이터 κ΅¬μ‘°λŠ” CPUλ“€μ˜ 집합을 ν‘œν˜„ν•œλ‹€. sched_setaffinity(2) 및 μœ μ‚¬ μΈν„°νŽ˜μ΄μŠ€λ“€μ—μ„œ CPU μ„ΈνŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.

cpu_set_t 데이터 νƒ€μž…μ€ λΉ„νŠΈ 마슀크둜 κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. ν•˜μ§€λ§Œ 이 자료 ꡬ쑰λ₯Ό 뢈투λͺ…ν•œ κ²ƒμœΌλ‘œ 닀루어야 ν•œλ‹€. 즉, λͺ¨λ“  CPU μ„ΈνŠΈ μ‘°μž‘μ΄ 이 νŽ˜μ΄μ§€μ—μ„œ κΈ°μˆ ν•˜λŠ” λ§€ν¬λ‘œλ“€μ„ 톡해 이뀄져야 ν•œλ‹€.

CPU μ„ΈνŠΈ cpu에 λ™μž‘ν•˜λŠ” λ‹€μŒ λ§€ν¬λ‘œλ“€μ΄ μžˆλ‹€.

CPU_ZERO()
set을 λΉ„μ›Œμ„œ μ–΄λ–€ CPU도 λ‹΄μ§€ μ•Šκ²Œ λ§Œλ“¦.
CPU_SET()
CPU cpuλ₯Ό set에 μΆ”κ°€.
CPU_CLR()
CPU cpuλ₯Ό setμ—μ„œ 제거.
CPU_ISSET()
CPU cpuκ°€ set에 μ†ν•˜λŠ”μ§€ 검사.
CPU_COUNT()
set λ‚΄μ˜ CPU 개수 λ°˜ν™˜.

cpu 인자λ₯Ό μ§€μ •ν•˜λŠ” 경우 κ·Έ μΈμžμ— λΆ€λŒ€ νš¨κ³Όκ°€ μ—†μ–΄μ•Ό ν•œλ‹€. μœ„ λ§€ν¬λ‘œλ“€μ—μ„œ κ·Έ 인자λ₯Ό μ—¬λŸ¬ 번 평가할 μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€.

μ‹œμŠ€ν…œμ˜ 첫 번째 CPUκ°€ cpu κ°’ 0에 ν•΄λ‹Ήν•˜κ³  λ‹€μŒ CPUκ°€ cpu κ°’ 1에 ν•΄λ‹Ήν•˜λŠ” 식이닀. νŠΉμ • CPUκ°€ μ‚¬μš© κ°€λŠ₯ν•œμ§€μ— λŒ€ν•΄, λ˜λŠ” CPU μ„ΈνŠΈκ°€ 연속인지에 λŒ€ν•΄ μ–΄λ–€ 가정도 ν•΄μ„œλŠ” μ•ˆ λœλ‹€. CPUκ°€ λ™μ μœΌλ‘œ μ˜€ν”„λΌμΈμ΄ λ˜κ±°λ‚˜ λ‹€λ₯Έ 이유둜 λΉ μ Έ μžˆμ„ 수 있기 λ•Œλ¬Έμ΄λ‹€. μƒμˆ˜ CPU_SETSIZE(ν˜„μž¬ 1024)λŠ” cpu_set_t에 μ €μž₯ν•  수 μžˆλŠ” κ°€μž₯ 큰 CPU λ²ˆν˜Έλ³΄λ‹€ 1만큼 큰 값을 λ‚˜νƒ€λ‚Έλ‹€.

λ‹€μŒ λ§€ν¬λ‘œλ“€μ€ CPU μ„ΈνŠΈμ— 논리 연산을 μˆ˜ν–‰ν•œλ‹€.

CPU_AND()
μ„ΈνŠΈ srcset1κ³Ό srcset2의 ꡐ집합을 (좜발 μ„ΈνŠΈ 쀑 ν•˜λ‚˜μΌ μˆ˜λ„ μžˆλŠ”) destset에 μ €μž₯.
CPU_OR()
μ„ΈνŠΈ srcset1κ³Ό srcset2의 합집합을 (좜발 μ„ΈνŠΈ 쀑 ν•˜λ‚˜μΌ μˆ˜λ„ μžˆλŠ”) destset에 μ €μž₯.
CPU_XOR()
μ„ΈνŠΈ srcset1κ³Ό srcset2의 XOR을 (좜발 μ„ΈνŠΈ 쀑 ν•˜λ‚˜μΌ μˆ˜λ„ μžˆλŠ”) destset에 μ €μž₯. XOR은 srcset1κ³Ό srcset2 쀑 ν•œ μͺ½μ—λ§Œ μžˆλŠ” CPUλ“€μ˜ 집합을 λœ»ν•œλ‹€.
CPU_EQUAL()
두 CPU μ„ΈνŠΈκ°€ μ •ν™•νžˆ 같은 CPU듀을 λ‹΄κ³  μžˆλŠ”μ§€ 검사.

동적 크기 CPU μ„ΈνŠΈ

CPU μ„ΈνŠΈ 크기λ₯Ό λ™μ μœΌλ‘œ μ •ν•  수 μžˆμ–΄μ•Ό ν•˜λŠ” (κ°€λ Ή ν‘œμ€€ cpu_set_t 데이터 νƒ€μž…μ΄ κ·œμ •ν•˜λŠ” 것보닀 큰 μ„ΈνŠΈλ₯Ό ν• λ‹Ήν•΄μ•Ό ν•˜λŠ”) μ‘μš©μ΄ μžˆμ„ 수 있기 λ•Œλ¬Έμ— μš”μ¦˜ glibcμ—μ„œλŠ” 이λ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•œ λ§€ν¬λ‘œλ“€μ„ μ œκ³΅ν•œλ‹€.

λ‹€μŒ λ§€ν¬λ‘œλ“€μ„ μ‚¬μš©ν•΄ CPU μ„ΈνŠΈλ₯Ό ν• λ‹Ήν•˜κ³  ν•΄μ œν•œλ‹€.

CPU_ALLOC()
0μ—μ„œ num_cpus-1κΉŒμ§€ λ²”μœ„μ˜ CPU듀을 담을 만큼 큰 CPU μ„ΈνŠΈλ₯Ό ν• λ‹Ή.
CPU_ALLOC_SIZE()
0μ—μ„œ num_cpus-1κΉŒμ§€ λ²”μœ„μ˜ CPU듀을 λ‹΄λŠ” 데 ν•„μš”ν•œ CPU μ„ΈνŠΈμ˜ λ°”μ΄νŠΈ λ‹¨μœ„ 크기λ₯Ό λ°˜ν™˜. μ•„λž˜μ—μ„œ μ„€λͺ…ν•˜λŠ” CPU_*_S() λ§€ν¬λ‘œλ“€μ˜ setsize 인자둜 μ‚¬μš©ν•  수 μžˆλŠ” 값을 이 λ§€ν¬λ‘œκ°€ μ œκ³΅ν•œλ‹€.
CPU_FREE()
μ•žμ„œ CPU_ALLOC()으둜 ν• λ‹Ήν•œ CPU μ„ΈνŠΈ ν•΄μ œ.

이름이 "_S"둜 λλ‚˜λŠ” λ§€ν¬λ‘œλ“€μ€ 이름에 접두사 μ—†λŠ” λ§€ν¬λ‘œλ“€μ˜ μƒμ‚¬ν˜•μ΄λ‹€. 이 λ§€ν¬λ‘œλ“€μ€ κ·Έ μƒμ‚¬ν˜•κ³Ό 같은 일을 μˆ˜ν–‰ν•˜λ˜ 크기가 setsize λ°”μ΄νŠΈμΈ 동적 ν• λ‹Ή CPU μ„ΈνŠΈμ— λŒ€ν•΄ λ™μž‘ν•œλ‹€.

RETURN VALUE

CPU_ISSET() 및 CPU_ISSET_S()λŠ” set에 cpuκ°€ μ„€μ •λ˜μ–΄ 있으면 0 μ•„λ‹Œ 값을 λ°˜ν™˜ν•œλ‹€. μ•„λ‹ˆλ©΄ 0을 λ°˜ν™˜ν•œλ‹€.

CPU_COUNT() 및 CPU_COUNT_S()λŠ” set λ‚΄μ˜ CPU 개수λ₯Ό λ°˜ν™˜ν•œλ‹€.

CPU_EQUAL() 및 CPU_EQUAL_S()λŠ” 두 CPU μ„ΈνŠΈκ°€ κ°™μœΌλ©΄ 0 μ•„λ‹Œ 값을 λ°˜ν™˜ν•œλ‹€. μ•„λ‹ˆλ©΄ 0을 λ°˜ν™˜ν•œλ‹€.

CPU_ALLOC()은 성곡 μ‹œ 포인터λ₯Ό, μ‹€νŒ¨ μ‹œ NULL을 λ°˜ν™˜ν•œλ‹€. (였λ₯˜λŠ” malloc(3)μ—μ„œμ™€ κ°™λ‹€.)

CPU_ALLOC_SIZE()λŠ” μ§€μ •ν•œ 크기의 CPU μ„ΈνŠΈλ₯Ό μ €μž₯ν•˜λŠ” 데 ν•„μš”ν•œ λ°”μ΄νŠΈ 수λ₯Ό λ°˜ν™˜ν•œλ‹€.

λ‹€λ₯Έ ν•¨μˆ˜λ“€μ€ 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.

VERSIONS

glibc 2.3.3μ—μ„œ CPU_ZERO(), CPU_SET(), CPU_CLR(), CPU_ISSET() λ§€ν¬λ‘œκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.

glibc 2.6μ—μ„œ CPU_COUNT()κ°€ 처음 λ“±μž₯ν–ˆλ‹€.

glibc 2.7μ—μ„œ CPU_AND(), CPU_OR(), CPU_XOR(), CPU_EQUAL(), CPU_ALLOC(), CPU_ALLOC_SIZE(), CPU_FREE(), CPU_ZERO_S(), CPU_SET_S(), CPU_CLR_S(), CPU_ISSET_S(), CPU_AND_S(), CPU_OR_S(), CPU_XOR_S(), CPU_EQUAL_S()κ°€ 처음 λ“±μž₯ν–ˆλ‹€.

CONFORMING TO

이 μΈν„°νŽ˜μ΄μŠ€λ“€μ€ λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€.

NOTES

CPU μ„ΈνŠΈλ₯Ό λ³΅μ œν•˜λ €λ©΄ memcpy(3)λ₯Ό μ“°λ©΄ λœλ‹€.

CPU μ„ΈνŠΈλŠ” κΈ΄ μ›Œλ“œ λ‹¨μœ„λ‘œ ν• λ‹Ήλœ λΉ„νŠΈ λ§ˆμŠ€ν¬μ΄λ‹€. κ·Έλž˜μ„œ 동적 ν• λ‹Ή CPU μ„ΈνŠΈμ˜ μ‹€μ œ CPU μˆ˜λŠ” κ°€μž₯ κ°€κΉŒμš΄ sizeof(unsigned long)의 배수둜 μ˜¬λ¦Όν•œ 것이 λœλ‹€. μ‘μš©μ—μ„œλŠ” 이 μΆ”κ°€ λΉ„νŠΈλ“€μ˜ λ‚΄μš©λ¬Όμ„ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ€ κ²ƒμœΌλ‘œ 보아야 ν•œλ‹€.

μ΄λ¦„μ˜ μœ μ‚¬μ„±μ—λ„ λΆˆκ΅¬ν•˜κ³  μƒμˆ˜ CPU_SETSIZEλŠ” cpu_set_t 데이터 νƒ€μž… λ‚΄μ˜ CPU 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것이고 (κ·Έλž˜μ„œ μ‹€μ§ˆμ μœΌλ‘œ λΉ„νŠΈ 마슀크의 λΉ„νŠΈ 개수이고) CPU_*_S() 맀크둜의 setsize μΈμžλŠ” λ°”μ΄νŠΈ λ‹¨μœ„ 크기이닀.

SYNOPSIS에 λ‚˜μ™€ μžˆλŠ” μΈμžμ™€ λ°˜ν™˜ κ°’μ˜ 데이터 νƒ€μž…μ€ 각 κ²½μš°μ— 무엇을 μ˜ˆμƒν•˜λŠ”μ§€μ— λŒ€ν•œ νžŒνŠΈμ΄λ‹€. ν•˜μ§€λ§Œ 이 μΈν„°νŽ˜μ΄μŠ€λ“€μ€ 맀크둜둜 κ΅¬ν˜„λ˜μ–΄ 있기 λ•Œλ¬Έμ— κ·Έ μ œμ•ˆμ„ μ–΄κΈ΄ 경우 μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž… 였λ₯˜λ“€μ„ κΌ­ λ‹€ μž‘μ•„ μ£Όμ§€λŠ” μ•Šμ„ 것이닀.

BUGS

glibcκ°€ 2.8 이전인 32λΉ„νŠΈ ν”Œλž«νΌμ—μ„œ CPU_ALLOC()이 ν•„μš”ν•œ 크기 두 배둜 곡간을 ν• λ‹Ήν•˜λ©° CPU_ALLOC_SIZE()κ°€ 두 배둜 값을 λ°˜ν™˜ν•œλ‹€. 이 버그가 ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘ 결과에 영ν–₯을 μ£Όμ§€λŠ” μ•Šκ² μ§€λ§Œ λ©”λͺ¨λ¦¬κ°€ λ‚­λΉ„λ˜λ©° 동적 ν• λ‹Ή CPU μ„ΈνŠΈμ— λ™μž‘ν•˜λŠ” λ§€ν¬λ‘œλ“€μ΄ 덜 효율적으둜 λ™μž‘ν•˜κ²Œ λœλ‹€. glibc 2.9μ—μ„œ 이 버그듀이 μˆ˜μ •λ˜μ—ˆλ‹€.

EXAMPLE

λ‹€μŒ ν”„λ‘œκ·Έλž¨μ€ 동적 ν• λ‹Ή CPU μ„ΈνŠΈμ— μ“°λŠ” 맀크둜 λͺ‡ κ°€μ§€μ˜ μ‚¬μš© 방식을 보여 μ€€λ‹€.

#define _GNU_SOURCE
#include <sched.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <assert.h>

int
main(int argc, char *argv[])
{
    cpu_set_t *cpusetp;
    size_t size;
    int num_cpus, cpu;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s <num-cpus>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    num_cpus = atoi(argv[1]);

    cpusetp = CPU_ALLOC(num_cpus);
    if (cpusetp == NULL) {
        perror("CPU_ALLOC");
        exit(EXIT_FAILURE);
    }

    size = CPU_ALLOC_SIZE(num_cpus);

    CPU_ZERO_S(size, cpusetp);
    for (cpu = 0; cpu < num_cpus; cpu += 2)
        CPU_SET_S(cpu, size, cpusetp);

    printf("CPU_COUNT() of set:    %d\n", CPU_COUNT_S(size, cpusetp));

    CPU_FREE(cpusetp);
    exit(EXIT_SUCCESS);
}

SEE ALSO

sched_setaffinity(2), pthread_attr_setaffinity_np(3), pthread_setaffinity_np(3), cpuset(7)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️