[Networking] 02 멀티 스레딩

해당 포스팅은 배현직님의 [게임 서버 프로그래밍 교과서] 책의 내용을 바탕으로 작성되었습니다.

1.4 컨텍스트 스위칭 Context Switching

CPU에서는 한 번에 하나의 작업만 가능하다. 하지만 오늘날 운영체제에서는 수많은 프로세스와 스레드를 동시에 실행하고 있다. 어떻게 이런 일이 가능한 것일까?

바로 컨텍스트 스위칭(Context Switching)을 이용하는 것이다.

운영체제에서는 위와 같은 방식으로 컨텍스트 스위칭을 통해 프로세스와 스레드들을 일정 시간마다 번갈아 가면서 처리한다. 그러나 컨텍스트 스위칭도 자주 발생하면 문제가 발생할 수 있다.

또한 컨텍스트 스위칭을 사용할 때 주의해야할 점이 하나 있다. 바로 컨텍스트 스위칭이 언제 일어날 지 개발하는 입장에서 예측이 매우 힘들다는 점이다.


1.5 스레드를 다룰 때 주의 사항

만약 스레드 2개가 어떤 변수 하나에 번갈아 접근하는 경우에 어떤 일이 벌어질 수 있을까?

다음 예시를 보자.

x = 2 

x += 3 # 스레드 1 에서 처리
x += 4 # 스레드 2 에서 처리

# 기대하는 결과
x = 9

우리가 원하는 결과는 9라는 값이지만, 실제로 프로그램을 실행해보면 9가 나오기도 하고 5가 나오기도 한다. 왜 그런 결과가 발생하는 걸까?

이는 컨텍스트 스위칭이 기계어 단위에서 무작위(Random)하게 일어나기 때문이다. 다음과 같이 실행되는 상황을 살펴보자.

x = 2
# 스레드 1
t1 = x          # t1 = 2
t1 = t1 + 3     # t1 = 5
# Context Switching
# 스레드 2
t2 = x          # t2 = 2
t2 = t2 + 4     # t2 = 6
x = t2          # x = 6
# 스레드 1
x = t1          # x = 5

스레드 1에서 처리하던 도중 스레드 2로 컨텍스트가 일어난 뒤 다시 스레드 1으로 돌아오게 되면 우리가 원하던 값이 아닌 이상한 값이 도출될 수 있다.

이처럼 만약 같은 자원을 공유하는 스레드끼리 최악의 경우에는 메모리 공간에서 충돌(Crash)가 발생할 수도 있다.

따라서 어떠한 공유 자원을 한 스레드가 접근할 때 다른 스레드가 건들지 못하도록 해야 한다. 이를 Atomicity(원자성)이라고 한다. 그래야 공유 자원이 일관성을 유지할 수 있다.

이런 문제를 동기화 문제(Synchronization Problem)이라고 하는데 멀티스레드 프로그래밍을 하다 보면 이것을 해결하기 위한 특별한 조치들이 필요하다.