스레드 설정 전략과 이를 실행할 때 해당 전략을 따르는 방법에 대해 몇 가지 질문이 있습니다. Pthread를 사용하면 스레드의 스케줄링 정책을 설정할 수 있습니다 SCHED_FIFO/SCHED_RR/SCHED_OTHER
. Linux 커널이 CFS
기본 스케줄러 정책 으로 사용되므로 이 사용자 설정 정책이 어떻게 작동하는지 이해하려고 합니다 . CFS
실행 시 사용자 설정 정책을 덮어쓰나요? 그렇다면 pthread 스케줄링 전략의 용도는 무엇입니까?
답변1
A/기본이론 3 :CFS는 기본값이 아닙니다"스케줄링 전략"리눅스에서. CFS는 Linux의 기본 스케줄러입니다.
스케줄러는 기존의 모든 스레드 중에서 CPU 시간을 부여해야 하는 스레드를 선택합니다.
이 선택은 상황에 따라 다르게 고려되는 다양한 매개변수에 의해 제어됩니다.일정 전략패배.
모든 스레드는일정 전략.
기본일정 전략CFS는 아래와 같이 지칭됩니다.SCHED_OTHER때로는 SCHED_NORMAL로 표시되기도 합니다.
이 정책은 실제로 스케줄러에게 다음을 수행하도록 지시합니다.돈의 가치이 정책에 따라 실행되는 모든 스레드 간의 공정성을 고려하고 보장합니다.
B/실행 시간: 각 1 개진드기(또는 모든 전용 인터럽트) 스케줄러는 목록(a대기줄) 연관된 스케줄링 정책 및 해당 정책에 의존하는 기타 매개변수에 따라 실행 가능한 스레드입니다. 재정렬이 완료되면 대기열 맨 위에 있는 스레드가 선택됩니다.
"테마"에 속합니다.실시간"실행 가능한 사례에 정책(SCHED_RR/SCHED_FIFO)이 있는 경우 항상 목록의 맨 위에 표시됩니다. 정책 내 순서는 실시간 우선순위 설정에 의해 제어됩니다.
C: 귀하의 질문:이러한 경우 특정 스레드의 예약 정책을 변경하는 경우(더 정확하게는 실행 중인 스레드가 예약 정책에 대한 변경을 요청하는 시스템 호출을 실행하는 경우2 ) 그렇게 할 수 있는 권한을 얻는 한 스케줄러는 다음을 수행합니다. 그에 따라 대기열을 재정렬합니다.
예를 들어, SCHED_OTHER 스레드가 SCHED_RR로 변경되면 목록의 맨 위로 이동하고 스케줄러는 해당 값을 무시하고 지정된 실시간 우선순위에 따라 다른 SCHED_RR 스레드와 함께 정렬합니다.
그런데 이것이 귀하의 질문의 일부인 경우:
- 스케줄러는 스레드의 예약 정책을 결정/강제하지 않습니다.
- 스케줄러는 스케줄링 정책에 따라 변경되지 않습니다. 시작 시 CFS를 선택하면 CFS가 항상 스케줄러가 됩니다. 언제든지 다른 스케줄러를 선택할 수 있습니다. 일부는 CFS 패치에 포함되어 있고 다른 일부는 처음부터 작성되었으며 각각은 더 적은 오버헤드를 요구하고/좋은 값을 더 잘 처리하고/SCHED_RR 스케줄링 정책을 더 효율적으로 처리/MAX_CORES <= 4일 때 더 효율적입니다. 실행하는 데 사용하는 스케줄러는 종료될 때까지 유일한 프로그램 스케줄러 스레드로 유지됩니다.
- 어떤 경우든 스케줄러는 상위 스레드(드물게 자체적으로)가 스레드에 제공한 스케줄링 정책(대부분의 경우)에 따라 동작을 조정합니다.
1: 이는 단일 코어 환경에서 고려해야 합니다.
모든 SMP/SMP+HT 환경으로 확장할 수 있지만, 코어 간에 대기열을 공유(또는 공유하지 않음)할 수 있고 스레드가 사용 가능한 코어의 전체/일부 특정 세트에서 실행되도록 허용하므로 이해하기가 더 복잡해집니다.
2: 사용할 일련의 시스템 호출은 사용되는 API에 따라 다릅니다.
sched_setscheduler()표준적인 방법으로,pthread_setschedparam()POSIX API를 사용하는 경우. (함수 이름은 다르지만 결과는 동일함(CFS에 미치는 영향))
3: 사용 가능한 각 예약 정책에 대한 자세한 설명은 다음을 참조하세요.sched(7) Linux 매뉴얼 페이지(남자 일정.7), 저는 이것이 귀하가 찾고 있는 가장 신뢰할 수 있고 평판이 좋은 출처라는 것을 의심하지 않습니다.