명품 운영체제

[운영체제] 세마포에 대해서

코딩 못하는 감자 2024. 4. 18. 20:28
세마포란?

n개의 자원을 여러 스레드가 공유하여 사용하도록 돕는 자원 관리 기법 

 

세마포는 왜 필요한가 

n개의 자원이 있는 상황에서 멀티스레드가 자원을 이용하게 되면 자원보다 스레드의 수가 더 많은 경우 

자원을 가지지 못한 스레드는 자원이 생길 때까지 기다려야 한다. 이때 효율적으로 자원을 분배하기 위해서 

관리가 필요하다.

 

 세마포의 구성요소 

1. 자원 

2. 대기 큐 

3. counter 변수: 사용가능한 자원의 개수를 나타낸다. 자원이 생기면 +1 대기 하는 스레드가 생길 경우 -1을 한다.

4. P/V 연산: P연산은 스레드가 자원 요청 시, V는 자원 반환 시 실행된다.

 

뮤텍스, 스핀락과 세마포의 차이 

뮤텍스, 스핀락은 임계구역에 진입하기 위해 스레드들이 경쟁할 때 관리

세마포는 자원 분배를 관리하는데 목적이있다. 

 

P/V 연산(wait/signal)

P연산은 스레드에게 자원 사용을 허가하는 과정이고 

V연산은 자원 사용이 끝나면 이를 세마포에 알리는 역할을 한다. 

이때 P연산은 counter 변수를 +1 V연산은 counter 변수를 -1 한다.

 

세마포의 종류 

1. 수면 대기 세마포(sleep-wait)

2. 바쁜 대기 세마포(busy-waiting)

 

수면 대기 세마포는 P연산 중 자원 사용 허가를 받지 못한 스레들을 재우고(컨텍스트 스위칭)

V연산에서 사용 가능한 자원이 생기면 깨워서 실행한다.

 

바쁜 대기 세마포는 P연산에서 사용할 수 있는 자원이 생길 때까지 무한 루프를 돌면서 감시한다.

바쁜 대기 세마포에는 대기 큐가 없다.

 

이진 세마포

관리하는 자원이 여러 개일 경우 카운터 세마포(흔히 알고 있는)

자원이 1개인 경우 이진 세마포라 부른다. 

자원 개수 말고는 카운터 세마포와 동일하다.

 

우선순위 역전

스레드의 동기화로 인해 우선순위가 높은 스레드가 낮은 스레드보다 늦게 실행되는 경우를 의미한다.

 

우선순위 역전 원인 

우선순위가 낮은 스레드가 높은 스레드와 공유 자원을 사용하고 있을 때 

다른 자원을 사용하는 스레드(낮은 스레드보다 우선순위 높음)이 들어오면 

우선순위가 낮음에도 먼저 실행될 수 있다. 

 

문제점 

보통 우선순위가 높은 스레드가 중요한 작업을 수행하도록 설계돼있기 때문에 

실행이 늦어짐으로써 문제가 발생할 수 있다 (실시간 시스템의 근본 목적 붕괴)

 

우선순위 역전 해결책 

 

1. 우선순위 올림

공유 자원을 가지고 있는 스레드의 우선순위를 일시적으로 우선순위가 높은 스레드보다 높은 순위로 

올리는 방법이다 

이 방법으로 공유 자원을 소유한 스레드는 다른 스레드에게 선점되지 않고 실행된다.

실행이 끝나면 원래 우선순위로 돌아간다.

 

2. 우선순위 상속 

공유 자원을 가지고 있는 스레드가 실행 중 같은 자원을 사용하는 높은 순위의 스레드가 자원을 요청할 때 

요청한 스레드보다 우선순위를 높게 변경해서 실행시킨다.

마찬가지로 실행이 끝나면 원래 우선순위로 돌아간다. 

 

우선순위 올림과 상속의 차이 

올림: 스레드가 공유 자원을 가질 때 우선순위를 올린다.

상속: 스레드가 실행 중 다른 스레드가 자원을 요청할 때 우선순위를 올린다.