CFS는 언제 새로운 작업을 예약합니까?

CFS는 언제 새로운 작업을 예약합니까?

저는 "Three Easy Pieces"를 읽으면서 운영 체제에 대해 배우고 있는데 완벽하게 공정한 스케줄러에 관한 장에서 막혔습니다.여기,피. 8-10). 각 작업의 시간 조각은 장점/가중치를 기준으로 동적으로 계산되고, 각 작업의 런타임은 (또한 동적으로 계산된) vruntime을 통해 추적되며, 컨텍스트 전환이 발생하면 현재 vruntime이 가장 낮습니다. 다음 일정으로 잡자.

내가 이해하지 못하는 것은 OS가 컨텍스트 전환을 수행하기로 결정하는 경우입니다. 책의 한 부분에서는 다음과 같이 말합니다.

CFS는 주기적인 타이머 인터럽트를 사용하므로 고정된 간격으로만 결정을 내릴 수 있습니다. 이 인터럽트는 자주(예: 1밀리초마다) 발생하여 CFS에 절전 모드를 해제하고 현재 작업이 실행이 끝났는지 여부를 확인할 수 있는 기회를 제공합니다.

운영 체제는 작업 실행의 종료를 어떻게 결정합니까? 작업의 실제 실행 시간(예약으로 인해)이 해당 시간 조각 값에 도달했을 때입니까? 아니면 가상 런타임이 일정 시작부터 시간 조각에 도달하는 경우는 언제입니까? 아니면 OS가 자주 중단될 때마다 작업의 vruntime을 업데이트하고 가상 런타임이 더 낮은 다른 작업이 있는지 확인합니까?

답변1

운영 체제는 작업 실행의 종료를 어떻게 결정합니까?

저자는 이 점에 대해 매우 직접적이다.

운영 체제는 자주 중단될 때마다 작업의 vruntime을 업데이트합니까?

예. 그러나 비용이 많이 드는 컨텍스트 전환을 너무 자주 피하기 위해 일반적으로 현재 작업을 실행 상태로 둡니다.

이전에는 실행 중인 n = 4 프로세스의 예를 제공했으며 sched_latency48밀리초를 4로 나누면 각 max(6, 12)에 대해 12밀리초와 동일한 시간 조각이 제공됩니다. 그들은 다음과 같이 설명했습니다.

그런 다음 CFS는 첫 번째 작업을 예약하고 12밀리초의 (가상) 런타임을 사용할 때까지 이를 실행한 다음 실행할 vruntime이 더 낮은 작업이 있는지 확인합니다.

따라서 12개의 스케줄러 틱은 실행 중인 첫 번째 작업을 발견하고 마지막 틱에서만 CFS가 다른 작업을 예약하기 위해 해당 작업을 제거합니다.

작업의 실제 실행 시간(예약으로 인해)이 해당 시간 조각 값에 도달했을 때입니까?

실제 실행 시간은 한 주기보다 훨씬 짧을 수 있습니다. 예를 들어 작업이 실행을 시작하고 즉시 차단 read()에 걸리는 경우입니다. 이를 자발적 선점이라고 하며 비동기 타이머가 꺼질 때가 아닌 프로그램 논리와 동기적으로 발생합니다. 따라서 읽기는 대기열에 추가되고그 다음에vruntime스케줄러는 다음에 실행할 낮은 작업을 찾습니다. 그러나 인터럽트가 발생하면 현재 실행 중인 작업이 확인되고 일반적으로 계속 실행이 허용됩니다.

관련 정보