CS 공부

경쟁 상태와 세마포어,뮤텍스 본문

CS공부/운영체제

경쟁 상태와 세마포어,뮤텍스

kluiop1 2021. 7. 12. 18:36

경쟁상태 (Race Condition)

두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓰는 동작을 할 때 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황을 말함

 

즉 동기화 매커니즘도 없이 접근 순서에 따라 실행결과가 달라지는 공유자원을 접근하려하는 상황

이러한 경쟁 상태도 교착 상태의 일종

 

race condition 인 경우에는 스레드의 실행 순서를 잘 조절해주지 않으면 이상한 상태, 비정상적인 상태가 나오게 된다. 이 문제는 항상 발생하는 것이 아니라 특정한 순서대로 수행되었을 때 발생하는 것이다.

이 문제는 디버깅을 할 때에는 전혀 보이지 않는 문제점이고, 발생 시에 모든 프로세스에 원하는 결과가 발생하는 것을 보장할 수 없으므로 후에 더욱 큰 문제를 야기할 수 있으므로 반드시 피해야 하는 상황이다.

 

경쟁 상태 해결 조건(세마포어와 뮤텍스)

1. 뮤텍스 (Mutual exclusion)

뮤텍스란

뮤텍스는 자원에 대한 접근을 동기화하기 위해 사용되는 상호배제 기술이다.

공유된 자원의 데이터 혹은 임계 영역등에서 하나의 프로세스 혹은 어려 스레드가 접근하는 것을 막아준다.

 

뮤텍스는 프로그램이 시작될 때 고유한 이름으로 생성된다. 뮤텍스는 Locking 메커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다. 그리고 오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다.

 

즉 임계영역을 가진 쓰레드들의 실행시간이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술이다.

 

뮤텍스의 수도 코드

wait (mutex); ..

Critical Section ..

signal (mutex);

 

위의 수도코드는 뮤텍스의 과정을 보여주고 있는데, 락을 얻은 쓰레드만이 임계 영역을 나갈 때 락을 해제해줄 수 있다. 이러한 이유는 뮤텍스가 1개의 락만을 갖는 Locking 메커니즘이기 때문이다

 

2. 세마포어

세마포어란

공유된 자원의 데이터 혹은 임계영역 등에 여러 프로세스 혹은 스레드가 접근하는 것을 막아 준다.

또한 세마포어는 리소스의 상태를 나타내는 간단한 카운터라고 할 수 있는데, 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용하게 되며, 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 동기화 시키는 기술이다.

다시 말해서 하나의 스레드만 들어가게 할 수도 있고 여러 개의 스레드가 들어가게 할 수 있다. 이것이 뮤텍스와의 차이이다.

 

세마포어의 수도코드

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) {

// 아직 락에 걸려 대기중인 프로세스가 있음

}

}

 

그리고 세마포어는 Signaling 메커니즘이라는 점에서 뮤텍스와 다르다.

세마포어는 락을 걸지 않은 쓰레드도 Signal을 보내 락을 해제할 수 있다는 점에서, wait 함수를 호출한 쓰레드만이 signal 함수를 호출할 수 있는 뮤텍스와 다르다.

 

세마포어는 동기화를 위해 waitsignal이라는 2개의 atomic operations를 사용한다.

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

 

세마포어의 카운트가 0보다 작거나 같아져 동기화가 실행된 상황에, 다른 쓰레드가 signal 함수를 호출하면 세마포어의 카운트가 1증가하고, 해당 쓰레드는 락에서 나올 수 있다.

 

세마포어는 크게 Counting Semaphores, Binary Semaphore 2종류가 있다.

 

Counting Semaphores

카운팅 세마포어는 세마포어의 카운트가 양의 정수값을 가지며, 설정한 값만큼 쓰레드를 허용하고 그 이상의 쓰레드가 자원에 접근하면 락이 실행된다.

 

Binary Semaphore

바이너리 세마포어는 세마포어의 카운트가 1이며 Mutex처럼 사용될 수 있다.(뮤텍스는 절대로 세마포어처럼 사용될 수 없다.)

 

세마포어와 뮤텍스 차이 정리

뮤텍스는 Locking 메커니즘으로 락을 걸은 쓰레드만이 임계 영역을 나갈때 락을 해제할 수 있다.

하지만 세마포어는 Signaling 메커니즘으로 락을 걸지 않은 쓰레드도 signal을 사용해 락을 해제할 수 있다.

세마포어의 카운트를 1로 설정하면 뮤텍스처럼 활용할 수 있다.

 

참고: https://mangkyu.tistory.com/104

https://iredays.tistory.com/125

 

'CS공부 > 운영체제' 카테고리의 다른 글

메모리  (0) 2021.07.15
페이징(외부 단편화, 내부 단편화, TLB)  (0) 2021.07.15
데드락(DeadLock)  (0) 2021.07.12
CPU 스케줄링  (0) 2021.07.06
인터럽트(+트랩)  (0) 2021.07.06