말감로그

24.08.12 운영체제 - 프로세스 동기화(경쟁 상태, 임계구역, 뮤텍스, 세마포어, 데드락) 본문

TIL

24.08.12 운영체제 - 프로세스 동기화(경쟁 상태, 임계구역, 뮤텍스, 세마포어, 데드락)

habbn 2024. 8. 12. 23:42
728x90

프로세스 동기화 

프로세스 동기화는 여러 프로세스가 공유 자원에 동시에 접근할 때 발생할 수 있는 문제를 방지하고, 자원의 일관성을 유지하기 위한 방법이다.

다중 프로세스 환경에서는 여러 프로세스가 동시에 실행되며, 이러한 프로세스들이 동일한 자원에 접근할 경우, 의도하지 않은 결과나 경쟁 상태가 발생할 수 있다. 


경쟁 상태(Race Condition)

두 개 이상의 프로세스가 공유 자원에 동시에 접근하고, 그 결과가 접근 순서에 따라 달라질 때 발생하는 문제이다.

경쟁 상태는 매우 예측하기 어렵고, 잘못된 결과를 초래할 수 있다.

 

임계 구역(Critical section)

공유되는 자원, 즉 동시 접근하려고 하는 자원에서 문제가 발생하지 않게 독점을 보장해줘야 하는 영역이다.

 

임계 구역을 해결하기 위한 세 가지 조건

1. 상호 배제(Mutal exclusion)

하나의 프로세스가 임계 구역에 들어가 있다면 다른 프로세스는 들어갈 수 없어야 한다.

 

2. 진행 (Progress) 

임계 구역에 들어간 프로세스가 없는 상태에서 들어가려 하는 프로세스가 여러 개라면 어느 것이 들어갈 지 결정해줘야한다.

 

3. 한정 대기(Bounded Waiting)

다른 프로세스의 기아를 방지하기 위해, 한 번 임계 구역에 들어간 프로세스는 다음 번 임계 구역에 들어갈 때 제한을 둬야 한다.


프로세스 동기화를 위한 기법

뮤텍스(Mutex)

뮤텍스는 임계 구역을 보호하고, 상호 배제를 구현하는 데 사용되는 동기화 방법이다.

작동 방식

- 뮤텍스는 잠금(lock)해제(unlock)의 두 가지 상태를 가지고 있다.

- 하나의 스레드만 뮤텍스를 잠글 수 있으며, 잠금이 되어 있는 동안 다른 스레드는 해당 뮤텍스가 해제될 때까지 기다려야 한다.

- 잠금된 뮤텍스는 오직 잠근 스레드만이 해제할 수 있다.

특징

뮤텍스는 공유 자원에 대한 접근을 단일 스레드에게만 허용한다. 이는 주로 데이터의 무결성을 보호하기 위해 사용되며, 한 번에 하나의 스레드만이 공유 자원에 접근할 수 있도록 한다.( = 상호 배제 )

뮤텍스는 소유권 개념을 가지고 있어, 잠금을 건 스레드만이 잠금을 해제할 수 있다.

 

세마포어(Semaphore)

세마포어는 프로세스/스레드 간에 공유 자원에 대한 접근을 제한하기 위해 사용되는 동기화 방법이다.

세마포어는 카운터로 생각할 수 있으며, 이 카운터는 자원에 접근할 수 있는 '티켓'의 개수를 나타낸다.

 

작동 방식

- 세마포어는 두 가지의 주요 연산인 wait() (또는 P 연산)signal() (또는 V 연산)을 통해 동작한다.

- wait() 연산은 세마포어 값을 감소시킨다. 값이 0 이하라면 프로세스나 스레드는 대기 상태에 들어간다.

- signal() 연산은 세마포어 값을 증가시킨다. 값이 양수라면 대기 중인 스레드나 프로세스가 깨어나서 실행될 수 있다.

 

특징

세마포어는 여러 프로세스의 공유 자원에 대한 접근을 제한하는 데 사용되며, 이는 특정 숫자로 초기화된다. 이 숫자는 동시에 해당 자원에 접근할 수 있는 스레드의 최대 수를 나타낸다. 세마포어는 스레드가 자원을 사용할 때마다 감소하고, 자원을 해제할 때마다 증가한다.

 

세마포어는 카운팅 세마포어와 바이너리 세마포어로 구분한다.

- 카운팅 세마포어 : 자원에 접근할 수 있는 최대 프로세스 수를 제한한다.

- 바이너리 세마포어 : 뮤텍스와 유사하게, 한 번에 하나의 프로세스만이 자원에 접근할 수 있도록 한다. 


교착 상태(DeadLock)

둘 이상의 프로세스가 서로 점유하고 있는 자원을 서로 기다릴 때 무한 대기 상태에 빠지는 것을 말한다. 

 

교착 상태가 발생하는 4가지 조건

(4가지 모두 성립해야 데드락 발생, 하나라도 성립하지 않으면 데드락 문제 해결 가능)

 

1. 상호 배제 (Mutual exclusion)

하나의 리소스는 한 번에 한 프로세스만이 사용할 수 있다.

 

2. 점유와 대기 (Hold and wait)

프로세스는 반드시 하나 이상의 리소스를 점유한 상태에서 다른 프로세스의 자원을 기다리고 있다. 

 

3. 비선점 (No preemption)

자원은 프로세스가 자발적으로 반환해야 한다. (강제로 빼앗지 않음)

 

4. 환형 대기 (Circular wait)

다른 자원을 기다리고 있는 프로세스들 각각 , P0는 P1의 자원을, P1는 P2의 자원을, ... PN은 P0의 자원을 기다리는 환형 대기 상태이다.

 

교착 상태 해결 방법

1. 예방 (Prevention)

 - 교착상태 발생 4가지 조건 중에서 요구 조건을 만족시키지 않게 어느 하나를 제거 함으로써 수행된다.

 - 자원 낭비가 가장 심한 기법이다.

 

2. 회피 (Avoidance) 

 - 교착 상태가 발생할 가능성을 배제하지 않고 교착 상태가 발생하면 적절히 피해나가는 방법이다.

 - 리소스 할당의 측면에서, 교착상태가 발생할 가능성이 있는 자원 할당을 하지 않는다.

 - 은행원 알고리즘이 사용된다.

더보기

은행원 알고리즘(Banker's Algorithm)

 

- 은행원 알고리즘은 다익스트라가 제안한 기법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래한 기법이다.

- 이 알고리즘은 프로세스가 자원을 요청할 때, 시스템이 그 요청을 받아들여도 안전 상태를 유지할 수 있는지 확인한다.

- 각 프로세스에게 자원을 할당하여 교착 상태가 발생하지 않으며 모든 프로세스가 완료될 수 있는 상태는 "안전 상태" ,

  교착 상태가 발생할 수 있는 상태는 "불안전 상태" 라고 한다.

 

3. 탐지 및 회복 (Dectection and Recovery)

 - 교착 상태가 발생할 수 있도록 놔두고 교착상태가 발생 할 경우 찾아내어 고친다.

탐지

 - 자원 할당 그래프를 통해 시스템에 교착상태가 발생했는지 점검하여 교착상태에 있는 프로세스와 자원을 발견한다.

회복

 - 교착 상태를 일으킨 프로세스를 종료하거나 교착 상태의 프로세스에 할당된 자원을 선점하여 프로세스나 자원을 회복한다.

728x90