Mutual exclusion | Semaphore는 병행으로 수행중인 비동기적 프로세스들이 공유 자원에 접근할 때 발생할 수 있는 문제를 해결하기 위해 고안된 방법이다.
즉, 방법이다. 사실 이걸 예전에 정리할 때는 이걸 이해 못했다. 그래서 I/O에 대해서 공부하는 겸사겸사 다시 한번 공부 해보자 해서 여러 문서들을 찾다가 한기대 OS 강의에서 내가 접근할 수 없었던 이유를 찾을 수 있었다. 다음은 내가 이해 못했던 부분이다.
1.
근본적으로 mutual exclusion(mutex)와 Semaphore를 알기 위해서는 뭘 알아야 하는가?
2.
JAVA의 synchronized 키워드는 뭘로 구현되었는가?
간단한 역사
간단한 역사를 이해하고 나니 대충 무슨 말인지 알 것 같았다. 즉, 상호배제(Mutual exclusion)은 아주 해결하기 힘들었고 이를 SW → HW → OS → Language level 까지 올라온 것이다.
근본적으로 뭘 알아야 하는가?
역사에서도 알 수 있듯이 최초로 상호 배제 문제를 해결한 사람이 Dekker라는 사람이다. 그리고 시간이 흐름에 따라 2개의 프로세스가 접근하는 것이 아닌 n개의 프로세스가 접근할 때도 임계 영역을 잘 만드는 조건을 모두 지키며 만든 사람이 Djikstra이다.
Mutex | Semaphore
잠깐 정리
1.
2.
Mutex의 발전된 기법 - Semaphore 대기큐를 만들고 이를 이용해 busy-waiting 문제 해결 또한 이진 Semaphore는 mutex처럼 사용가능
Mutex | Semaphore에서 알 수 있듯이 그냥 상호 배제를 실현한 것들이다. 근데 이게 사용하기 어려워서 이를 언어 차원에서 지원하기 시작한 것이 Monitor이다.
Monitor
정리 하자면 다음과 같다.
1.
여러 프로세스/스레드가 접근하여 사용하는 영역은 임계 영역이다.
2.
임계 영역에서는 경쟁 상태가 발생할 수 있다.
3.
경쟁 상태가 발생하면 데이터의 일관성이나 결과가 바뀔 수 있다. 이를 맞춰주는 것이 동기화다.
4.
임계 영역을 동기적?으로 잘 맞출 수 있게 해주는 조건 상호배제, 진행, 유한대기이다.
5.
이를 지켜낼 수 있는 기법이 Mutex | Semaphore이다. 둘의 차이점은 소유권 개념과 음이 아닌 정수형 변수를 사용하는 것인가 이다.
6.
이 기법을 프로그래머가 직접 작성하기 힘들다(다른 말로 표현하자면 교착 상태가 발생할 수 있음). 그래서 Monitor를 언어 차원에서 지원해준다.
7.
자바의 synchronized 키워드의 경우 Monitor를 이용한다.