CFS(Completely Fair Scheduler)를 이해하려고 합니다. 로버트 러브(Robert Love)에 따르면리눅스 커널 개발, 제3판(이탤릭체는 그의 것이고 굵은 글씨는 내 것입니다):
각 프로세스에 시간 조각을 할당하는 대신 CFS는 실행 가능한 총 프로세스 수를 기반으로 프로세스가 실행되어야 하는 시간을 계산합니다. 시간 조각을 계산하기 위해 Nice 값을 사용하는 대신 CFS는 프로세스가 수신할 프로세서 비율의 측정값으로 Nice 값을 사용합니다. 더 높은 값(낮은 우선순위)을 가진 프로세스는 기본 Nice 값에 비해 부분적인 가중치를 받습니다. , 값이 낮은 프로세스는 기본 Nice 값(우선순위가 높음)에 비해 부분적인 가중치를 받습니다.
그런 다음 각 프로세스는 해당 가중치를 실행 가능한 모든 스레드의 총 가중치로 나눈 값에 비례하는 "시간 조각"을 실행합니다. 현실적인 시간 조각을 계산하기 위해 CFS는 거의 완벽한 멀티태스킹에서 "무한히 작은" 일정 기간에 대한 목표를 설정합니다. 이 목표를 대상 대기 시간이라고 합니다... 대상 대기 시간이 20밀리초이고 동일한 우선순위를 가진 두 개의 실행 가능한 작업이 있다고 가정해 보겠습니다.이러한 작업의 우선순위에 관계없이, 각 프로세스는 다른 프로세스를 선점하기 전에 10밀리초 동안 실행됩니다.동일한 우선순위의 작업 4개가 있는 경우 각 작업은 5밀리초 동안 실행됩니다. 20개의 작업이 있는 경우 각 작업은 1밀리초 동안 실행됩니다.
이제 서로 다른 Nice 값을 제외하고 실행 가능한 두 프로세스의 경우를 다시 고려해 보겠습니다. 예를 들어 하나는 기본 Nice 값(0)이고 다른 하나는 good 값 5입니다. 이러한 Nice 값은 가중치가 다르므로 두 프로세스는 서로 다른 프로세서 시간 비율을 받습니다. 이 경우 가중치는 Nice-5 프로세스의 약 1/3 페널티입니다.목표 대기 시간이 다시 20밀리초라면 두 프로세스는 각각 15밀리초와 5밀리초의 프로세서 시간을 받게 됩니다.
첫 번째 굵은 문장은 작업이 우선순위에 관계없이 동일한 시간 조각을 갖는다는 것을 의미하고, 두 번째 문장은 시간 조각이 좋은 값에 따라 달라진다는 것을 의미합니다. 어느 것이 맞나요? 아니면 뭔가 빠졌나요?
답변1
이 2개의 문장은 CFS 작동 방식의 2가지 사례를 설명합니다. 전자는 2개의 작업이 동일한 Nice 값을 갖는 경우이고, 후자는 2개의 작업이 서로 다른 Nice 값을 갖는 경우입니다. 일반적으로 각 작업에 대해 계산된 시간 조각은 다음 공식으로 요약될 수 있습니다.
timeslice = (weight/total_weight)*target_latency
weight
작업에 할당된 좋은 값에 따라 현재 작업의 가중치입니다.
total_weight
실행 큐에 있는 모든 작업의 가중치 합계입니다.
target_latency
CFS가 실행 대기열의 모든 작업을 동시에 예약하려고 시도하는 시간 간격입니다.
원래 공식으로 돌아가서 두 작업의 nice 값이 같으면 값도 같습니다 weight
. 이를 weight
상수로 처리하면 새로운 공식은 다음과 같습니다.
timeslice = (target_latency/total_weight)
보시다시피, 실행 큐에 있는 각 작업의 시간 조각은 더 이상 해당 weight
값에 의존하지 않으므로 각 작업은 동일한 시간 조각을 받게 됩니다. 이 책에서 언급된 첫 번째 사례이다.
두 번째 사례는 좋은 가치가 다르기 때문에 weight
가치도 달라질 것이라고 언급했습니다. 각 작업은 그에 따라 시간 조각을 받습니다.