Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
sched_init()

5.6. sched_init()

init 태스크가 사용하는 CPU 번로를 할당해 주고 pid hash table을 초기화 한다. 이어 타이머 인터럽트 벡터를 초기화 한다.

인터럽트 처리 루틴은 되도록이면 간결하고 빨라야할 필요가 있다. 프로그램이 실행 중에 인터럽트가 걸리면 프로그램의 실행을 멈추고 인터럽트를 처리하므로 인터럽트 처리 시간이 많이 걸린다면 다른 프로그램의 실행에 영향을 미치게된다. 리눅스에선 긴 처리 시간을 필요로 하는 인터럽트 루틴 의 문제를 해결하기 위해 인터럽트 루틴을 둘로 나눠 이 문제를 해결한다.

이 둘을 top-half, bottom-half라고 부른다. top-half는 request_irq로 등록되는 부분이고 bottom-half(줄여서 bh)는 나중에 시간이 충분할 때 실행되도록 top-half에 의해 스케쥴 된다.

top-half와 bh의 차이라면 bh가 실행되는 동안엔 다른 모든 인터럽트가 가능 상태인 것이다. 즉 top-half는 인터럽트가 걸리면 처음 실행되고 디바이스의 데이터를 특정 버퍼에 저장해 놓고 자신의 bh에 표시를 한다음 빠져나간다. 이렇게 하면 top-half는 매우 빠르게 실행되기 때문에 다른 것에 영향을 주지 않게 된다.

그러나 만약 top-half가 동작하는 중에 다른 인터럽트가 걸리면 이 것은 무시된다. 왜냐면 top-half가 실행되는 동안엔 인터럽트 컨트롤러의 IRQ 라인이 불가능 상태이기 때문이다.

가장 대표적인 인터럽트 루틴인 네트워크 인터럽트 루틴은 새로운 패킷이 도착하면 핸들러가 도착한 데이터만을 읽어 프로토콜 레이어에 전달하고 실제의 처리는 나중에 bh에 의해 나중에 실행된다.

스케쥴러의 초기화에선 가장 근본적인 3개의 bh를 초기화한다. TIMER_BH, TQUEUE_BH, IMMEDIATE_BH의 3개이다.