NOTICE

[개념 이해] 쓰레드 동기화

Date : 2015.01.04 22:39 Category :


 악성코드를 분석하다 보면  쓰레드 동기화 기법을 종종 사용되는 것을 알 수 있습니다. 몇 일 전에 분석했던 파일도 Event 동기화를 사용하더군요. 이에 쓰레드 동기화에 대해 정리해보고자 합니다.


 보통 동기화라고 하면 무엇인가를 일치시켜주는 것이라고 생각합니다. 예를 들어서 A라는 서버와 B라는 서버가 동기화되어 있다고 하면, 이 두 개의 서버가 지니고 있는 데이터가 동일한 상태임을 의미합니다. 또한 영상과 음성 데이터가 잘 동기화되어 있다고 하면 이는 영상에 등장하는 인물이 말하는 목소리와 입 모양이 일치함을 의미하는 것 입니다. 그러나 여기서 우리가 말하고자 하는 동기화는 일치한다는 의미에서의 동기화가 아니라 순서에 있어서 질서가 지켜지고 있음을 의미하는 동기화이다.


1. 실행 순서의 동기화

 예를 들어서 A와 B라는 사람이 화장실 앞에서 마주쳤을 때, A라는 사람은 큰 볼 일을 볼 사람이고, B라는 사람은 작은 일을 볼 사람입니다. 이러한 상황에서 보통은 작은 일을 볼 사람인 B가 먼저 일을 마치는 것이 관례일 것입니다. 그러나 변비에 걸린 A가 먼저 들어간다면 실행 순서가 무너진 상태가 됩니다. 이처럼 쓰레드의 실행 순서가 중요한 경우가 있습니다. 예를 들어서 A 쓰레드가 계산한 결과를 B 쓰레드가 받아서 출력하는 경우, 반드시 A 쓰레드가 먼저 실행을 완료해야만 합니다. 즉 쓰레드의 실행순서를 정의하고, 이 순서에 반드시 따르도록 하는 것이 쓰레드 동기화입니다.


2. 메모리 접근에 대한 동기화

 한 순간에 하나의 쓰레드만 접근해야 하는 메모리 영역이 존재합니다. 대표적으로 데이터 영역과 힙 영역이 있습니다. 데이터 영역에 할당된 변수를 둘 이상의 쓰레드가 동시에 접근할 때에는 문제가 발생합니다. 이렇게 메모리 접근에 있어서 동시 접근을 막는 것 또한 쓰레드의 동기화에 해당합니다.


 어찌보면 앞서 설명한 두 가지 동기화 기법에 차이가 없어보입니다. 그러나 확실한 차이가 있습니다. '실행 순서의 동기화'는 실행 혹은 접근 순서가 이미 정해져 있는 상황입니다. 만약 A, B, C 쓰레드가 존재하고, 실행 혹은 접근 순서는 반드시 A → B → C 라고 정의한다면 이 순서는 반드시 지켜져야 하는 것입니다.

 '메모리 접근의 동기화'는 실행의 순서가 중요한 상황이 아니고 한 순간에 하나의 쓰레드만 접근하면 되는 상황을 의미합니다. 만약 세 개의 쓰레드 A, B, C가 존재한다면 어떤 순서로 실행되건 중요하지 않습니다. 메모리에 동시 접근하는 문제점만 발생하지 않으면 됩니다. 

 참고로 실행 순서를 동기화한다는 것은 쓰레드의 메모리 접근 순서를 동기화하기 위한 경우가 대부분입니다. 따라서 '실행 순서의 동기화' 역시 메모리 접근과 관련있습니다. 다만 개념적으로 메모리 접근의 측면보다는 메모리에 접근하는 쓰레드의 실행순서가 강조되어야 하는 부분이기에 '실행 순서의 동기화'라는 표현을 사용한 것입니다.

 Windows에서는 다양한 동기화 기법을 제공합니다. 이러한 동기화 기법들이 '실행 순서 동기화 기법'과 '메모리 접근 동기화 기법'으로 나뉘는 것은 아니지만 상황에 따른 동기화 기법은 존재합니다.


 이상으로 '쓰레드 동기화'에 대한 포스트를 마치도록 하겠습니다.