Linux 커널 수준 작업(예: 파일 시스템의 IO 작업 또는 이더넷 인터페이스를 통한 통신)은 이를 트리거한 스레드의 우선 순위를 상속합니까, 아니면 스레드 Yield가 호출될 때 별도의 우선 순위로 실행됩니까?
예를 들어, SCHED_FIFO 정책과 우선 순위 99(가장 높음)를 사용하여 긴밀한 루프에 앉아서 직렬 포트에서 단일 바이트를 보내는 스레드를 생성한다고 가정합니다. 이 스레드를 SERIAL_THREAD라고 부르겠습니다.
SCHED_FIFO 정책과 우선순위 98을 사용하여 긴밀한 루프에 앉아서 동일한 TCP IP 패킷을 보내는 두 번째 스레드를 생성한다고 가정합니다. 이 스레드를 IP_THREAD라고 부르겠습니다.
또한 시스템에 하나의 코어가 있고 스레드 조절이 비활성화되어 스레드가 시스템 CPU 리소스를 100% 소비하여 다른 일이 발생하지 않도록 한다고 가정합니다.
일반적으로 SERIAL_THREAD가 시스템에서 가장 높은 우선 순위를 가지며 명시적으로 낮은 우선 순위 스레드에 양보하지 않는다는 점을 고려하면 IP_THREAD는 절대로 TCP-IP 패킷을 보낼 수 없을 것으로 예상됩니다. 그러나 스레드는 커널을 통해 IO 장치와 상호 작용하므로 IP_THREAD가 실행될 기회가 있는지 확실하지 않습니다.
답변1
우선순위가 높은 실시간 스레드는 긴밀한 이득 없음 루프에서 다른 모든 활동을 완전히 차단할 수 있습니다(I/O가 어떤 방식으로든 차단하지 않는 한).
SCHED_FIFO
시간 분할 없이 간단한 선입선출 스케줄링 알고리즘을 구현합니다. 실행 가능한SCHED_FIFO
작업은 항상 모든 작업보다 먼저 예약됩니다SCHED_NORMAL
. 작업이 실행 가능 해지면SCHED_FIFO
프로세서를 차단하거나 명시적으로 생성할 때까지 계속 실행되며 시간 분할이 없고 무기한으로 실행될 수 있습니다.
Robert Love. 리눅스 커널 개발(3판). 피. 64.
다음으로 가능한 질문은 다음과 같습니다.
동일한 우선순위를 가진 두 개 이상의 작업이
SCHED_FIFO
루프에서 실행되지만 다시 명시적으로 선택된 경우에만 프로세서를 생성합니다.