본문 바로가기
프로그래밍/C#

C# 스레딩

by bantomak 2023. 5. 24.

스레드(thread)는 명령어를 실행하기 위한 스케줄링 단위이며 프로세스 내부에서 생성할 수 있다.

이는 운영체제에서 멀티 스레딩을 지원한다면 하나의 프로세스가 여러 개의 스레드 자원을 가질 수 있음을 의미한다.

 

윈도우는 프로세스를 생성할 때 기본적으로 한 개의 스레드를 함께 생성하며, 이를 주 스레드(main thread, primary thread)라고 한다. 

 

스레드는 CPU의 명령어 실행과 관련된 정보를 보관하고 있는데, 이를 스레드 문맥(thread context)이라고 한다. 운영체제의 스케줄러는 실행돼야 할 적절한 스레드를 골라서 CPU로 하여금 실행되게 만드는데, 이때 두 가지 동작을 수행한다.

CPU는 현재 실행 중인 스레드를 다음에 다시 이어서 실행할 수 있게 CPU의 환경 정보를 스레드 문맥에 보관한다. 그리고 운영체제로부터 할당받은 스레드의 문맥 정보를 다시 CPU 내부로 로드해서 마치 해당 스레드가 실행도고 있었던 상태인 것처럼 복원한 다음, 일정 시간 동안 실행을 계속한다.

 

문맥 교환

이때 CPU가 기존에 실행하던 스레드가 test.exe에 속해 있다고 하고, 새롭게 할당된 스레드도 test.exe에 속했다고 가정해 보자. 그런 경우 운영체제는 프로세스가 바뀐 것은 아니므로 프로세스의 문맥 정보를 바꾸지는 않는다. 하지만 다른 프로세스에 속한 스레드로 실행이 변경되면 프로세스의 문맥 정보까지 바뀌게 되고 이 작은 더 많은 CPU 자원을 소모한다.

 

그런데 멀티 스레딩이 어떤 의미가 있을까? 예를 들어, 프로그램에서 버튼을 눌러 시간이 걸리는 계산을 시작했다고 가정해 보자. 프로세스에 오직 1개의 스레드만 할당되어 작업을 하고 있다면 그 스레드가 계산을 하는 동안 사용자는 다른 작업을 전혀 할 수 없게 된다. 심지어 작업을 취소하겠다는 버튼조차 누를 수 없다. 취소 버튼의 누르기 동작에 지정된 코드를 실행하려면 스레드가 있어야 하는데, 이미 프로세스의 주 스레드는 계산 작업에 사용되고 있기 때문이다. 이런 상황에서 멀티 스레딩이 지원된다면 문제는 쉽게 해결된다. 별도의 스레드를 하나 더 만들어 계산 작업을 전담시키고 버튼에 반응할 수 있는 스레드는 유휴 상태로 남겨두면 된다.

 

초기 개인용 컴퓨터 시장에서는 단인 CPU가 지배적이었기 때문에 다중 스레드는 1개의 cPU에서 조금씩 시간을 나누어 실행되는 형태였다. 즉, 2개의 스레드가 같은 시간대에 함께 실행되는 경우는 없었다. 멀티 CPU/코어 시대로 오면서 비로소 다중 스레드가 동시에 실행되는 것이 가능해졌다.

 

C#은 다중 스레드 응용 프로그램을 만들 수 있고, 멀티 CPU/코어의 기능을 충분히 활용할 수 있게 병렬 라이브러리를 지원한다.

댓글