System call 등에 의해 signal을 받으면 STOPPED 상태가 될 수도 있다.
TASK_UNINTERRUPTIBLE은 $ kill -9 등의 signal에 의해 중지될 수 없는 상태이다.
스케쥴링
스케쥴링 : 대기 상태의 task들 중 특정 task를 선택하여 CPU 자원에 할당하는 과정을 의미한다.
우선순위 140 단계
실시간 task : 0 ~ 99 단계
일반 task : 100 ~ 139 단계
런 큐(Runqueue)
수행 가능한 상태의 task를 자료구조로 관리 (kernel/sched/sched.h - struct rq)
CPU 당 하나의 런 큐가 유지된다.
부모 프로세스가 생성한 자식 프로세스는 동일한 CPU의 런 큐에 삽입된다.
캐시 친화력(Cache Affinity)이 있다.
다시 모든 참조 정보들 까지 복사하지 않아도 되기 때문이다.
대기 상태에서 깨어난 프로세스도 대기 전의 CPU의 런 큐에 삽입된다.
실시간 task 스케쥴링
SCHED_FIFO: 타임 슬라이스 기반, 동일한 우선순위가 없는 경우의 RR
SCHED_RR: 타임 슬라이스 기반, 동일한 우선순위 경우 타임 슬라이스 다 쓸 때까지
SCHED_DEADLINE: deadline이 가장 가까운(가장 급한) task를 스케줄링 대상으로 선정
우선순위 task_struct 구조체의 rt_priority 필드 (0 ~ 99)
일반 task 스케쥴링
SCHED_NORMAL(CFS : Completely Fare Scheduler) : N개의 프로세스가 모두 동일한 시간대로 작업되게 하는 것과, 다른 작업에 비해 작업 시간이 적게 지정된 작업에 실행 시간이 주어져야 한다는 것을 목표로 한다. (공평성을 목적으로 한다.)
과거에는 O(1) 스케쥴러를 사용했으나 그 이후 CFS를 사용
SCHED_IDLE: 중요도 낮은 일을 수행하는 태스크가 CPU 점유하는 것을 막기 위해 가장 낮은 우선순위로 스케줄링
SCHED_BATCH: 사용자와 상호 작용이 없는 CPU 중심의 일괄 작업(batch job) 태스크를 위한
리눅스 커널 Task
프로세스와 Task
task_struct 자료구조 (/include/linux/sched.h - struct task_struct)
상태 전이
$ kill -9
등의 signal에 의해 중지될 수 없는 상태이다.스케쥴링