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

NAME

pthread_setschedparam, pthread_getschedparam - μŠ€λ ˆλ“œμ˜ μŠ€μΌ€μ€„λ§ μ •μ±… 및 λ§€κ°œλ³€μˆ˜ μ„€μ •ν•˜κΈ°/μ–»κΈ°

SYNOPSIS

#include <pthread.h>

int pthread_setschedparam(pthread_t thread, int policy,
                          const struct sched_param *param);
int pthread_getschedparam(pthread_t thread, int *policy,
                          struct sched_param *param);

-pthread둜 컴파일 및 링크.

DESCRIPTION

pthread_setschedparam() ν•¨μˆ˜λŠ” μŠ€λ ˆλ“œ thread의 μŠ€μΌ€μ€„λ§ μ •μ±…κ³Ό λ§€κ°œλ³€μˆ˜λ₯Ό μ„€μ •ν•œλ‹€.

policyκ°€ threadλ₯Ό μœ„ν•œ μƒˆ μŠ€μΌ€μ€„λ§ 정책을 λ‚˜νƒ€λ‚Έλ‹€. policy의 지원 κ°’λ“€κ³Ό κ·Έ μ˜λ―ΈλŠ” sched(7)μ—μ„œ κΈ°μˆ ν•œλ‹€.

param이 κ°€λ¦¬ν‚€λŠ” ꡬ쑰체가 threadλ₯Ό μœ„ν•œ μƒˆ μŠ€μΌ€μ€„λ§ λ§€κ°œλ³€μˆ˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. λ‹€μŒ ꡬ쑰체에 μŠ€μΌ€μ€„λ§ λ§€κ°œλ³€μˆ˜λ₯Ό λ‹΄λŠ”λ‹€.

struct sched_param {
    int sched_priority;     /* μŠ€μΌ€μ€„λ§ μš°μ„ μˆœμœ„ */
};

λ³΄λ‹€μ‹œν”Ό ν•œ κ°€μ§€ μŠ€μΌ€μ€„λ§ λ§€κ°œλ³€μˆ˜λ§Œ μ§€μ›ν•œλ‹€. 각 μŠ€μΌ€μ€„λ§ μ •μ±…μ—μ„œ ν—ˆμš©ν•˜λŠ” μŠ€μΌ€μ€„λ§ μš°μ„ μˆœμœ„ λ²”μœ„μ— λŒ€ν•œ μ„ΈλΆ€ λ‚΄μš©μ€ sched(7)λ₯Ό 보라.

pthread_getschedparam() ν•¨μˆ˜λŠ” μŠ€λ ˆλ“œ thread의 μŠ€μΌ€μ€„λ§ μ •μ±…κ³Ό λ§€κ°œλ³€μˆ˜λ₯Ό 각각 policy 및 param이 κ°€λ¦¬ν‚€λŠ” λ²„νΌλ‘œ λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜λ˜λŠ” μš°μ„ μˆœμœ„ 값은 thread에 영ν–₯을 μ€€ κ°€μž₯ 졜근의 pthread_setschedparam()μ΄λ‚˜ pthread_setschedprio(3), pthread_create(3) ν˜ΈμΆœμ—μ„œ μ„€μ •ν•œ 값이닀. λ°˜ν™˜λ˜λŠ” μš°μ„ μˆœμœ„λŠ” μš°μ„ μˆœμœ„ 상속 λ‚΄μ§€ μš°μ„ μˆœμœ„ μƒν•œ μ§€μ • ν•¨μˆ˜ 호좜둜 μΈν•œ μΌμ‹œμ  μš°μ„ μˆœμœ„ 쑰정을 λ°˜μ˜ν•˜μ§€ μ•ŠλŠ”λ‹€. (예둜 pthread_mutexattr_setprioceiling(3) 및 pthread_mutexattr_setprotocol(3) μ°Έκ³ .)

RETURN VALUE

성곡 μ‹œ 이 ν•¨μˆ˜λ“€μ€ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ 0 μ•„λ‹Œ 였λ₯˜ 번호λ₯Ό λ°˜ν™˜ν•œλ‹€. pthread_setschedparam()κ°€ μ‹€νŒ¨ν•œ 경우 thread의 μŠ€μΌ€μ€„λ§ μ •μ±… 및 λ§€κ°œλ³€μˆ˜κ°€ λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.

ERRORS

두 ν•¨μˆ˜ λͺ¨λ‘ λ‹€μŒ 였λ₯˜λ‘œ μ‹€νŒ¨ν•  수 μžˆλ‹€.

ESRCH
IDκ°€ thread인 μŠ€λ ˆλ“œλ₯Ό 찾을 수 μ—†λ‹€.

pthread_setschedparam()이 μΆ”κ°€λ‘œ λ‹€μŒ 였λ₯˜λ‘œ μ‹€νŒ¨ν•  μˆ˜λ„ μžˆλ‹€.

