# Mode

커널모드와 유저모드 두가지로 구분한다. 커널모드가 특권모드라면 유저모드는
일반모드이다. 커널모드는 커널 태스크와 인터럽트 핸들러 두가지 경우로 다시
분리할 수 있는데, 커널 태스크는 선점 가능한 반면 인터럽트 핸들러는 선점이
불가능하다. 즉, 스케줄링은 최하위 우선순위 인터럽트로써 동작하고 중첩되지
않는다. 이는 커널 구조의 복잡도와 데드락과 같은 논리적 오류를 최소화하기 위한
결정이다. 이 방식에서 시스템의 안정성과 응답성을 유지하기 위해서는 시스템 콜과
같은 핸들러 루틴에서의 연산을 최소화해야 한다. 리얼타임과 응답성을 높이기 위해
블럭 디바이스 접근과 같은 막대한 지연을 유발하는 `read()` 연산과 같은 경우
핸들러 진입시 커널 태스크를 fork 하고, current의 제어권을 넘기는 동시에
sleep(yield())한다. current의 시스템 콜 호출은 그대로 종료되고 나머지 연산은
선점 가능한 커널 태스크로서 처리된다. 생성된 커널 태스크가 해당 연산을 종료한
시점에 잠든 current를 깨우고 리턴값을 넘겨준다. 선점가능한 커널 태스크로
전환됨에 따라 해당 코드는 재진입가능하도록 작성되어야 하며, 동기화 문제 역시
고려되어야 한다. 일반 인터럽트의 경우 핸들러는 최소한의 주요 연산만 수행하고
나머지 연산은 `softirq`에 등록해 선점 가능한 태스크로 전환해 작업을 분산
처리하도록 한다.

스택은 모드에 따라 커널스택, 유저스택 두가지 스택이 존재한다. 커널스택은
인터럽트 발생시 인터럽트 모드에서만 사용되며, 유저스택은 나머지 모든
경우에(커널 태스크 포함) 사용된다.
