스레드 컨텍스트

 

스레드는 1개의 CPU에서 동시에 실행되는 것처럼 흉내내는 방법이므로 스레드를 어떤 순서로 얼마만큼의 간격으로 실행할 것

인가를 결정해야 하는데 이를 스케줄리이라고 한다.

운영체제는 CPU의 실행시간을 아주 잘게 쪼개어 스레드를 조금씩 순서대로 실행함으로써 동시에 실행되는 것처럼 보이게

만든다. 대략 0.02초 정도로 시간을 분할하며 이때 분할된 시간 조각 하나를 퀀텀(Quantum)이라고 한다.

또한 굉장히 빠른 속도로 스레드를 번갈아 가며 실행하는 방식을 라운드 로빈(Round Robin) 방식이라고 한다.

 

스케줄링 대상은 프로세스가 아니라 스레드이다. 즉, 워드 한번, 탐색기 한번, 특정 프로그램 한번 이렇게 스케줄링되는 것이

아니라 각 프로세스에 속한 개별 스레드들이 스케줄링되는 것이다. 또한 스케줄러는 스레드가 어떤 프로세스 소속인지에 대해서

아예 관심을 두지 않는다.

 

Thread A에서 Thread B로 작업이 스위칭된다고 생각해보자.

CPU는 다음에 다시 Thread A를 실행시킬 때 스위칭 시 중지되었던 구간이 어디인지 저장해 두어야 한다.

그렇지 않으면 다음 Thread A 실행 시 어디까지 작업을 하다 말았는지 알 수 없을 것이다.

이 때, 스레드 실행 상태에 대한 정보를 스레드 컨텍스트(Thread Context)라고 하는데 스레드가 하던 작업의 상태에 관한 정보는

단순한 레지스터값과 몇 가지 값의 집합이다. (일종의 구조체)

 

스레드 간에 작업을 전환하는 작업을 컨텍스트 스위칭이라고 하는데 매번 정보를 저장하고 읽어오는 과정이 필요하다.

그래서 실행시간 저하가 굉장히 심할 것 같지만 무시해도 될 정도로 비중이 작다. CPU는 생각보다 훨씬 더 빠르기 때문이다.

스레드 컨텍스트의 정보를 얻어와서 변경하는 함수가 제공된다. 그러나 컨텍스트 정보는 단순한 레지스터 값의 집할일 뿐이고

실행 번지를 알 수 있다 하더라도 기계어 수준에서 코드를 해석해야 하므로 사용자가 알기에는 굉장히 어렵다.

그래서 이 함수는 별도로 정리하지 않았으며 이 함수로 스레드를 임의 조작하는 것은 바람직하지 않다.

(책에는 함수에 대한 설명이 간략히 되어있음.)

 

우선순위

 

한 시스템에서 실행되는 스레드의 개수는 적어도 몇십 개이며 프로그램 몇 개만 실행되어도 백 개가 넘는 스레드가 동작한다.

이 많은 스레드를 순서대로 공평하게 실행한다면 시스템은 너무 느려질 것이다.

위에서 설명했던 것처럼 1 퀀텀이 0.02초라 치면 50개의 스레드가 실행되어도 1 스레드들을 1초마다 한 번씩 제어권을 가지게

될 것이다.

 

스레드 중에는 바쁘게 처리되는 스레드도 있고 아무것도 하지 않고 대기만 하는 스레들도 있기 때문에 시스템을 효율적으로

운영하기 위해서는 스레드간의 우선 순위를 정해 긴급하고 사용자에 더 가까운 스레드에게 좀 더 많은 시간을 주는 것이 합리적이다.

 

스레드를 생성할 때 디폴트는 보통 우선 순위 레벨은 THERAD_PRIORITY_NORMAL이며 CreateThread에는 스레드의 우선 순위 레벨을

지정하는 인수가 따로 없으므로 일단 스레드를 생성한 후 변경해야 한다.

우선 순위는 우선 순위 클래스와 우선 순위 레벨을 조합하여 정하는데 총 47가지가 되지만 거의 7~11 사이의 기본 우선 순위에서

동작한다. 결정된 순위는 스케줄러가 참조하는데 스케줄러는 무조건 순위가 높은 스레드를 우선 실행한다.

그래서 발생할 수 있는 문제점은 우선 순위가 높은 스레드 하나가 작업 중이라면 그 아래의 모든 스레드는 아무도 CPU 시간을 받을 수

없으며 이 상태를 기아(Starvation) 상태라고 한다. 그러나 실제로는 이런 상황은 발생하지 않는데 우선 순위가 높을수록 작업 시간은

짧아서 모든 스레드에게 시간이 골고루 돌아간다.

 

또한 스케줄러는 우선 순위보다도 스레드의 상태를 보고 스케줄 대상을 결정하는데 Suspend된 스레드, Sleep 중인 스레드, GetMessage

가 메시지를 꺼내지 못해 처리할 메시지가 없는 스레드 등에게는 CPU가 시간을 주지 않는다.

 

그러므로 사용자가 스레드 우선 순위를 설정할 일은 거의 없어 보인다. (내 생각)

 

 

+ Recent posts