EINVAL
policyκ°€ μ•Œ 수 μ—†λŠ” μ •μ±…μ΄κ±°λ‚˜, policyμ—μ„œ param이 말이 λ˜μ§€ μ•ŠλŠ”λ‹€.
EPERM
ν˜ΈμΆœμžκ°€ μ§€μ •ν•œ μŠ€μΌ€μ€„λ§ μ •μ±… 및 λ§€κ°œλ³€μˆ˜λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•œ μ μ ˆν•œ νŠΉκΆŒμ„ κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€.

POSIX.1μ—μ„œλŠ” pthread_setschedparam()μ—μ„œ ENOTSUP 였λ₯˜("μŠ€μΌ€μ€„λ§ μ •μ±… 및 λ§€κ°œλ³€μˆ˜λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” κ°’μœΌλ‘œ μ„€μ •ν•˜λ €κ³  μ‹œλ„ν–ˆμŒ")도 적고 μžˆλ‹€.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
pthread_setschedparam(),
pthread_getschedparam()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008.

NOTES

μŠ€λ ˆλ“œμ˜ μŠ€μΌ€μ€„λ§ μš°μ„ μˆœμœ„λ₯Ό λ°”κΎΈλŠ” 데 ν•„μš”ν•œ κΆŒν•œκ³Ό κ·Έ 효과, 각 μŠ€μΌ€μ€„λ§ μ •μ±…μ—μ„œ ν—ˆμš©ν•˜λŠ” μš°μ„ μˆœμœ„ λ²”μœ„μ— λŒ€ν•œ μ„€λͺ…은 sched(7)λ₯Ό 보라.

EXAMPLE

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ€ pthread_setschedparam()κ³Ό pthread_getschedparam()의 μ‚¬μš© 방식뿐 μ•„λ‹ˆλΌ μ—¬λŸ¬ λ‹€λ₯Έ μŠ€μΌ€μ€„λ§ κ΄€λ ¨ pthreads ν•¨μˆ˜λ“€μ˜ μ‚¬μš© 방식도 보여 μ€€λ‹€.

μ•„λž˜ μ‹€ν–‰μ—μ„œ μ£Ό μŠ€λ ˆλ“œλŠ” 자기 μŠ€μΌ€μ€„λ§ 정책을 μš°μ„ μˆœμœ„ 10인 SCHED_FIFO둜 μ„€μ •ν•˜κ³ , μŠ€λ ˆλ“œ 속성 객체λ₯Ό μŠ€μΌ€μ€„λ§ μ •μ±… 속성 SCHED_RRκ³Ό μŠ€μΌ€μ€„λ§ μš°μ„ μˆœμœ„ 속성 20으둜 μ΄ˆκΈ°ν™” ν•œλ‹€. κ·ΈλŸ¬κ³ μ„œ ν”„λ‘œκ·Έλž¨μ€ (pthread_attr_setinheritsched(3)을 μ΄μš©ν•΄) μŠ€λ ˆλ“œ 속성 객체의 μŠ€μΌ€μ€„λŸ¬ 상속 속성을 PTHREAD_EXPLICIT_SCHED둜 μ„€μ •ν•˜λŠ”λ°, μ΄λŠ” 이 속성 객체λ₯Ό μ‚¬μš©ν•΄ μƒμ„±ν•œ μŠ€λ ˆλ“œλ“€μ΄ μŠ€λ ˆλ“œ 속성 κ°μ²΄λ‘œλΆ€ν„° 자기 μŠ€μΌ€μ€„λ§ 속성듀을 가져와야 ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. κ·ΈλŸ¬κ³ μ„œ ν”„λ‘œκ·Έλž¨μ΄ κ·Έ μŠ€λ ˆλ“œ 속성 객체λ₯Ό μ΄μš©ν•΄ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€κ³ , κ·Έ μŠ€λ ˆλ“œκ°€ 자기 μŠ€μΌ€μ€„λ§ μ •μ±…κ³Ό μš°μ„ μˆœμœ„λ₯Ό ν‘œμ‹œν•œλ‹€.

$ su      # μ‹€μ‹œκ°„ μŠ€μΌ€μ€„λ§ μ •μ±… 섀정을 μœ„ν•΄ 특ꢌ ν•„μš”
Password:
# ./a.out -mf10 -ar20 -i e
Scheduler settings of main thread
    policy=SCHED_FIFO, priority=10

Scheduler settings in 'attr'
    policy=SCHED_RR, priority=20
    inheritsched is EXPLICIT

Scheduler attributes of new thread
    policy=SCHED_RR, priority=20

