바쁜 대기

위키백과, 우리 모두의 백과사전.

바쁜 대기(영어: busy waiting 또는 spinning)란 어떠한 특정 공유자원에 대하여 두 개 이상의 프로세스나 스레드가 그 이용 권한을 획득하고자 하는 동기화 상황에서 그 권한 획득을 위한 과정에서 일어나는 현상이다. 대부분의 경우에 스핀락(Spin-lock)과 이것을 동일하게 생각하지만, 엄밀히 말하자면 스핀락이 바쁜 대기 개념을 이용한 것이다.

장단점[편집]

바쁜 대기는 공유 자원에 대한 권한 획득이 아주 빠른 시간 내에 이루어질 수 있다는 확신이 있는 상황 또는 뮤텍스세마포어 등의 동기화 객체등을 이용하기에는 그 오버헤드가 큰 상황에서 간단히 쓸 수 있다. 반면, 단순한 우선순위 스케줄링 혹은 FCFS(First-come First-served) 스케줄링 기반의 단일 프로세서 시스템에서는 바쁜 대기를 적용할 때에 시스템에 행(hang)이 걸릴 수도 있다. 따라서 이것은 멀티 프로세서 환경에서 사용하는 것이 바람직하며, 또한 바쁜 대기로 권한을 얻어서 공유자원을 이용하는 데에는 매우 짧은 시간동안의 연산만을 수행하고 곧바로 그 권한을 풀어 놓아야 한다는 제한이 있다.

예제[편집]

C[편집]

다음의 C 코드 예제는 전역 정수 i를 공유하는 스레드 2개를 나타낸다. 첫 번째 스레드는 바쁜 대기를 사용하여 i의 값의 변경사항을 검사한다:

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

volatile int i = 0; /* i is global, so it is visible to all functions.
                       It's also marked volatile, because it
                       may change in a way which is not predictable by the compiler,
                       here from a different thread. Thus preventing the compiler from
                       caching its value.*/

/* f1 uses a spinlock to wait for i to change from 0. */
static void *f1(void *p)
{
    while (i==0) {
        /* do nothing - just keep checking over and over */
    }
    printf("i's value has changed to %d.\n", i);
    return NULL;
}

static void *f2(void *p)
{
    sleep(60);   /* sleep for 60 seconds */
    i = 99;
    printf("t2 has changed the value of i to %d.\n", i);
    return NULL;
}

int main()
{
    int rc;
    pthread_t t1, t2;

    rc = pthread_create(&t1, NULL, f1, NULL);
    if (rc != 0) {
        fprintf(stderr,"pthread f1 failed\n");
        return EXIT_FAILURE;
    }

    rc = pthread_create(&t2, NULL, f2, NULL);
    if (rc != 0) {
        fprintf(stderr,"pthread f2 failed\n");
        return EXIT_FAILURE;
    }

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    puts("All pthreads finished.");
    return 0;
}

이같이 사용할 경우 C11조건 변수를 사용하는 것을 고려할 수 있다.

같이 보기[편집]

외부 링크[편집]

  • Description - The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition