cpu priority management
cpu priority를 관리하는 cpupri는 시스템의 존재하는 각 CPU의 우선순위를 관리한다. 이를 통해 global migration decision이 쉽게 계산될 수 있다.
각 CPU는 아래 중 하나의 상태가 될 수 잇다.
(INVALID), IDLE, NORMAL, RT1, ... RT99
상태는 낮은 우선순위에서부터 높은 우선순위를 나타낸다. INVALID 상태의 CPU들은 routing에 적절하지 않다. 커널은 2차원 비트맵으로 this state를 관리한다.(첫번째는 priority, 두번째는 cpu?) 따라서 별도로 cpu affinity 제약이 없는 어플리케이션이라면 알맞은 CPU를 O(1) 복잡도로 찾을 수 있다(two bit search). cpu affiniti 제약 있는 어플리케이션은 최악의 경우 O(min(102, nr_domcpus))의 복잡도를 갖는다. though the scenario that yields the worst case search is fairly contrived.
convert_prio()
태스크의 priority를 cpupri에서의 priority로 변환하는 함수임. 태스크가 사용하는 priority range와 cpupri의 priority range가 다름. 매칭시켜서 리턴해주는게 필요함.
static int convert_prio(int prio)
{
int cpupri;
if (prio == CPUPRI_INVALID)
cpupri = CPUPRI_INVALID;
else if (prio == MAX_PRIO)
cpupri = CPUPRI_IDLE;
else if (prio >= MAX_RT_PRIO)
cpupri = CPUPRI_NORMAL;
else
cpupri = MAX_RT_PRIO - prio + 1;
return cpupri;
}
간단한 if else의 반복이므로 정리하면 아래와 같음. 나중에 타임라인같은 줄로 0 ~ 140까지 값을 쓴다음 대응되는 cpupri 값을 범위지어주면 깔끔하겠음..
- priority == CPUPRI_INVALID(-1)
- CPUPRI_INVALID
- priority == MAX_PRIO(140)
- return CPUPRI_IDLE
- priority >= MAX_RT_PRIO(100)
- return CPUPRI_NORMAL
- remain case
- return MAX_RT_PRIO - priority +1