달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

'OS이야기'에 해당되는 글 86

  1. 2011.10.14 태스크릿의 스케줄링
2011. 10. 14. 15:41

태스크릿의 스케줄링 OS이야기2011. 10. 14. 15:41

스케줄링된 태스크릿은 2개의 프로세서별 구조체, 즉 tasklet_vec(일반 태스크릿)과 tasklet_hi_vec(높은 우선순위 태스크릿)에 저장된다.
이 구조체는 모두 tasklet_struct 구조체 자료형의 연결 리스트이다.  

태스크릿은 tasklet_schedule()과 tasklet_hi_schedule() 함수에 의해 스케줄링되는데 이 함수들은 태스크릿의 tasklet_struct 포인터를 매개변수로 받아들인다. 이 두 함수는 매우 비슷하다.

tasklet_schedule() 알고리즘
1. 우선 이 함수에서는 태스크릿의 state가 TASKLET_STATE_SCHED인가를 체크한다. 만약 그렇다면 태스크릿이 이미 스케줄링된 것이므로 이 함수는 그냥 리턴된다.

2. 인터럽트 시스템의 상태를 저장하고 로컬 인터럽트를 비활성화시킨다. 이것은 이 프로세서에게 tasklet_schedule()이 태스크릿을 다루는 동안, 다른 무엇인가가 태스킰 코드를 방해하는 것을 방지한다.

3. 스케줄링할 태스크릿을 각 프로세서별로 고유한 tasklet_vec 혹은 tasklet_hi_vec 연결리스트의 가장 앞부분에 추가한다.

4. TASKLET_SOFTIRQ 혹은 HI_SOFTIRQ softirq를 레이즈하여 이 태스크릿이 가까운 미래에 do_softirq()에 의해 실행되도록 한다.

5. 인터럽트를 원래 상태로 복원한 후 리턴한다.

1.인터럽트 핸들러(top half)가 빠르고 간단한 일만 함
2. 끝날 때쯤 bottom half(softirq, tasklet, workqueue)에게 위임
3. bottom half는 do_softirq를 수행함
4. do_softirq는 루프를 돌면서 비트가 1인 idx를 찾아 벡터로 이동후 softirq_vec[idx]->action 핸들러를 수행함

TASKLET_SOFTIRQ 혹은 TASKLET_SOFTIRQ가 이미 레이즈되었으므로 do_softirq()가 관련된 핸들러를 실행시킨다.
이러한 핸들러, 즉 tasklet_action()과 tasklet_hi_action()이 바로 태스크릿 처리의 핵심부이다.  
이러한 함수들이 어떤 역할을 하는가?

1. 현재 프로세서의 인터럷트 전달을 비활성화 시킨다. 그리고 현재 프로세서의 tasklet_vec혹은 tasklet_hi_vec 목록을 추출
2. 이 목록을 NULL로 초기화한다.
3. 현재 프로세서의 인터럽트 전달을 활성화한다. 이번에는 이전 상태로 복원할 필요가 없다. 왜냐하면 현재의 함수는 인터럽트      핸들러 들이 원래부터 활성화되어 있다는 것을 알기 때문이다.
4. 추출된 목록의 각 태스크릿마다 다음의 작업들을 수행한다.

5. 멀티프로세서 시스템이라면 TASKLET_STATE_RUN 플래그를 검사하여 태스크릿이 다른 프로세서에서 실행되고 있는가를 검사한다. 만약 다른 프로세서에서 실행중이라면 현재 태스크릿을 실행하지 않고 지연된 다음번 태스크릿으로 넘어간다.
6.  만약 태스크릿이 실행중이 아니면 TASKLET_STATE_RUN 플래그를 설정하여 다른 프로세서가 이 태스크릿을 실행하지 않도록 한다.
7. count값이 0인가를 확인하여 태스크릿의 비활성화 여부를 검사한다. 만약 태스크릿이 비활성되었다면 지연된 다음번 태스크릿으로 넘어간다.
8. 이제 다른 곳에서 태스크릿이 실행되고 있지 않고 다른 곳에서 실행되지 않도록 실행중으로 표시되었고 count값은 0이다. 따라서 태스크릿 핸들러를 실행한다.
9. 태스크릿의 실행이 종료되면 태스크릿의 state필드에서 TASKLET_STATE_RUN 플래그를 제거한다.
10. 더 이상 실행을 기다리는 스케줄링된 태스크릿이 없을 때까지 지연된 다음번 태스크릿에서 위의 과정을 반복한다.

**
모든 태스크릿은 2개의 softirq, 즉 HI_SOFTIRQ와 TASKLET_SOFTIRQ에 멀티 플레싱되어 있다. 태스크릿이 스케줄링되면 커널은 이 두 softirq 중 하나를 감소시킨다. 그러면 이 softirq는 특별한 함수에 의해 처리돼 스케줄링된 태스크릿을 실행하게 된다. 이 함수는 주어진 형식의 태스크릿이 동시에 오직 하나만 실행되도록 보장해준다.






















 

'OS이야기' 카테고리의 다른 글

어떤 Bottom Half를 사용해야 하는가?  (0) 2011.10.16
태스크릿의 사용  (0) 2011.10.15
태스크릿  (0) 2011.10.14
softirq 레이즈  (0) 2011.10.13
softirq 새 핸들러 등록  (0) 2011.10.13
:
Posted by НooпeУ


Code Start Code End