일부 SO 질문과 커널 문서를 읽어서 제가 아는 한, Linux에서는 작업(스레드, 프로세스 또는 작업 그룹)이 가장 짧은 시간 동안(내 노트북의 경우 3밀리초에 따라) 중단 없이 실행되도록 허용됩니다. )을 /proc/sys/kernel/sched_min_capsularity_ns)로 변경하고 로드가 높으면 언제든지 중지할 수 있습니다. 그렇지 않고 CPU 시간이 초과된 경우 다른 작업을 계속하려면 해당 작업을 중지해야 합니다.
그러나 제가 이해한 바에 따르면, 일단 CPU가 작업을 실행하면 아무것도 이를 막을 수 없습니다. 이는 자연스럽게 매우 관련된 두 가지 질문을 생성합니다.
- 작업을 중지하는 방법은 무엇입니까? 내가 생각할 수 있는 유일한 것은 OS가 일종의 간단한 CPU 인터럽트를 보내는 것입니다. 아니면 여기에 더 복잡한 것이 관련되어 있습니까?
- CPU가 단일 스레드이고 한 번에 하나의 작업만 실행할 수 있는 경우 작업을 중지할 수 있습니까? CPU가 현재 작업을 실행 중인 경우 Linux는 작업을 중지해야 하는지 확인하기 위해 자체 관리 루틴을 어떻게 실행할 수 있습니까?
답변1
커널이 제어권을 얻을 때마다 스케줄링이 발생할 수 있습니다. 이를 달성하는 방법에는 두 가지가 있으며, 둘 다 단일 CPU에서도 발생할 수 있습니다.
- 하드웨어 이벤트로 인해 CPU가 해당 인터럽트 핸들러(커널 내)로 전환되는 인터럽트입니다.
- 시스템 호출, 실행 중인 작업은 커널을 호출하여 일부 작업을 수행합니다.
두 경우 모두 커널이 사용자 공간에 제어권을 반환하기 전에 어떤 실행 가능한 작업이 제어권을 받아야 하는지 결정합니다. 이는 원래 중단된 작업일 수 있지만 반드시 그런 것은 아닙니다.
하드웨어 활동이 많지 않더라도 타이머 인터럽트는 커널이 주기적으로 제어권을 얻도록 보장합니다.