Linux는 선점형 스케줄링을 어떻게 구현합니까?

Linux는 선점형 스케줄링을 어떻게 구현합니까?

Linux Documentation Project에서 Linux 프로세스에 대한 내용을 읽고 있습니다. https://www.tldp.org/LDP/tlk/kernel/processes.html

프로세스는 항상 시스템 호출을 하기 때문에 종종 기다려야 할 수도 있습니다. 그럼에도 불구하고 프로세스가 기다리기 전에 계속 실행되면 여전히 CPU 시간을 과도하게 사용할 수 있으므로 Linux는 선점형 스케줄링을 사용합니다. 이 시나리오에서는 각 프로세스가 200ms라는 짧은 시간 동안 실행되도록 허용하고, 이 시간이 만료되면 다른 프로세스가 실행되도록 선택하고 원래 프로세스는 다시 실행될 수 있을 때까지 잠시 기다리게 됩니다. 이 작은 시간을 시간 조각이라고 합니다.

제 질문은 이 시간을 어떻게 추적할 수 있느냐는 것입니다. 현재 프로세스가 CPU를 점유하고 있는 유일한 프로세스라면 실제로 시간이 지났는지 확인할 수 있는 것이 없겠죠?

프로세스가 시스템 호출로 점프한 다음 스케줄러로 다시 점프한다는 것을 알고 있으므로 그러한 점에서 프로세스를 "교환"하는 방법이 합리적입니다. 그러나 Linux는 프로세스가 사용하는 CPU 시간을 어떻게 추적할 수 있습니까? 하드웨어 타이머를 통해서만 달성할 수 있나요?

답변1

짧은 대답은 '예'입니다. 모든 실용적인 선점 방법은 일종의 CPU 인터럽트를 사용하여 권한 모드인 Linux 커널 스케줄러로 다시 돌아갑니다.

시스템을 살펴보면 /proc/interrupts타이머를 포함하여 시스템에서 사용되는 인터럽트를 찾을 수 있습니다.

Linux에는 여러 가지 유형의 스케줄러가 있으며 고전적인 주기적 타이머 스타일은 거의 사용되지 않습니다.완전 공정한 스케줄러(CFS) 문서:

CFS는 나노초 세분성 계산을 사용하며 jiffies 또는 기타 HZ 세부 정보에 의존하지 않습니다. 따라서 CFS 스케줄러에는 이전 스케줄러와 같은 "시간 조각" 개념이 없으며 경험적 방법도 없습니다.

또한 프로그램이 시스템 호출(보통 소프트웨어 인터럽트 - "트랩"을 통해)을 발행할 때 커널은 호출 프로그램을 선점할 수도 있습니다. 이는 특히 다른 프로세스의 데이터를 기다리는 시스템 호출에서 두드러집니다.

관련 정보