linux wait queue

리 눅 스 드라이버 에 서 는 대기 열 (waitqueue) 을 사용 하여 프로 세 스 를 깨 울 수 있 습 니 다.waitquue 는 일찍부터 리 눅 스 커 널 에 기본 적 인 기능 단위 로 나 타 났 습 니 다. 이 는 팀 의 기본 데이터 구조 로 프로 세 스 스케줄 링 체제 와 밀접 하 게 결합 하여 커 널 에서 비동기 이벤트 알림 체 제 를 실현 할 수 있 습 니 다.대기 열 은 시스템 자원 에 대한 접근 을 동기 화 할 수 있 습 니 다.(신 호 량 은 커 널 에서 도 대기 열 에 의존 하여 이 루어 진다).    Linux - 2.6 대기 열 에 대한 다음 동작 을 제공 합 니 다.    (1) '대기 열 헤더' 를 정의 합 니 다.        wait_queue_head_t my_queue;
defined in linux/wait.h   50 struct __wait_queue_head {
 51         spinlock_t lock;
 52         struct list_head task_list;
 53 };
 54 typedef struct __wait_queue_head wait_queue_head_t;

         (2) '대기 열 헤더' 초기 화        init_waitqueue_head(&my_queue); defined in linux/wait.c header file
  13 void init_waitqueue_head( wait_queue_head_t *q)
 14 {
 15         spin_lock_init(&q->lock);
 16         INIT_LIST_HEAD(&q->task_list);
 17 }

           단축 키 정의 및 초기 화:        DECLARE_WAIT_QUEUE_HEAD(my_queue);   linux/wait.h
 70 #define __WAIT_QUEUE_HEAD_INITIALIZER(name) {                           /
 71         .lock           = __SPIN_LOCK_UNLOCKED(name.lock),              /
 72         .task_list      = { &(name).task_list, &(name).task_list } }
 74 #define DECLARE_WAIT_QUEUE_HEAD(name) /
 75         wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)


    (3) 대기 열 정의        DECLARE_WAITQUEUE(name, tsk);         name 이라는 대기 열 (wait queue t) 을 정의 하고 초기 화 합 니 다. linux / wait. h
 32 struct __wait_queue {
 33         unsigned int flags;
 34 #define WQ_FLAG_EXCLUSIVE       0x01
 35         void *private;
 36         wait_queue_func_t func;
 37         struct list_head task_list;
 38 };

 28 typedef struct __wait_queue wait_queue_t;
 
 62 #define __WAITQUEUE_INITIALIZER(name, tsk) {                            /
 63         .private        = tsk,                                          /
 64         .func           = default_wake_function,                        /
 65         .task_list      = { NULL, NULL } }
 66 
 67 #define DECLARE_WAITQUEUE(name, tsk)                                    /
 68         wait_queue_t name = __WAITQUEUE_INITIALIZER(name, tsk)

    (4) 대기 열 추가 / 제거        void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);         void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);         add wait queue () 는 대기 열 wait 를 대기 열 헤더 q 가 가리 키 는 대기 열 링크 에 추가 하 는 데 사용 되 며, remove wait queue () 는 대기 열 wait 를 부속 대기 열 헤더 q 가 가리 키 는 대기 열 링크 에서 제거 하 는 데 사 용 됩 니 다.    (5) 이벤트 대기        wait_event(queue, condition);         wait_event_interruptible(queue, condition);         wait_event_timeout(queue, condition, timeout);         wait_event_interruptible_timeout(queue, condition, timeout);        첫 번 째 매개 변수 quue 가 대기 열 헤더 로 서 대기 열 이 깨 어 나 기 를 기다 리 고 있 으 며, 두 번 째 매개 변수 condition 이 만족 해 야 합 니 다. 그렇지 않 으 면 차단 되 어야 합 니 다. wait event () 와 wait event interruptible ()후 자 는 신호 에 의 해 끊 길 수 있 지만 전 자 는 할 수 없다 는 차이 가 있 습 니 다. 게다가 timeout 후의 매크로 는 기다 리 는 시간 초과 시간 을 막 는 것 을 의미 합 니 다. jiffy 단위 로 세 번 째 매개 변수의 timeout 이 도 착 했 을 때 condition 이 만족 하 든 안 하 든 모두 돌아 갑 니 다.    (6) 대기 열 깨 우기        void wake_up(wait_queue_head_t *queue);         void wake_up_interruptible(wait_queue_head_t *queue);         이 동작 은 대기 열 헤더 로 대기 열 에 대응 하 는 모든 대기 열 을 깨 웁 니 다.        wake_up()               <--->    wait_event()                                          wait_event_timeout()         wake_up_interruptible() <--->    wait_event_interruptible()                                            wait_event_interruptible_timeout()         wake up () 은 TASK INTERRUPTIBLE 과 TASK UNINTERRUPTIBLE 에 있 는 프로 세 스 를 깨 울 수 있 습 니 다.        wake up interruptble () 은 TASK INTERRUPTIBLE 에 있 는 프로 세 스 만 깨 울 수 있 습 니 다.    (7) 대기 열 에서 잠 자기        sleep_on(wait_queue_head_t *q);         interruptible_sleep_on(wait_queue_head_t *q);               sleep on () 함수 의 역할 은 현재 프로 세 스 의 상 태 를 TASK UNINTERRUPTIBLE 로 설정 하고 대기 열 을 정의 하 며 대기 열 헤더 q 에 추가 하 는 것 입 니 다. 지원 이 받 을 때 까지 q 가 안내 하 는 대기 열 이 깨 어 납 니 다.       interruptible sleep on () 은 sleep on () 함수 와 유사 합 니 다. 현재 프로 세 스 의 상 태 를 TASK INTERRUPTIBLE 로 설정 하고 대기 열 을 정의 한 다음 대기 열 헤더 q 에 부속 하 는 역할 을 합 니 다. 자원 을 얻 을 수 있 을 때 까지 q 가 안내 하 는 대기 열 이 깨 어 나 거나 프로 세 스 가 신 호 를 받 습 니 다.           sleep_on()               <--->   wake_up()         interruptible_sleep_on() <--->   wake_up_interruptible()

좋은 웹페이지 즐겨찾기