반응형

휴면 & 깨어남

 

  1. 휴면(Sleep)중이거나 대기(Blocked) 상태인 작업은 실행 불가능한 상태이다.
  2. 어떤 작업이 휴면 상태가 되는데는 여러가지 유이가 있지만 결국 특정 조건이 발생하는 것을 기다리는 상황으로 요약
  3. 이 조건은 일정시간이 지나는 거 일수도 파일 입출력으로 데이터를 읽어 들인 경우나 다른 하드웨어 이벤트가 발생한 경우, 사용중인 커널의 세미포어를 얻으려는 경우에 대기상태가 됨

 

대기열(Wait queues)

  • 특정 조건이 일어나기를 기다리는 단순한 프로세스 목록
  • 커널에서 wake_queue_head_t 형으로 표현
  • DECLARE_WAITQUEUE()를 이용해 정적을 생성하거나 init_waitqueue_head()함수를 이용해 동적으로 생성
  • 대기열과 과련된 조건이 발생하면 해당 대기열에 있는 프로세스를 깨우게 된다.
  • 휴면과 깨우기 작업을 올바로 구현하지 못하면 경쟁 조건 (Race Condition)이 발생한다.

 

휴면 처리작업

  1. DEFINE_WAIT() 매크로를 이용해 대기열에 추가할 항목 선택
  2. add_wait_queue() 함수를 이용해 작업을 대기열에 추가한다. 대기열이 기다리고 있는 조건이 발생하면 대기열에 있는 프로세스를 깨운다. 조건이 발생했을 때 대기열의 wake_up 함수를 호출하는 코드가 있어야 한다.
  3. prepare_to_wait() 함수를 호출해 프로세스 상태를 TASK_(UN)INTERRUPTIBLE 상태로 바꾸고 필요할 경우 작업을 다시 대기열에 넣어 루프의 후속 작업이 진행 될 수 있게 하다.
  4. 작업상태가 TAKS_INTERRUPTIBLE이면  시그널에 의해 프로세스가 깨어날 수 있으며 이럴 경우 의사각성(spurious wake up)이라고 함고 깨어나서 시그널을 확인하고 적.절히 처리한다
  5. 작업이 깨어 나면 조건이 만족되었는지 확인하고 만족됐으면 루프를 벗어나고 그렇지 않다면 schedule()을 호출해 앞의 과정을 반복
  6. 조건이 만족되면 작업 상태를 TASK_RUNNING으로 변경하고 finish_wait()함수를 호출해 대기열에서 작업을 제거

작업이 휴면상태가 되기전에 조건이 발생하면 루프가 종료되므로 작업 휴면상태가 되는 경우는 발생하지 않는다. 루프 안에 여러가지 많은 작업을 처리하는 커널 코드가 있음을 주의 해야 한다.

 

 

깨어남 (wake up)

  • 작업을 깨우는 일은 wake_up() 함수를 통해 처리
  • 주어진 대기열에 있는 모든 작업을 깨움
  • try_to_watke_up() 함수를 호출해 작업상태를 TASK_RUNNING 변경
  • enqueue_task() 함수를 호출해 작업을 다시 레드블랙트리에 추가
  • 깨어난 작업의 우선순위가 지금 실행 중인 작업의 우선순위보다 높으면 need_resched 값을 설정

 

반응형

+ Recent posts