Notice
Recent Posts
Recent Comments
09-19 13:50
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Byeol Lo

5.4 Thread Scheduling 본문

OS/OS Design

5.4 Thread Scheduling

알 수 없는 사용자 2024. 5. 15. 23:09

 이제 프로세스에 대한 스레드 경쟁을 알아보았으니 스레드를 연결시켜주어야 한다. 스레드에서는 user thread와 kernel thread로 나뉘는 것을 알 것이다. 대부분의 운영체제에서는 프로세스가 아닌 kernel thread가 운영체제에 의해 scheduling이 된다. user thread는 대부분 스레드 라이브러리에 의해 관리되며, 커널은 이를 인식하지 못한다. CPU에서 실행되기 위해서 user thread 는 궁극적으로 관련 kernel thread에 매핑이 되어야 하지만, 이 매핑은 간접적일 수 있고, 경량 프로세스(LWP)를 사용하여 관리할 수도 있을 것이다. 여기서는 thread가 어떻게 스케줄링 되는지에 자세히 초점을 맞춘다.

 

5.4.1 Contention Scope

 user thread와 kernel thread간의 차이점은 scheduling 되는 방법이다. many-to-one 과 many-to-many 모델을 구현하는 시스템 에서는 스레드 라이브러리가 user thread를 사용 가능한 LWP에 스케줄링 하면 된다. 이렇게 프로세스가 경쟁하는 범위를 프로세스 경쟁 범위(Process Contention Scope)라고 하며, 이 방식으로 동일한 프로세스에 속한 스레드 끼리만 경쟁을 하도록 한다. 여기서 LWP를 가진 스레드가 무조건 CPU를 점유하여 실행되는 중이라는 것이 아니LWP의 커널 스레드를 물리적 CPU 코어에 스케줄링을 해야 ready queue에 들어가게 되는 것이다.

 이제 실질적인 CPU 경쟁을 위해 커널 스레드와 연결하기 위한 시스템 경쟁 범위(SCS)에서의 경쟁을 볼 것이다. SCS 스케줄링의 경우 시스템의 모든 스레드 간에 CPU 경쟁이 발생한다. one-to-one을 사용하는 시스템은 SCS만을 사용하여 스레드를 스케줄링 한다.

 일반적으로 PCS는 우선순위 스케줄링을 따르고, 스케줄러는 실행 가능한 스레드 중 가장 높은 우선순위를 가진 스레드를 선택하여 실행한다. 사용자 수준 스레드의 우선순위는 프로그래머에 의해 결정되며, 스레드 라이브러리에 의해 조정되지 않는다. 하지만 일부 스레드 라이브러리는 프로그래머가 스레드의 우선순위를 변경할 수 있다. PCS는 일반적으로 현재 실행중인 스레드를 선점하여 더 높은 우선순위의 스레드를 실행하게 되지만, 동일한 우선순위의 스레드 간에는 시분할(time division)의 보장이 없다.

 

5.4.2 Pthread Scheduling

 스레드 생성할 때 PCS, SCS를 지정할 수 있는 POSIX Pthread API의 예를 보자.

  • PTHREAD_SCOPE_PROCESS는 PCS 스케줄링을 사용하여 스레드를 스케줄링한다.
  • PTHREAD_SCOPE_SYSTEM은 SCS 스케줄링을 사용하여 스레드를 스케줄링한다.

 many-to-many 모델에서 PTHREAD_SCOPE_PROCESS 정책은 사용자 수준 스레드를 사용 가능한 LWP 에 스케줄링 한다. LWP 의 수는 스레드 라이브러리에 의해 유지되며, 스케줄러 활성화를 사용할 수 있다. PTHREAD_SCOPE_SYSTEM 스케줄링 정책은 다대다 시스템에서 각 사용자 수준 스레드에 대해 LWP를 생성하고 바인딩하며, 효과적인 one-to-one 을 사용하여 스레드를 매핑한다. Pthread IPC 는 경쟁 범위 정책을 설정하고 가져오는 두 가지 함수를 제공한다.

  • pthread_attr_setscope(pthread_attr_t *attr, int scope)
  • pthread_attr_getscope(pthread_attr_t *attr, int *scope)

 두 함수의 첫 매개변수는 스레드의 속성 집합에 대한 포인터를 포함한다. pthread_attr_setscope 함수의 두 번째 매개변수는 경쟁 범위가 어떻게 설정될지를 나타내는 PTHREAD_SCOPE_SYSTEM 또는 PTHREAD_SCOPE_PROCESS 값을 전달받는다. pthread_attr_getscope()의 경우, 이 두번째 매개변수는 현재 경쟁 범위 값을 설정하는 int 포인터를 받게 된다.

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5

int main(int argc, char *argv[])
{
  int i, scope;
  pthread_t tid[NUM_THREADS];
  pthread_attr_t attr;
  
  pthread_attr_init(&attr);
  
  if (pthread_attr_getscope(&attr, &scope) != 0)
    fprintf(stderr, "Unable to get scheduling scope\n");
  else {
    if (scope == PTHREAD_SCOPE_PROCESS)
      printf("PTHREAD_SCOPE_PROCESS")
    else if (scope == PTHREAD_SCOPE_SYSTEM)
      printf("PTHREAD_SCOPE_SYSTEM")
    else
      fprintf(stderr, "Illegal scope value.\n");
  }
  
  pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
  
  for (i = 0; i < NUM_THREADS; i++)
    pthread_create(&tid[i], &attr, runner, NULL);
  
  for (i = 0; i < NUM_THREADS; i++)
    pthread_join(tid[i], NULL);
}

void *runner(void *param)
{
  pthread_exit(0);
}

 두 함수 모두 오류가 발생시 0을 반환하게 된다.

 프로그램은 기존의 경쟁범위를 결정하고 이를 PTHREAD_SCOPE_SYSTEM으로 설정한다. 그런 뒤에 SCS 스케줄링 정책을 사용하여 실행될 다섯 개의 개별 스레드를 생성한다. Linux, macOS에서는 PTHREAD_SCOPE_SYSTEM 만 허용한다.

'OS > OS Design' 카테고리의 다른 글

5.6 Real-Time CPU Scheduling  (0) 2024.05.16
5.5 Multi-Processor Scheduling  (0) 2024.05.16
5.3 Scheduling Algorithms  (1) 2024.05.15
5.2 Scheduling Criteria  (0) 2024.05.14
5.1 CPU Scheduling - Basic Concepts  (0) 2024.05.14
Comments