사용자 정의 우선순위 값: pthread high sched prio는 양수입니까, 음수입니까?

사용자 정의 우선순위 값: pthread high sched prio는 양수입니까, 음수입니까?

이전 버전과 호환되는 방식으로 C의 RobotC API를 다시 구현하려고 합니다(일부 세부 사항은 C++에 더 적합하거나 C++를 사용하는 것이 더 쉬울 수 있음).멀티스레딩 API 재구현sched_get_priority_max(2)이식 가능한 방식으로 및 을 사용해 보았습니다 sched_get_priority_min(2). 그러나 우선순위는 -20(가장 높은 우선순위)과 19(낮은 우선순위) 사이이고, 다른 한편으로는 이전 매뉴얼 페이지에 다음과 같이 nice(1)명시 sched(7)되어 있습니다.

[...] 우선 순위 값이 높은 프로세스는 우선 순위 값이 낮은 프로세스보다 먼저 예약됩니다. 따라서 sched_get_priority_max()가 반환하는 값은 sched_get_priority_min()이 반환하는 값보다 클 것입니다.

이는 그 반대를 의미합니다. 양수 값은 우선순위가 더 높고, 음수 값은 우선순위가 낮습니다(우선순위가 1에서 99 사이인 실시간 정책의 예도 제공합니다).

sched_get_priority_max그러면 무엇이 반환되나요 _min? 무엇과 함께 사용해야 합니까 pthread_attr_setschedparam(3)?

내 사용자 정의 우선순위 범위를 정의하는 세 가지 값이 있습니다: 낮은 우선순위( kLowPriority, 0으로 설정), 높은 우선순위( kHighPriority, 255로 설정), 기본 우선순위( kDefaultPriority, 7로 설정). 이상적으로는 기본값이 0인 스케줄링 정책에 대해 kDefaultPriority/7이 0이 되어야 하고 kHighPriority/255가 가장 높은 우선순위(19? 99? sched_get_priority_max(3)반환되는 값)이거나 권한이 없을 수도 있다고 생각합니다. 할당할 수 있는 가장 높은 우선순위는 무엇입니까? 그렇다면 , 아니면 가장 낮은 우선순위...어느 것이 더 합리적일까요 kLowPriority?0 ± kDefaultPriority

현재 나는 이렇게 생각합니다:

pthread_attr_t attr;
pthread_t thread;
struct sched_param param;
const int policy = sched_getscheduler(0),
  sched_high_prio = sched_get_priority_max(policy), // 19,
  sched_low_prio = sched_get_priority_min(policy), // -20,
  sched_range_prio = sched_high_prio - sched_low_prio;
pthread_attr_init (&attr);
pthread_attr_getinheritsched(&attr, PTHREAD_INHERIT_SCHED);
pthread_attr_getschedparam (&attr, &param);
param.sched_priority = -(((nTaskPriority
                           - kLowPriority) * sched_range_prio
                          / kHighPriority) + sched_low_prio
                         - kDefaultTaskPriority);

추신: POSIX API에 대해 질문하기에 가장 좋은 곳이 여기인지 아니면 확실하지 않습니다.스택 오버플로, 그러니까 제가 이 두 가지 일을 하고 있으니 제 글을 삭제해 주시거나, 엉뚱한 곳에 있다고 생각하시면 삭제해달라고 해주세요. 편집하다:그래서 포스팅은삭제되었습니다.

답변1

나는 당신이 휴대용 답변을 찾고 있다고 생각하지만 이것을 이해하는 좋은 시작은 맨페이지에 설명된 대로 Linux의 동작을 살펴보는 것입니다.sched(7), "일정 전략" 섹션에서:

스케줄러는 CPU가 다음에 실행할 실행 가능한 스레드를 결정하는 커널 구성 요소입니다. 각 스레드에는 연관된 일정 정책과변화 없는일정 우선순위, 스케줄링 우선순위. 스케줄러는 스케줄링 정책에 대한 지식과 시스템에 있는 모든 스레드의 정적 우선순위를 기반으로 결정을 내립니다.

일반 스케줄링 정책( SCHED_OTHER, SCHED_IDLE, ) 중 하나 SCHED_BATCH에 따라 스케줄된 스레드 의 경우,스케줄링 우선순위일정 결정에 사용되지 않습니다(0으로 지정해야 함).

실시간 정책( SCHED_FIFO, ) 중 하나 SCHED_RR에 따라 예약된 프로세스 가스케줄링 우선순위값의 범위는 1(낮음)부터 99(높음)까지입니다. (숫자에서 알 수 있듯이 실시간 스레드는 항상 일반 스레드보다 우선순위가 높습니다.) 참고: POSIX.1은 실시간 정책에 대해서만 최소 32개의 서로 다른 우선순위를 지원하도록 구현해야 하며 일부 시스템은 이 기능을 최저 한도. 이식 가능한 프로그램은 다음을 사용해야 합니다.sched_get_priority_min(2)그리고 sched_get_priority_max(2)특정 정책이 지원하는 우선순위 범위를 알아보세요.

당신은 또한 볼 수 있습니다POSIX 문서pthread_setschedparam, 이는 세 가지 정책( SCHED_OTHER, SCHED_FIFOSCHED_RR)만 필요하며 첫 번째 정책에 따른 동작이 구현에 따라 정의됨을 선언합니다.

따라서 이식 가능한 우선순위로 스레드를 예약하려면 먼저 적절한 전략(FIFO 또는 라운드 로빈)을 사용해야 합니다. 그런 다음 값의 범위를 결정하고 적절한 우선순위를 설정하십시오. 스레드와 프로세스는 우선 순위를 낮추어 예약됩니다. 우선 순위가 높은 스레드가 먼저 실행됩니다.

Linux에서 POSIX 구현에 의해 정의된 기본 동작은 nice값과 특정 스레드가 실행되는 빈도를 기반으로 계산되는 동적 우선 순위를 사용합니다.아니요계획됨. Linux에서 이 nice값은 낮은 우선순위에서 높은 우선순위를 결정하므로 -20이 가장 높은 우선순위이고 19가 가장 낮은 우선순위입니다. POSIX에서는 이를 프로세스별 값으로 설명 nice하지만 Linux에서는 스레드별이므로 스레드를 예약하는 데 사용할 수 있습니다(그러나 이식 가능하지는 않습니다).

관련 정보