멀티 스레딩 기본
From DevNote
Contents |
스레드 기본
스레드(thread)란 "thread of execution" 즉, 우리말로 하면 "실행의 줄기" 정도로 번역될 수 있으며, 컴퓨터 프로그램을 실행하는데 있어 동시에 수행할 수 있는 실행 단위이다. [1]
반면, 프로세스는 하나의 수행되는 프로그램을 가르키며 프로세스는 적어도 하나 이상의 스레드로 구성된다. OS스케줄러의 수행 단위는 어쨌거나 스레드이다. 같은 프로세스에 속하는 스레드들은 메모리 주소공간을 공유한다. 윈도우즈 OS의 가상메모리(Virtual Memory) 관리자는 각각의 프로세스의 주소 공간에 물리적 메모리를 매핑하는데, 프로세스 사이에는 메모리 주소가 공유되지 않는다. 즉, 같은 메모리 주소라 하더라도 다른 프로세스에서는 다른 물리적 메모리를 가르킬 수 있기 때문에 C/C++ 언어에서 메모리 포인터를 그대로 다른 프로세스에 전달하여 사용할 수는 없다.
| 스레드는 "프로세스들 간에 데이터를 주고받는 데 있어 가장 효율적인 방법은 메모리 스페이스 전체를 공유하는 것"이라는 아이디어에서 탄생했다. 따라서 기본적으로 스레드들은 같은 메모리 컨텍스트(memory context)에서 수행된다. 스레드는 가볍다고 표현되는 이유는 스레드들 간에 컨텍스트 스위치(context switch)시에 메모리 컨텍스트를 변경할 필요가 없기 때문이다.[2] |
운영체제(OS)의 스케줄러는 시스템상의 모든 스레드의 현재상태를 저장하며, 프로세서가 다음에 수행할 스레드를 결정한다. 멀티프로세서와 멀티코어 시스템에서는 스레드들이 프로세서나 코어에 나뉘어져 동시에 수행될 수 있다.
| 지금까지 대부분의 PC는 하나의 CPU를 가지고 있으며, 멀티프로세서나 멀티코어에서도 역시 CPU나 코어의 개수는 스레드 개수에 비해 매우 적다. 따라서 OS 스케줄러는 시스템상의 모든 스레드를 최대한 공평하게 실행하도록 설계되었다. 이 스케줄러는 스레드마다 일정 CPU 클럭에 해당하는 정해진 퀀텀(Quantum)만큼 할당하며, 그 퀀텀이 끝나면 다음 스레드를 수행하는데 이렇게 다음 스레드로 변환되는 것을 컨텍스트 스위치(Context Switch)라고 한다.
스레드가 컨텍스트 스위치를 위해 가지는 데이터는 스택, CPU 레지스터 값의 복사본 이며 - 물론 레지스터 값에는 프로그램 카운터 (IA-32의 경우 EIP)도 포함된다. 이러한 정보는 스레드가 자신의 퀀텀을 받아 실행될 때 필수적인 정보이다. |
멀티태스킹을 지원하는 대부분의 운영체제는 선점방식 멀티태스킹(Preemptive multitasking[3])을 사용한다. 일종의 시분할(time slice) 방식으로, CPU 시간을 일정 단위로 쪼개어(quantum) 그 시간이 끝나면 다른 스레드로 스위치 되는 방식을 말한다. 따라서, 스레드는 언제라도 실행을 일시중단 다른 스레드로 스위치될 수 있다. 특히 시간이 많이 소요되는 I/O 작업을 하는 경우 CPU 시간을 낭비하며 기다라는(busy wating) 것을 방지하기 위해, I/O 스레드는 원하는 이벤트를 기다리는 상태로 들어가면서 다른 스레드에 CPU를 바로 양보할 수 있다.
윈도우즈의 스레드
작업 관리자를 사용하여 스레드 개수 보기
윈도우즈 운영체제 자체도 멀티 스레드로 동작하며 많은 어플리케이션들도 이미 멀티 스레드를 사용하고 있다. 윈도우즈에서 어떤 프로세스가 몇 개의 멀티 스레드를 사용하고 있는지 확인하는 가장 간단한 방법은 작업 관리자(Task Manager)를 보는 것이다. [4]
다음 스크린샷과 같이 작업 관리자의 스레드 컬럼은 몇 개의 스레드가 생성되었는지 표시한다. (작업 관리자에서 디폴트로 스레드 컬럼은 표시되지 않으므로 '보기' 메뉴의 '컬럼 선택'에서 스레드를 선택해 주어야한다)
Process Explorer 사용하기
작업 관리자는 단지 스레드 개수만을 보여줄 뿐이다. 보다 자세한 정보를 원한다면 Process Explorer를 사용할 수 있다. 원래 Sysinternals라는 싸이트를 통해 Mark Russinovich 가 개발 배포한 프로그램으로 프로세스와 스레드에 관한 상당히 많은 정보를 보여준다. 놀라운 것은 각 스레드들의 콜스택까지 볼 수 있다는 점이다. Sysinternals는 이외에도 훌륭한 툴들을 많이 제공하며 현재는 마이크로소프트사에 인수합병되어 MS TechNet의 일부가 되었다.
참고 문서와 각주
- ↑ wp:Thread (computer science)
- ↑ wp:Computer multitasking
- ↑ wp:Computer multitasking
- ↑ 작업 관리자는 "Ctrl + Shift + Esc"키를 동시에 누름으로써 바로 실행시킬 수 있다.


