본문 바로가기

Concurrency

(4)
Mutex vs Semaphore Mutex Mutex 라는 이름은 Mutual Exclustion (상호배제) 를 의미하며 critical section 의 shared data 를 보호하기 위해 사용된다. Mutex 는 한 번에 오직 한개의 thread 가 resource 에 접근하는 것을 허용하며 Java 에서 Mutex 의 전형적인 예시는 Synchronized block 이다. Semaphore Semaphore 는 mutex 와는 다르게 resource 에 제한된 접근을 하기 위해 사용된다. Semaphore 는 제한된 숫자의 허가증을 가지고 있다고 생각하자. 만약 Semaphore 가 가지고 있는 허가증을 모두 사용했을 경우, 허가증을 사용한 이전 thread 가 허가증을 return 할 때까지 신규 thread 의 허가 요..
Critical Section & Race Condition Critical Section Critical Section 은 여러개의 thread 에 의해 data 나 resource 가 공유되는 부분을 일컫는다. Race Condition Race Condition 은 thread 가 동기화 되어 있지 않은 상태에서 critical section 영역을 여러 thread 들이 실행할때 발생한다. thread 들은 shared section 을 통해 shared resource 를 읽거나 쓰는 “race” 를 수행하며 각 thread 들이 race 를 끝내는 순서대로 출력을 하게 된다. Race Condition 상황에서는 thread 가 다른 thread 가 접근하고 있는 공유된 자원이나 변수에 접근을 하게 되므로, data 의 일관성이 깨지게 된다.
Deadlock, liveness, Live lock, Starvation Critical Section 을 지키고 Race Condition 을 피하려고 애쓰는동안, Multithread code 의 미묘한 "논리적인 오류" 가 생길수도 있다. 그 논리적인 오류들의 패턴은 다음과 같다. Deadlock deadlock 은 두개 이상의 thread 가 진행을 할 수 없을 경우에 발생한다. 첫번째 스레드가 필요로 하는 resource 를 두번째 스레드가 보유하고 있고, 두번째 스레드가 필요로 하는 resource 를 첫번째 스레드가 보유하고 있을 경우 발생한다. 예를 들어, 아래와 같은 코드에서 increment 의 mutex A 획득과 decrement 의 mutex B 획득이 동시에 이루어졌을때, 그 다음 mutex 를 획득하기 위해 두개의 thread 는 무한히 대기할 것이..
뮤텍스(Mutex) VS 모니터(Monitor) 간단하게 말해서 Monitor 는 Mutex + Condition Variable 이다. Monitor 의 이해를 돕기 위해 아래 코드를 살펴보자. 아래 코드를 보면 predicate 라는 부분이 나오는데, 이 부분은 스레드간 선제조건을 의미한다. 즉, 이 값이 true 가 되었다는 것은 이전에 인과의 관계에 속해있는 사전 작업이 완료되었다는 것을 의미하고 그때 현재 스레드의 작업을 수행할 수가 있다. void example() { // acquire mutex while (predicate is false) { // release mutex // acquire mutex } // do something in this thread. // release mutex } 위 코드의 flow 를 보면, 먼저 m..