[개발] Thread 간 동기화에 관하여 (Critical Section)
개발자 | 2013. 4. 23. 15:30
출처: http://kiwi99.tistory.com/18
- Thread 간 동기화(Synchronization)은 왜 필요한가?
- 멀티스레드 프로그램을 하게 되면 스레드 간의 데이터를 공유할 필요가 종종 발생하게 된다. 가령 정보를 생산하는 스레드가 있고(생산자 스레드) 정보를 소비하는 스레드(소비자 스레드)가 있다면 이 둘 사이에는 정보(데이터)를 공유해야할 필요가 있다. 따라서 공유하는 메모리 영역에 정보가 위치하고 각각의 스레드가 접근하여 각자의 작업을 수행하게 된다.
- 문제는 이 공유영역에 대한 접근을 적절히 조절하지 않으면 공유데이터의 데이터 일관성(Consistency)문제 및 비효율적인 공유데이터 접근 문제가 발생할 수 있다. 가령 아래와 같은 문제가 발생하는 상황을 생각해 볼 수 있다.
- 생산자 스레드가 정보를 생성하고 있는 과정에서 아직 완료되지 않은 정보를 소비자 스레드가 가져갈 수 있는 상황
- 생산자 스레드가 정보를 생성하지 않았는데 이를 소비가 스레드가 알지 못하여 불필요하게 정보에 접근하려는 상황
- 따라서 위와 같은 문제가 발생하지 않도록 스레드 간에 동시에 접근 가능한 공유영역에 대하여 적절한 접근제어 및 접근순서를 컨트롤 해주는 작업을 동기화(synchronization)라고 한다.
- 동기화 관련하여 임계영역(Critical Section)이라는 용어를 자주 접할 수 있는데, 임계영역의 의미는 둘 이상의 스레드가 공유데이터(영역)에 동시에 접근하여 문제가 발생할 수 있는 코드 영역을 의미한다. 따라서 해당 코드 영역에 전, 후에 적절한 동기화 처리 로직을 추가하여 동기화 처리를 하게 된다.
- 스레드 간 동기화 처리를 한다는 것은 임계영역의 진입, 진출 시에 적절한 동기화 처리 로직을 추가하여 경쟁상태(race condition)에 있는 스레드 간의 공유데이터에 대한 안전하고 효율적인 접근을 보장해주는 것이라고 할 수 있다.
- 정리해 보면, 스레드 간 동기화 처리를 한다는 것은 다음 2가지 작업을 의미한다.
- Mutual Exclusion(상호배제)
- 상호배제라는 것은 둘 이상의 스레드가 임계영역에 동시에 접근하는 것을 막는 것을 말한다.
- 다수의 스레드가 데이터를 공유할 때 서로 간섭 없이 접근하고자 할 때 필요하다.
- Cooperation(협력)
- 멀티스레드 간 공유데이터의 동시접근을 막을 뿐만 아니라 접근 순서도 컨트롤 하는 것을 말한다.
- 같은 목적을 가진 스레드간에 협력해서 효율적으로 작업할 수 있도록 하겠다는 의미이다.
- 생산자-소비자 스레드를 생각해보면 단순히 상호배제만을 해서 부족하다. 즉 동시접근도 차단하고 생산자스레드가 생산을 했을 때 소비자 스레드에게 이를 알려서 작업을 할 수 있도록 해 주는 것이 필요하다. 이런 것이 바로 스레드간 협업이다.
- 일반적인 동기화 처리 방식
- 출처 참조…
- Critical Section(임계구역)
- 둘 이상의 Thread가 공유데이터(영역)에 동시에 접근하여 문제가 발생할 수 있는 코드 영역
- 만약 서로 다른 접근을 허용한다면 병목현상이 발생할 수 있고, 하나의 스레드가 계속 접근한다면 Dead Lock이 발생할 수 있다.
- Java 동기화
- Thread가 Critical Section을 실행하고 있을 때 다른 Thread의 접근을 막는 것.
- 동기화 방법
- 동기화 블록지정: synchronized(sharedArea){ 실행문(critical section) }
- 동기화 메소드: synchronized void increaseNum(int num){ 실행문(critical section) }
'개발자' 카테고리의 다른 글
Gof(TheGang of Four)의 디자인패턴, 23가지 (0) | 2013.05.02 |
---|---|
[개발] Semaphore(세마포어)와 뮤텍스(Mutex) (0) | 2013.04.24 |
[개발] Types, Operators and Expressions (0) | 2013.04.22 |
[개발] OSI(Open System Interconnect) 7 Layer (0) | 2013.04.19 |
[WEB] HTTP STATUS CODE (0) | 2013.04.11 |