스레드 동기화
멀티 프로세서, 멀티 스레드 시스템에서 공유 자원에 대한 동시 간섭을 막기 위한 동기화 방법
- 유저모드 동기화(User Mode Synchronization)
- 동기화를 하는 과정에서 커널의 자원을 이용하지 않고 수행 (성능상의 이점)
- Critical Section
- 커널모드 동기화(Kernel Mode Synchronization)
- 동기화가 진행되는 과정에서 커널의 자원을 이용
(성능상의 저하가 발생할 수 있으나, 유저모드에서 제공하지 못하는 기능 제공) - Mutex, Semaphore
- 동기화가 진행되는 과정에서 커널의 자원을 이용
🔖Crtical Section
- 하나의 프로세스, 하나의 프로세스 안에서의 Thread에서만 사용 가능하다.
- 먼저 접근한 스레드는 EnterCriticalSection을 통해 락을 획득하고, 그 이후 접근하는 스레드는 대기 시킨다.
- 할 일을 마치면 LeaveCriticalSection으로 락을 해제한 후 다른 스레드가 접근할 수 있게 된다.
- 대기중인 스레드는 다른 스레드에게 CPU 점유를 넘겨야 하므로, 컨텍스트 스위칭(Context Switching)이 발생하지만 이후 대기시간동안 CPU자원을 점유하지 않는다.
🔖Mutex
- Mutex는 상호배제라는 의미인 Mutual Exclusion의 줄임말이다.
- Mutex라는 커널 객체를 이용해서 동기화를 하는 방법이다.
- 커널 객체를 사용하기 때문에 프로세스 사이에서의 동기화도 가능하다. 물론 쓰레드 사이에서의 동기화도 가능
- 한 프로세스에 의해 소유될 수 있는 Key를 기반으로 하는 상호배제 기법
- Key에 해당하는 객체(Object)가 있으며, 이 Object를 소유한 스레드/프로세스만이 공유자원에 접근할 수 있다.
🔖Semaphore
- 세마포어 역시 커널 객체를 이용한 동기화 방법이다.
- Mutex와 Critical Seciton은 오로지 스레드 1개만 자원을 액세스 할수 있는 반면, 세마포어는 원하는 개수의 스레드가 자원을 액세스 할 수 있다.
- 세마포어의 자원 액세스를 1개로 설정하면 뮤텍스와 같다. 고로, 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다.
- 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다.
- 자원을 사용하지 않는 상태가 될 때, 대기하던 프로세스가 즉시 자원을 사용한다.
- 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 대기하도록 해야한다.
- 세마포어는 시스템 범위에 걸쳐 있고, 파일 시스템상의 파일로 존재한다.
이와 비교하여 뮤텍스는 프로세스의 범위를 가지며 프로세스 종료에 자동으로 해제된다.
댓글