티스토리 뷰

개발/Linux

sleep_on(), wake_up()

Jaeyeon Baek 2011. 10. 10. 22:45


kernel 코딩을 하다보면 특정 process를 재워야(?)할 때가 반드시 있습니다. 반대로 재워 놓은 process를 깨워야 할 시점이 있을텐데, 이와 관련된 함수가 바로 sleep_on()과 wake_up() 입니다. 함수 형태를 살펴보면 아래와 같습니다.

sleep_on

void sleep_on(wait_queue_head_t *q)
{
    wait_queue_t wait;
    init_waitqueue_entry(&wait, current);
    current->state = TASK_UNINTERRUPTIBLE;
    add_wait_queue(wq, &wait); /* wq는 대기 큐 머리를 가리킴 */
    schedule();
    remove_wait_queue(wq, &wait);
}
wake_up
void wake_up(wait_queue_head_t *q)
{
    struct list_head *tmp;
    wait_queue_t *curr

    list_for_each(tmp, &q->task_list) {
        curr = list_entry(tmp, wait_queue_t, task_list);
        if (curr->func(curr, 
            TASK_INTERRUPTIBLE|TASK_UNINTERRUPTIBLE,
             0, NULL) && curr->flags)
            break;
    }
}


kernel 버전에 따라 함수 형태가 조금씩 다를 수 있습니다. 위 코드는 매크로로 이루어진 코드를 전부 풀어서 작성한 내용이기 때문입니다.기능은 간단합니다. sleep_on()은 task를 TASK_UNINTERRUPTIBLE 로 설정하고 이를 지정한 대기 큐에 삽입(add_wait_queue)합니다. 그런 다음 스케줄러를 호출(schedule)하여 다른 process의 실행을 재개합니다. wake_up()에 의해 task(해당 process)가 깨어나게 되면 스케줄러는 sleep_on()에서 실행을 재개 하여 process를 대기 큐에서 제거(remove_wait_queue)합니다.

이 부분은 리눅스 커널의 이해(Understanding the Linux Kernel, 3rd Edition)에도 있는 내용인데, 생각보다.. 번역이 깔끔합니다. ("대기 큐 머리를 가리킴" 같은 주석만 제외하면..;;) 번역판 책을 믿지 못하는 관계상 실제로 코드를 보며 정리하려고 했던 내용인데, 딱히 그럴 필요성이 없습니다. 직접 코드를 확인하도록 하고 필요할때 사용하도록 합시다,


'개발 > Linux' 카테고리의 다른 글

vmalloc 영역... [가설]  (0) 2011.10.28
RPC Packet header에 대한 짧은 참고의 글..  (0) 2011.10.13
lighttpd.conf [cipher-list]  (0) 2011.10.10
cron  (0) 2011.09.27
shell에 종속적이지 않은 상태의 Process?  (1) 2011.09.22
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday