linux wait 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()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.