μœ„ 좜λ ₯을 보면 μŠ€λ ˆλ“œ 속성 객체에 μ§€μ •λœ κ°’λ“€μ—μ„œ μŠ€μΌ€μ€„λ§ μ •μ±…κ³Ό μš°μ„ μˆœμœ„λ₯Ό κ°€μ Έμ™”μŒμ„ μ•Œ 수 μžˆλ‹€.

λ‹€μŒ 싀행은 μ•žμ„œμ™€ κ°™λ˜ μŠ€μΌ€μ€„λŸ¬ 상속 속성을 PTHREAD_INHERIT_SCHED둜 μ„€μ •ν•˜λŠ”λ°, μ΄λŠ” μŠ€λ ˆλ“œ 속성 객체λ₯Ό μ‚¬μš©ν•΄ μƒμ„±ν•œ μŠ€λ ˆλ“œλ“€μ΄ κ·Έ μŠ€λ ˆλ“œ 객체에 μ§€μ •λœ μŠ€μΌ€μ€„λ§ 속성듀을 λ¬΄μ‹œν•˜κ³  λŒ€μ‹  생성을 ν•˜λŠ” μŠ€λ ˆλ“œμ—κ²Œμ„œ μŠ€μΌ€μ€„λ§ 속성듀을 가져와야 ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

# ./a.out -mf10 -ar20 -i i
Scheduler settings of main thread
    policy=SCHED_FIFO, priority=10

Scheduler settings in 'attr'
    policy=SCHED_RR, priority=20
    inheritsched is INHERIT

Scheduler attributes of new thread
    policy=SCHED_FIFO, priority=10

μœ„ 좜λ ₯을 보면 μŠ€λ ˆλ“œ 속성 객체가 μ•„λ‹ˆλΌ 생성을 ν•˜λŠ” μŠ€λ ˆλ“œμ—κ²Œμ„œ μŠ€μΌ€μ€„λ§ μ •μ±…κ³Ό μš°μ„ μˆœμœ„λ₯Ό κ°€μ Έμ™”μŒμ„ μ•Œ 수 μžˆλ‹€.

참고둜 -i i μ˜΅μ…˜μ„ μƒλž΅ν–ˆμ–΄λ„ 좜λ ₯이 λ™μΌν–ˆμ„ 것이닀. μŠ€μΌ€μ€„λŸ¬ 상속 속성에 PTHREAD_INHERIT_SCHEDκ°€ 기본값이기 λ•Œλ¬Έμ΄λ‹€.

ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€

/* pthreads_sched_test.c */

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define handle_error_en(en, msg) \
        do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static void
usage(char *prog_name, char *msg)
{
    if (msg != NULL)
        fputs(msg, stderr);

    fprintf(stderr, "Usage: %s [options]\n", prog_name);
    fprintf(stderr, "Options are:\n");
#define fpe(msg) fprintf(stderr, "\t%s", msg);          /* 짧게 */
    fpe("-a<policy><prio> Set scheduling policy and priority in\n");
    fpe("                 thread attributes object\n");
    fpe("                 <policy> can be\n");
    fpe("                     f  SCHED_FIFO\n");
    fpe("                     r  SCHED_RR\n");
    fpe("                     o  SCHED_OTHER\n");
    fpe("-A               Use default thread attributes object\n");
    fpe("-i {e|i}         Set inherit scheduler attribute to\n");
    fpe("                 'explicit' or 'inherit'\n");
    fpe("-m<policy><prio> Set scheduling policy and priority on\n");
    fpe("                 main thread before pthread_create() call\n");
    exit(EXIT_FAILURE);
}

static int
get_policy(char p, int *policy)
{
    switch (p) {
    case 'f': *policy = SCHED_FIFO;     return 1;
    case 'r': *policy = SCHED_RR;       return 1;
    case 'o': *policy = SCHED_OTHER;    return 1;
    default:  return 0;
    }
}

