스레드 스케줄링
스레드를 스케줄링할 수 있으며, 스레드 라이브러리에서 몇몇 기능을 제공하여 스레드의 스케줄링을 처리하고 제어합니다.
이는 또한 뮤텍스 잠금과 같이 동기화 조작 중에 스레드의 스케줄링을 제어할 기능을 제공합니다. 각 스레드에는 자체 스케줄링 매개변수 세트가 있습니다. 이러한 매개변수는 스레드가 작성되기 전에 스레드 속성 오브젝트를 통해 설정될 수 있습니다. 또한 매개변수는 스레드의 실행 중에 동적으로 설정될 수 있습니다.
스레드의 스케줄링을 제어하는 것은 복잡한 태스크일 수 있습니다. 스케줄러가 시스템 전반의 모든 스레드를 처리하므로, 스레드의 스케줄링 매개변수가 해당 프로세스 및 기타 프로세스에 있는 모든 기타 스레드의 매개변수와 상호작용합니다. 스레드의 스케줄링을 제어하려는 경우 다음 기능을 먼저 사용해야 합니다.
- 스레드 작성 시 스케줄링 속성 설정
- 작성된 스레드의 스케줄링 속성을 동적으로 변경
- 뮤텍스 작성 시 스레드의 스케줄링에 대한 뮤텍스의 영향 정의(동기화 스케줄링이라고 알려짐)
- 동기화 조작 중 스레드의 스케줄링을 동적으로 변경(동기화 스케줄링으로 알려짐)
스케줄링 매개변수
스레드에 다음 스케줄링 매개변수가 있습니다.
| 매개변수 | 설명 |
|---|---|
| 범위 | 스레드의 경합 범위가 스레드 라이브러리에 사용된 스레드 모델에 의해 정의됩니다. |
| 정책 | 스레드의 스케줄링 정책이 CPU의 제어를 가져온 후 스케줄러가 스레드를 처리하는 방법을 정의합니다. |
| 우선순위 | 스레드의 스케줄링 우선순위가 각 스레드에서 수행 중인 작업의 상대적 중요성을 정의합니다. |
스케줄링 매개변수는 스레드의 작성 이전이나 스레드의 실행 중에 설정될 수 있습니다. 일반적으로, 스레드의 스케줄링 매개변수를 제어하는 것은 CPU에 집중된 스레드에 대해서만 중요합니다. 따라서, 스레드 라이브러리에서는 대부분의 경우 충분한 디폴트 값을 제공합니다.
inheritsched 속성 사용
스레드 속성 오브젝트의 inheritsched 속성은 스레드의 스케줄링 속성이 정의되는 방법을 지정합니다. 유효값은 다음과 같습니다.
| 값 | 설명 |
|---|---|
| Pthread_inherit_sched | 새 스레드가 해당 작성 스레드의 스케줄링 속성(schedpolicy 및 schedparam 속성)을 가져오도록 지정합니다. 속성 오브젝트에 정의된 스케줄링 속성은 무시됩니다. |
| Pthread_explicit_sched | 새 스레드가 이 속성 오브젝트에 정의된 스케줄링 속성을 가져오도록 지정합니다. |
inheritsched 속성의 디폴트 값은 PTHREAD_INHERIT_SCHED입니다. 속성은 pthread_attr_setinheritsched 서브루틴을 호출하여 설정됩니다. 속성의 현재 값은 pthread_attr_getinheritsched 서브루틴을 호출하여 리턴됩니다.
스레드 속성 오브젝트에서 스레드의 스케줄링 속성을 설정하려면 inheritsched 속성이 먼저 PTHREAD_EXPLICIT_SCHED로 설정되어야 합니다. 그렇지 않으면, 속성-오브젝트 스케줄링 속성이 무시됩니다.
스케줄링 정책 및 우선순위
스레드 라이브러리는 다음 스케줄링 정책을 제공합니다.
| 라이브러리 | 설명 |
|---|---|
| SCHED_FIFO | 선입선출(FIFO) 스케줄링입니다. 각 스레드의 우선순위는 고정되어 있습니다. 복수의 스레드의 우선순위 레벨이 동일한 경우 FIFO 순서로 실행되어 완료됩니다. |
| SCHED_RR | 라운드 로빈(RR) 스케줄링입니다. 각 스레드의 우선순위는 고정되어 있습니다. 복수의 스레드의 우선순위 레벨이 동일한 경우 FIFO 순서로 고정된 일정 시간 동안 실행됩니다. |
| SCHED_OTHER | 기본 AIX 스케줄링. 각 스레드에는 스레드의 활동에 따라 스케줄러가 동적으로 수정하는 초기 우선순위가 있습니다. 스레드 실행은 시간 분할됩니다. 기타 시스템에서 이 스케줄링 정책은 다를 수 있습니다. |
5.3 버전 이전의 AIX 버전에서는 해당 스케줄링 정책을 SCHED_OTHER로 설정할 때 스레드의 우선순위 변경이 허용되지 않습니다. 이 경우, 커널이 우선순위를 직접 관리하고 pthread_setschedparam 서브루틴에 전달될 수 있는 법적 값만 DEFAULT_PRIO 값입니다. DEFAULT_PRIO 값이 pthread.h 파일에 1로 정의되고 기타 전달된 값은 무시됩니다.
AIX 5.3부터, 스케줄링 정책을 SCHED_OTHER로 설정할 때 스레드의 우선순위를 변경할 수 있습니다. pthread_setschedparam 서브루틴에 전달될 수 있는 법적 값이 40부터 80까지이지만, 특권 사용자만 우선순위를 60 이상으로 설정할 수 있습니다. 1부터 39까지 범위의 우선순위에서는 40과 동일한 우선순위를 제공하고 81부터 127까지 범위의 우선순위에서는 80과 동일한 우선순위를 제공합니다.
| 필드 | 설명 |
|---|---|
| sched_priority | 우선순위를 지정합니다. |
| sched_policy | 이 필드는 스레드 라이브러리에서 무시됩니다. 사용하지 마십시오. |
작성 시 우선순위 및 스케줄링 정책 설정
스케줄링 정책은 스레드 속성 오브젝트의 schedpolicy 속성을 설정하여 스레드를 작성할 때 설정할 수 있습니다. pthread_attr_setschedpolicy 서브루틴에서는 스케줄링 정책을 이전에 정의된 스케줄링 정책 중 하나로 설정합니다. 스레드 속성 오브젝트의 schedpolicy 속성의 현재 값은 pthread_attr_getschedpolicy 서브루틴을 사용하여 가져올 수 있습니다.
스케줄링 우선순위는 스레드 속성 오브젝트의 schedparam 속성을 설정하여 스레드의 작성 시간에 설정될 수 있습니다. pthread_attr_setschedparam 서브루틴은 지정된 구조의 값을 복사하여 schedparam 속성의 값을 설정합니다. pthread_attr_getschedparam 서브루틴은 schedparam 속성을 가져옵니다.
sched_param schedparam;
schedparam.sched_priority = 3;
pthread_attr_init(&attr);
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_setschedparam(&attr, &schedparam);
pthread_create(&thread, &attr, &start_routine, &args);
pthread_attr_destroy(&attr);inheritsched 속성에 대한 자세한 정보는 inheritsched 속성 사용을 참조하십시오.실행 시간에 스케줄링 속성 설정
pthread_getschedparam 서브루틴은 스레드의 schedpolicy 및 schedparam 속성을 리턴합니다. 이러한 속성은 pthread_setschedparam 서브루틴을 호출하여 설정될 수 있습니다. 목표 스레드가 프로세서에서 현재 실행 중인 경우 그 다음 번에 스레드가 스케줄링 될 때 새 스케줄링 정책 및 우선순위가 구현됩니다. 목표 스레드가 실행 중이 아닌 경우 서브루틴 호출 종료 시 즉시 스케줄링될 수 있습니다.
예를 들어, T의 schedpolicy 속성이 FIFO로 변경되는 순간 라운드 로빈 정책으로 현재 실행 중인 스레드 T를 고려하십시오. T는 해당 시간 분할이 종료될 때까지 실행되며, 이 때 해당 스케줄링 속성이 그 다음에 재평가됩니다. 우선순위가 더 높은 스레드가 없는 경우, 우선순위가 동일한 기타 스레드 이전에도 T가 다시 스케줄링됩니다. 우선순위가 낮은 스레드가 실행 중이 아닌 두 번째 예제를 고려하십시오. 이 스레드의 우선순위가 pthread_setschedparam 서브루틴을 호출하는 다른 스레드에 의해 올라간 경우, 우선순위가 가장 높은 실행 가능한 스레드이면 즉시 목표 스레드가 스케줄링됩니다.
스케줄링-정책 고려사항
- 라운드 로빈 정책을 사용하면 우선순위 레벨이 동일한 모든 스레드가 해당 활동에 상관없이 동등하게 스케줄링됩니다. 이는 스레드가 센서를 읽거나 작동기를 써야 하는 프로그램에서 유용할 수 있습니다.
- FIFO 정책을 매우 주의하여 사용해야 합니다. FIFO 정책으로 실행 중인 스레드는 입력 및 출력 조작 수행과 같은 일부 호출로 차단되는 경우가 아니면 실행되어 완료됩니다. 우선순위가 높은 FIFO 스레드는 선점되지 않을 수 있으며 시스템의 글로벌 성능에 영향을 미칠 수 있습니다. 예를 들어, 대형 매트릭스 반전과 같은 집약적인 계산을 수행하는 스레드는 FIFO 정책을 사용하여 실행되지 않아야 합니다.
또한 스케줄링 정책 및 우선순위의 설정은 스레드의 경합 유효범위에 의해 영향을 받습니다. FIFO 또는 라운드 로빈 정책을 항상 사용할 수 있는 것은 아닙니다.
sched_yield 서브루틴
sched_yield 서브루틴은 yield 서브루틴의 스레드에 해당합니다. sched_yield 서브루틴은 호출 스레드가 해당 프로세서를 사용하지 않도록 강제 실행하고 기타 스레드에 스케줄링될 기회를 제공합니다. 그 다음 스케줄링된 스레드는 호출 스레드와 동일한 프로세스 또는 다른 프로세스에 속할 수 있습니다. 멀티스레드 프로그램에서 yield 서브루틴을 사용하지 마십시오.
단일 UNIX 사양 버전 2에서는 pthread_yield 하위 루틴 인터페이스를 사용할 수 없습니다.