티스토리 뷰

세마포어(Semaphore)와 뮤텍스(Mutex)


동기화 도구인 세마포어(Semaphore)와 뮤텍스(Mutex)

 

공유된 자원에 여러 프로세스가 동시에 접근하면서 문제가 발생할 수 있다. 이러한 문제를 해결하기 위하여 공유된 자원의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한을 두는 동기화 방식을 취해야한다. 동기화 도구에는 대표적으로 세마포어(Semaphore)와 뮤텍스(Mutex)가 있으며 이 두 방식은 모두 공유된 자원의 데이터를 여러 프로세스 또는 스레드가 접근하는 것을 막는 역할을 한다. 

 


임계 영역(Critical Section)

 

멀티 프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 공유자원의 코드 영역이다. 즉 여러 프로세스가 동일한 자원을 동시에 참조하여 값이 오염될 위험 가능성이 있는 영역을 의미한다. 


세마포어(Semaphore) 란?

세마포어(Semaphore)Signaling 매커니즘이며 상호 배제의 원리를 보장하는 알고리즘이다. 즉 멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법이다(동기화 대상이 하나 이상인 경우).  기본적인 작동 원리는 특정 스레드가 특정 signal 을 수신할 때까지 정해진 위치에서 wait 하도록 강제하는 것이다. 

 

공유자원의 상태를 나타낼 수 있는 카운터 변수(최대 허용 프로세스 개수의 임계치)를 사용하며 운영체제 또는 커널에 저장된다. 공유자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있으며 각 프로세스는 세마포어의 값을 확인하고 변경할 수 있다. 

 


세마포어(Semaphore) 접근 함수 - wait(), signal()

세마포어의 S는 정수 변수로서 초기화를 제외하고는 wait()와 signal() 두개의 atomic operations 으로 만 접근이 가능하다.

wait를 호출하면 세마포어의 카운트를 1 줄이고, 세마포어의 카운트가 0보다 작거나 같아질 경우에 lock 이 실행된다.

 

struct semaphore {
    int count;
    queueType queue;
};

void semWait (semaphore s) {
    s.count--;
    if (s.count <= 0) {
    	// 락이 걸리고 공유 자원에 접근할 수 없음
    }
} 

void semSignal (semaphore s) {
    s.count++;
    if (s.count <= 0) {
    	// 아직 락에 걸려 대기중인 프로세스가 있음
    }
}
출처: https://mangkyu.tistory.com/104 [MangKyu's Diary:티스토리]

세마포어의 카운트가 0보다 작거나 같아져 동기화가 실행된 상황에서 다른 쓰레드가 signal 함수를 호출하면 세마포어의 카운트가 1 증가하고 해당 쓰레드는 lock 에서 나올 수 있다. 세마포어는 Counting SemaphoreBinary Semaphore 두 종류가 있다.  Counting Semaphore는 세마포어의 카운트 값이 양의 정수 값을 가지며, 설정한 값만큼 쓰레드를 허용하고 그 이상의 쓰레드가 자원에 접근하면 lock 이 실행된다. Binary Semaphore 는 세마포어의 카운트가 1이며 Mutex 처럼 사용될 수 있다. 

 

 wait()

wait(S){
	while(S <= 0);
	S--;
}

 

signal()

signal(S){
	S++;
}

 

S의 정수 변수를 다루는 모든 작업은 인터럽트 되지 않고 원자적으로 실행되어야 한다.

 


뮤텍스(Mutex) 란?

뮤텍스(Mutex)는 자원에 대한 접근을 동기화하기 위해 사용되는 상호배제 기술이다. 뮤텍스는 Locking 매커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다. 이진 세마포어(Binary Semaphore; 0과 1)라고도 불린다. 

 

wait (mutex);
…..
Critical Section
…..
signal (mutex);
출처: https://mangkyu.tistory.com/104 [MangKyu's Diary:티스토리]

 

lock 을 얻은 쓰레드 만이 임계영역을 나갈 때 lock을 해제해 줄 수 있다. 이러한 이유는 뮤텍스가 1개의 lock만을 가지는 Locking 매커니즘이기 때문이다.

 


세마포어(Semaphore)와 뮤텍스(Mutex)

세마포어(Semaphore)와 뮤텍스(Mutex)의 가장 큰 차이점은 동기화 대상의 개수이다. 뮤텍스 는 동기화 대상이 1개인 경우에 사용하고 세마포어 는 동기화 대상이 1개 이상일 때 사용하게 된다. 세마포어는 이진 세마포어(Binary Semaphore)가 존재하여 뮤텍스처럼 사용이 가능하지만 뮤텍스는 세마포어가 될 수 없다. 

 

뮤텍스는 Locking 매커니즘으로 lock을 걸은 쓰레드 만이 임계영역을 나갈 때 lock을 해제할 수 있다. 하지만 세마포어 Signaling 매커니즘으로 lock을 걸지 않은 쓰레드도 Signal을 사용해 lock을 해제할 수 있다. 

 


Reference

 

https://ynsseon.tistory.com/m/3

 

세마포어(Semaphore)와 뮤텍스(Mutex)

사전지식 IPC 란 Inter Process Communication의 약자로, 직역하면 프로세스간의 통신을 의미한다. 프로세스간의 통신이 가능하도록 커널에서는 IPC 통신 설비를 제공해주는데, IPC 설비 종류에도 여러가

ynsseon.tistory.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함