매뉴얼 페이지에 명시된 바와 같이:
A SCHED_FIFO thread runs until either it is blocked by an I/O
request, it is preempted by a higher priority thread, or it calls
sched_yield(2).
동일한 출처에서:
SCHED_DEADLINE threads are the
highest priority (user controllable) threads in the system; if any
SCHED_DEADLINE thread is runnable, it will preempt any thread
scheduled under one of the other policies.
이것은 스레드가rtprioSCHED_DEADLINE 스레드가 99를 선점합니까? 거기에 언급하는 것은 다소 간단하지만 rtprio 99가 시스템(watchdog, migration, posixcputimer...)에서 가장 높은 우선 순위가 될 것이라고 생각했기 때문에 약간 혼란스럽습니다. 표준 커널과 rt_patched 커널에 대해 이것을 알고 싶습니다. 모두 감사합니다.
답변1
매뉴얼 페이지가 정확합니다. 이를 확인하는 것은 어렵지 않습니다.
/* * SCHED_DEADLINE tasks has negative priorities, reflecting * the fact that any of them has higher prio than RT and * NORMAL/BATCH tasks. */ #define MAX_DL_PRIO 0
이는 Linux 스케줄러 관리자가 선택한 방법입니다. 귀하의 관심 사항과 관련된 LWN 기사의 전체 텍스트를 읽고 싶어도 아래에 LWN의 설명을 인용합니다. 이 문서의 길이가 제한되어 있기 때문에 귀하가 겪을 수 있는 모든 구체적인 혼란을 해결한다고 보장할 수 없습니다. https://lwn.net/Articles/356576/
그러나 Peter Zijlstra는 마감 일정 예약이 가장 높은 우선순위로 실행되어야 한다고 생각합니다. 그렇지 않으면 작업이 제 시간에 완료되는지 확인할 수 없습니다.
rtprio 99가 시스템에서 가장 높은 우선순위가 될 것이라고 생각했기 때문에 약간 혼란스럽습니다(watchdog, migration, posixcputimer...).
Peter's에 대한 LWN 링크예비 검토, 이것을 언급합니다.
절대적으로 가장 높은 우선순위가 필요한 작업은 kstopmachine과 migration 두 가지뿐입니다. 따라서 해당 작업은 EDF보다 높게 설정해야 하며 나머지는 중요하지 않습니다. :-)
이 경우 마이그레이션이 정확히 무엇인지는 모르지만 LWN 기사에서는 SMP 실시간이 어려운 점을 지적하고 있습니다.
목록에 있는 stopmachine은 "그러므로 RT에서는 하지 마세요!"를 의미합니다. 피터는 이 점을 분명히 했다.나중에.
Watchdog은 확실히 실시간 프로세스보다 더 긴 시간 단위로 실행되며 마감일 예약을 통해 나중에 실행할 시간을 확보할 수 있습니다(아래 참조).
아이러니하게도 저는 실시간 커널에서 타이머의 동작에 대한 정보를 찾는 데 어려움을 겪고 있습니다. 하나 있다RT 위키우선순위는 언급되지만 마감일은 언급되지 않습니다... 이 페이지는 2008년에 마지막으로 편집되었으며 PIII 400Mhz CPU가 있는 테스트 시스템을 지정합니다. Peter가 원래 댓글에서 타이머를 언급하지 않은 것도 흥미롭습니다. 가능한 경우 RT 프로세스에서 clock_nanosleep()을 사용하는 것이 권장되는 것으로 보입니다. (분명히 이것은 아마도 당신이 언급하고 있는 CPUTIME 시계에는 거의 쓸모가 없습니다).
프로세스가 지정된 최악의 실행 시간을 초과하지 않는 한 마감일 스케줄러는 마감일이 충족되도록 보장할 수 있습니다. 우선순위 스케줄러에는 이 기능이 없습니다.
관리자는 SCHED_FIFO 프로세스의 존재를 조건으로 하기보다는 이 보장을 선호합니다. 보장 없이 기한을 정하는 것은 꽤 다른 일이 될 것입니다. 그것이 어느 정도 유용성을 남기는지는 모르겠습니다.
마감일 예약 프로세스에는 최대 대역폭이 있습니다. 이는 Linux 스케줄러에 의해 시행됩니다. 원칙적으로는 최종 실행 기간이 지정된 프로세스의 전체 대역폭과 최대 실행 기간을 살펴보고 우선 순위가 지정된 프로세스에 대한 최악의 영향을 판단할 수 있어야 합니다. POSIX 스케줄링 클래스 SCHED_FIFO는 WCET를 적용하지 않기 때문에 반대의 경우는 적용되지 않습니다.
마감일 시스템은 더 이상 정적 우선순위를 사용하지 않습니다. 대신, 실행 중인 각 작업에는 세 가지 예약 매개변수 집합이 제공됩니다.
- 마감일 - 작업을 완료해야 하는 시간입니다.
- 실행 기간 - 작업을 실행해야 하는 빈도입니다.
- WCET(최악의 경우 실행 시간) - 작업을 완료하는 데 필요한 최대 CPU 시간입니다.
프로세스의 "대역폭" 요구 사항(필요한 CPU 비율)은 쉽게 계산할 수 있으므로 스케줄러는 처음부터 시스템이 초과 구독되었는지 여부를 알 수 있습니다. 스케줄러는 시스템에서 사용 가능한 것보다 더 많은 대역폭이 필요한 작업의 수락을 거부할 수 있으며 거부해야 합니다. 중복 작업을 거부함으로써 스케줄러는 항상 지정된 기한 내에 필요한 CPU 시간을 각 프로세스에 제공할 수 있습니다. 이러한 종류의 헌신은 실시간 개발자를 행복하게 만듭니다.