Linux 프로 세 스 대기 열
이 링크 에는 대기 열 헤더 (wait quue head t) 와 대기 열 항목 (wait quue t) 두 가지 데이터 구조 가 있 습 니 다.대기 열 헤더 와 대기 열 항목 에 list 가 포함 되 어 있 습 니 다.head 형식의 도 메 인 은 '연결 부품' 입 니 다.이것 은 두 개의 링크 와 tast 를 기다 리 는 머리 를 기다 리 는 프로 세 스 목록 과 연결 합 니 다.위의 그림 에서 뚜렷하게 볼 수 있다.그래서 대기 행렬 을 이 루 려 면 먼저 두 부분 이 있어 야 한 다 는 것 을 알 고 있다.대기 열 헤더 와 대기 열 항목.다음은 그들의 데이터 구 조 를 보 겠 습 니 다.
struct list_head { struct list_head *next, *prev; }; struct __wait_queue_head { spinlock_t lock; struct list_head task_list; }; typedef struct __wait_queue_head wait_queue_head_t; struct __wait_queue { unsigned int flags; #define WQ_FLAG_EXCLUSIVE 0x01 void *private;//2.6 void , struct task_struct * task; // , private task wait_queue_func_t func; struct list_head task_list; };
그래서 대기 열 헤더 와 대기 열 항목 은 list 를 통 해head 가 연 결 된, listhead 는 양 방향 링크 로 Liux 커 널 에서 광범 위 하 게 응용 된다.또한 list. h 에 서 는 많은 조작 이 있 습 니 다.
2. 열 헤더 와 대기 열 항목 의 초기 화: wait_queue_head_t my_queue;
init_waitqueue_head(&my_queue);
직접 정의 하고 초기 화 합 니 다.init_waitqueue_head () 함 수 는 자 회전 자 물 쇠 를 잠 금 되 지 않 은 것 으로 초기 화하 고 대기 열 이 비어 있 는 양 방향 순환 링크 로 초기 화 합 니 다.
DECLARE_WAIT_QUEUE_HEAD(my_queue);
정의 및 초기 화
3. 대기 열 정의: DECLAREWAITQUEUE(name,tsk);
#define DECLARE_WAITQUEUE(name, tsk) / wait_queue_t name =__WAITQUEUE_INITIALIZER(name, tsk) #define __WAITQUEUE_INITIALIZER(name, tsk) { task: tsk, task_list: { NULL, NULL }, __WAITQUEUE_DEBUG_INI(name)}
그것 의 해석 은: DECLARE 통과 하기WAITQUEUE 매크로 는 대기 열 항목 을 해당 하 는 작업 구조 로 초기 화하 고 연결 에 사용 할 관련 포인터 가 모두 비어 있 습 니 다.디 버 깅 관련 코드 가 추가 되 었 습 니 다. 프로 세 스 는 다음 절 차 를 통 해 대기 열 에 자신 을 추가 합 니 다: 1) DECLARE 호출WAITQUEUE () 대기 열 항목 만 들 기;2) add 호출wait_queue () 대기 열 에 자신 을 추가 합 니 다.이 대기 열 은 프로 세 스 가 기다 리 는 조건 이 만족 할 때 깨 웁 니 다.다른 곳 에 관련 코드 를 쓰 고 사건 발생 시 대등한 대기 열 에서 wake 를 실행 합 니 다.up () 동작.3) 프로 세 스 상 태 를 TASK 로 변경INTERRUPTIBLE or TASK_UNINTERRUPTIBLE。4) 상태 가 TASK 로 설정 되면INTERRUPTIBLE 은 신호 가 프로 세 스 를 깨 웁 니 다.위 각성 (깨 우 는 것 은 사건 의 발생 때 문 이 아니 라) 을 위해 신 호 를 검사 하고 처리 하 는 것 이다.5) condition 이 진짜 인지, 진짜 인지 확인 하려 면 휴면 할 필요 가 없 으 며, 사실 이 아니라면 scheduled () 를 호출 합 니 다.6) 프로 세 스 가 깨 어 났 을 때 조건 이 사실 인지 다시 확인 합 니 다.순환 을 종료 합 니 다. 그렇지 않 으 면 scheduled () 를 다시 호출 하고 이 동작 을 계속 반복 합 니 다.7) condition 만족 후 프로 세 스 는 자신 을 TASK 로 설정 합 니 다.RUNNING 및 removewait_quue () 종료.
4. (대기 열 헤더 에서) 대기 열 추가 / 이동
(1)add_wait_queue () 함수: (2) removewait_queue () 함수:
5. 이벤트 대기: (조건 부 수면)
1)wait_이벤트 () 매크로:
#define wait_event(wq, condition) / do { / if (condition) / break; / __wait_event(wq, condition); / } while (0) #define __wait_event_timeout(wq, condition, ret) / do { / DEFINE_WAIT(__wait); / / for (;;) { / prepare_to_wait(&wq, &__wait, TASK_UNINTERRUPTIBLE); / if (condition) / break; / ret = schedule_timeout(ret); / if (!ret) / break; / } / finish_wait(&wq, &__wait); / } while (0)
대기 회 열 에서 condition 이 진짜 일 때 까지 잠 을 잔다.기다 리 는 동안 프로 세 스 가 TASK 로 설 정 됩 니 다.condition 변수 가 진짜 로 변 할 때 까지 UNINTERRUPTIBLE 은 수면 에 들어간다.프로 세 스 가 깨 어 날 때마다 condition 의 값 을 검사 합 니 다.
(2)wait_event_interruptible () 함수:
wait이벤트 () 의 차이 점 은 이 매크로 를 호출 하여 기다 리 는 동안 현재 프로 세 스 가 TASK 로 설 정 됩 니 다.INTERRUPTIBLE 상태 입 니 다. 깨 어 날 때마다 condition 이 진짜 인지 먼저 확인 하고, 진짜 라면 되 돌아 갑 니 다. 그렇지 않 으 면 프로 세 스 가 신호 에 깨 어 났 다 면 - RESTARTSYS 오류 코드 로 돌아 갑 니 다. condition 이 진짜 라면 0 으로 돌아 갑 니 다.
(3)wait_event_timeout () 매크로:
wait이벤트 () 는 유사 합 니 다. 단, 주어진 수면 시간 이 음수 라면 즉시 돌아 갑 니 다. 수면 중 에 깨 어 나 고 condition 이 진실 이면 남 은 수면 시간 으로 돌아 갑 니 다. 그렇지 않 으 면 주어진 수면 시간 이 도착 하거나 초과 될 때 까지 계속 잠 을 자고 0 으로 돌아 갑 니 다.
(4)wait_event_interruptible_timeout () 매크로:
waitevent_timeout () 은 유사 하지만 수면 중 신호 가 끊 기 면 ERESTARTSYS 오류 코드 로 돌아 갑 니 다.
(5) wait_event_interruptible_exclusive () 매크로
똑 같이 waitevent_interruptible () 과 같 지만 이 수면 의 진행 과정 은 서로 배척 하 는 과정 입 니 다.
6. 대기 열 깨 우기:
(1)wake_up () 함수:
대기 열 을 깨 웁 니 다. TASK 에 있 는 각성 가능INTERRUPTIBLE 과 TASKUNINTERUPTIBLE 상태의 프로 세 스 와 waitevent/wait_event_timeout 쌍 으로 사용.
2)wake_up_interruptible () 함수: \ # define wakeup_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
wakeup () 유일한 차이 점 은 TASK 만 깨 울 수 있다 는 것 이다.INTERRUPTIBLE 상태의 프로 세 스., waitevent_interruptible/wait_event_interruptible_timeout/ wait_event_interruptible_exclusive 쌍 으로 사용 합 니 다.
TASK_INTERRUPTIBLE, signal 을 보 내 서 깨 울 수 있 습 니 다 (잠 을 끊 을 수 있 는 상태).
TASK_UNINTERRUPTIBLE, 어떤 singal 도 받 지 않 습 니 다.
7. 대기 열 에서 수면: (무조건 수면, 오래된 커 널 사용, 새 커 널 사용 권장)
(1)sleep_on () 함수:
이 함수 의 역할 은 대기 열 (wait) 을 정의 하고 현재 프로 세 스 를 대기 열 (wait) 에 추가 한 다음 현재 프로 세 스 의 상 태 를 TASK 로 설정 하 는 것 입 니 다.UNINTERRUPTIBLE, 대기 열 (wait) 을 대기 열 헤더 (q) 에 추가 합 니 다.그 다음 에 자원 을 가 져 올 때 까지 대기 열 헤더 (q) 에서 깨 어 나 대기 열 헤더 에서 이동 합 니 다.대기 자원 이 걸 려 있 는 동안 이 프로 세 스 는 신호 로 깨 어 날 수 없습니다.
(2)sleep_on_timeout () 함수:
와 sleepon () 함수 의 차 이 는 이 함 수 를 호출 할 때 지정 한 시간 내 에 (timeout) 기다 리 는 자원 을 얻 지 못 하면 되 돌아 오 는 것 입 니 다.실제로는 schedule 호출timeout () 함수 가 이 루어 졌 습 니 다.주의해 야 할 것 은 주어진 수면 시간 (timeout) 이 0 보다 적 으 면 잠 을 자지 않 는 다 는 점 이다.이 함수 가 돌아 오 는 것 은 진정한 수면 시간 이다.
(3)interruptible_sleep_on () 함수:
이 함수 와 sleepon () 함수 의 유일한 차이 점 은 현재 프로 세 스 의 상 태 를 TASK 로 설정 하 는 것 입 니 다.INTERRUPTINLE 은 수면 중 에 이 프로 세 스 가 신 호 를 받 으 면 깨 어 난 다 는 뜻 이다.
(4)interruptible_sleep_on_timeout () 함수:
sleep 와 유사on_timeout () 함수.프로 세 스 는 수면 중 에 기다 리 는 시간 이 도착 하지 않 으 면 신호 에 의 해 끊 겨 깨 어 날 수도 있 고, 기다 리 는 시간 이 도착 해서 깨 어 날 수도 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.