static void
display_sched_attr(int policy, struct sched_param *param)
{
    printf("    policy=%s, priority=%d\n",
            (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
            (policy == SCHED_RR)    ? "SCHED_RR" :
            (policy == SCHED_OTHER) ? "SCHED_OTHER" :
            "???",
            param->sched_priority);
}

static void
display_thread_sched_attr(char *msg)
{
    int policy, s;
    struct sched_param param;

    s = pthread_getschedparam(pthread_self(), &policy, &param);
    if (s != 0)
        handle_error_en(s, "pthread_getschedparam");

    printf("%s\n", msg);
    display_sched_attr(policy, &param);
}

static void *
thread_start(void *arg)
{
    display_thread_sched_attr("Scheduler attributes of new thread");

    return NULL;
}

int
main(int argc, char *argv[])
{
    int s, opt, inheritsched, use_null_attrib, policy;
    pthread_t thread;
    pthread_attr_t attr;
    pthread_attr_t *attrp;
    char *attr_sched_str, *main_sched_str, *inheritsched_str;
    struct sched_param param;

    /* λͺ…λ Ήν–‰ μ˜΅μ…˜ 처리 */

    use_null_attrib = 0;
    attr_sched_str = NULL;
    main_sched_str = NULL;
    inheritsched_str = NULL;

    while ((opt = getopt(argc, argv, "a:Ai:m:")) != -1) {
        switch (opt) {
        case 'a': attr_sched_str = optarg;      break;
        case 'A': use_null_attrib = 1;          break;
        case 'i': inheritsched_str = optarg;    break;
        case 'm': main_sched_str = optarg;      break;
        default:  usage(argv[0], "Unrecognized option\n");
        }
    }

    if (use_null_attrib &&
            (inheritsched_str != NULL || attr_sched_str != NULL))
        usage(argv[0], "Can't specify -A with -i or -a\n");

    /* μ„ νƒμ μœΌλ‘œ μ£Ό μŠ€λ ˆλ“œμ˜ μŠ€μΌ€μ€„λ§ 속성을 μ„€μ •ν•˜κ³ 
       속성을 ν‘œμ‹œ */

    if (main_sched_str != NULL) {
        if (!get_policy(main_sched_str[0], &policy))
            usage(argv[0], "Bad policy for main thread (-m)\n");
        param.sched_priority = strtol(&main_sched_str[1], NULL, 0);

        s = pthread_setschedparam(pthread_self(), policy, &param);
        if (s != 0)
            handle_error_en(s, "pthread_setschedparam");
    }

    display_thread_sched_attr("Scheduler settings of main thread");
    printf("\n");

    /* μ˜΅μ…˜μ— 따라 μŠ€λ ˆλ“œ 속성 객체 μ΄ˆκΈ°ν™” */

    attrp = NULL;

    if (!use_null_attrib) {
        s = pthread_attr_init(&attr);
        if (s != 0)
            handle_error_en(s, "pthread_attr_init");
        attrp = &attr;
    }

    if (inheritsched_str != NULL) {
        if (inheritsched_str[0] == 'e')
            inheritsched = PTHREAD_EXPLICIT_SCHED;
        else if (inheritsched_str[0] == 'i')
            inheritsched = PTHREAD_INHERIT_SCHED;
        else
            usage(argv[0], "Value for -i must be 'e' or 'i'\n");

        s = pthread_attr_setinheritsched(&attr, inheritsched);
        if (s != 0)
            handle_error_en(s, "pthread_attr_setinheritsched");
    }

    if (attr_sched_str != NULL) {
        if (!get_policy(attr_sched_str[0], &policy))
            usage(argv[0],
                    "Bad policy for 'attr' (-a)\n");
        param.sched_priority = strtol(&attr_sched_str[1], NULL, 0);

        s = pthread_attr_setschedpolicy(&attr, policy);
        if (s != 0)
            handle_error_en(s, "pthread_attr_setschedpolicy");
        s = pthread_attr_setschedparam(&attr, &param);
        if (s != 0)
            handle_error_en(s, "pthread_attr_setschedparam");
    }

    /* μŠ€λ ˆλ“œ 속성 객체λ₯Ό μ΄ˆκΈ°ν™” ν–ˆμœΌλ©΄ 객체에 μ„€μ •λœ
       μŠ€μΌ€μ€„λ§ 속성듀을 ν‘œμ‹œ */

    if (attrp != NULL) {
        s = pthread_attr_getschedparam(&attr, &param);
        if (s != 0)
            handle_error_en(s, "pthread_attr_getschedparam");
        s = pthread_attr_getschedpolicy(&attr, &policy);
        if (s != 0)
            handle_error_en(s, "pthread_attr_getschedpolicy");

        printf("Scheduler settings in 'attr'\n");
        display_sched_attr(policy, &param);

        s = pthread_attr_getinheritsched(&attr, &inheritsched);
        printf("    inheritsched is %s\n",
                (inheritsched == PTHREAD_INHERIT_SCHED)  ? "INHERIT" :
                (inheritsched == PTHREAD_EXPLICIT_SCHED) ? "EXPLICIT" :
                "???");
        printf("\n");
    }

    /* 자기 μŠ€μΌ€μ€„λ§ 속성을 ν‘œμ‹œν•˜λŠ” μŠ€λ ˆλ“œ 생성 */

    s = pthread_create(&thread, attrp, &thread_start, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_create");

    /* ν•„μš” μ—†λŠ” 속성 객체 파기 */

    if (!use_null_attrib) {
      s = pthread_attr_destroy(&attr);
      if (s != 0)
          handle_error_en(s, "pthread_attr_destroy");
    }

    s = pthread_join(thread, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_join");

    exit(EXIT_SUCCESS);
}

SEE ALSO

getrlimit(2), sched_get_priority_min(2), pthread_attr_init(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_create(3), pthread_self(3), pthread_setschedprio(3), pthreads(7), sched(7)


2019-03-06

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