동기화(synchronization)란?
동기화란 프로세스 또는 스레드들이 수행되는 시점을 조절하여 서로가 알고 있는 정보가 일치시키는 것을 의미합니다.
우리는 a를 공유 자원이라고 말하고, 이렇게 두개 이상의 프로세스 혹은 스레드가 동기화 없이 접근하려는 현상을 race condition(경쟁 상태)라고 합니다.
그리고 이런 문제를 해결하기위해 서로가 알고있는 정보를 일치시키는 것을 동기화라고 합니다.
스레드 동기화
-
실행 순서의 동기화
- 스레드의 실행 순서를 정의하고, 이 순서를 반드시 따르도록 하는 것.
-
메모리 접근에 대한 동기화
동기화 방법
유저 모드의 동기화
- 커널의 힘을 빌리지 않는 동기화 기법(커널의 코드가 실행되지 않음.)
- 성능상 이점이 있으나 기능상의 제한점이 존재.
- 임계 구역 기반의 동기화, 인터락 함수 기반의 동기화.
커널 모드의 동기화
- 커널에서 제공하는 동기화 기능을 이용하는 방법.
- 커널 모드로의 변경이 필요하고 이는 성능 저하로 이어진다. 그러나 다양한 기능을 활용할 수 있다.
ex) 세마포어, 뮤텍스, 모니터 등등.
모니터란?
- 모니터란 공유 자원을 내부적으로 가지고 있고 외부에 공개하지 않습니다.
- 이는 마치 클래스의 private 접근자 변수와 유사합니다.
- 그리고 public 메서드 (getter와 같은)를 통해서만 공유 자원에 접근할 수 있습니다.
- 모니터는 뮤텍스와 같이 한번에 한번의 프로세스만 입장할 수 있다는 특징이 있습니다.
?
Q. 뮤텍스와 모니터의 차이는?
- 뮤텍스는 다른 프로세스나 스레드 간에 동기화를 위해 사용한다.
- 모니터는 하나의 프로세스내에서 다른 스레드 간에 동기화할 때 사용한다.
- 뮤텍스는 운영체제 커널에 의해 제공된다.
- 모니터는 프레임워크나 라이브러리 그 자체에서 제공된다.
Q. 세마포어와 모니터의 차이는?
- 자바에서는 모니터를 모든 객체에게 기본적으로 제공하지만 C에서는 사용할 수 없음.
- 세마포어는 카운터라는 변수값으로 프로그래머가 상호 배제나 정렬의 목적으로 사용시 매번 값을 따로 지정해줘야 하는 등 조금 번거롭다.
- 반면, 모니터는 이러한 일들이 캡슐화되어 있어서 개발자는 카운터 값을 0 또는 1으로 주어야 하는 고민을 할 필요가 없이 synchronized, wait(), notify() 등의 키워드를 이용해 좀 더 편하게 동기화할 수 있다.
Q. 세마포어와 뮤텍스의 차이는?
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
- 세마포어는 소유할 수 없으며, 뮤텍스는 소유할 수 있고 소유주가 그 책임을 진다.
- 뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제할 수 있다. 하지만 세마포어는 소유하지 않고 있는 다른 스레드가 세마포어를 해제할 수 있다.
- 뮤텍스는 동기화 대상이 1개일 때 사용하고 세마포어는 동기화 대상이 여러 개일때 사용한다.
참고
https://ooeunz.tistory.com/94
https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Operating%20System/%EB%8F%99%EA%B8%B0%ED%99%94%20%EB%AC%B8%EC%A0%9C.md