CS/운영체제

경쟁 상태, 임계 영역, 스핀락, 뮤텍스, 세마포어

leah-only 2025. 2. 7. 00:27

공유 자원

시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수를 의미


경쟁 상태 (race condition)

이 때 2개 이상의 프로세스/스레드가 공유 자원에 접근하려는 상황을 경쟁 상태 (race condition)이라고 한다.

동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상황

이것을 막기 위해서는 동기화(synchronize)가 되어야 한다.


경쟁 상태(race condition)는 언제 발생할까?

커널 수행 중 인터럽트 발생

커널 모드에서 실행 중인 프로세스가 공유 변수에 접근하는 도중 인터럽트가 발생하면, 인터럽트 처리 루틴 또한 해당 공유 변수에 접근이 가능하다.

이 때 두 접근이 순서대로 실행되지 않고 겹쳐서 실행될 경우 race condition이 발생할 수 있다.

 

멀티 프로세서 환경에서 공유 메모리내의 커널 데이터에 접근할 때

멀티 프로세서 환경에서는 여러 개의 CPU가 공유 메모리에 동시에 접근할 수 있다.

커널 데이터는 여러 프로세스에 의해 공유되므로, 여러 개의 CPU가 커널 데이터에 동시에 접근할 경우 race condition이 발생할 수 있다. 

 

프로세스 Context Switching이 일어나는 경우

프로세스가 system call을 통해 커널 모드로 전환되어 공유 자원에 접근하는 도중 context switching이 발생하면

다른 프로세스가 커널 모드로 진입하여 동일한 공유 자원에 접근할 수 있다. 


동기화 (synchronization) 이란?

여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것


임계 영역 (critical section) 이란?

공유 자원에 접근하는 코드의 특정 영역으로 race condition이 일어날 수 있는 영역

이러한 임계영역에 대한 경쟁상태를 제거하기 위해 한 공유 자원에 대해서 한 쓰레드에만 접근을 허락하도록 하는 상호배제 (mutual exclusion)를 사용


임계 영역 문제 해결 조건

상호 배제 (Mutual Exclusion)

하나의 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없어야 한다.

 

목적

공유 자원에 대한 동시 접근을 막아 데이터의 일관성을 유지

 

진행 (Progress)

임계 영역에 들어가려는 프로세스가 여러 개 있을 때, 어떤 프로세스가 임계 영역에 들어갈 것인지 결정하는 메커니즘

 

목적

모든 프로세스가 공정하게 임계 영역에 접근할 수 있도록 보장

 

한정 대기 (Bounded Waiting)

특정 프로세스가 임계 영역에 진입하기 위해 무한정 기다리는 상황(기아상태)을 방지

 

목적

모든 프로세스가 유한한 시간에 임계 영역에 접근할 수 있도록 보장

 

상호 배제를 통해 임계 영역에 대한 동시 접근을 막고
진행으로 임계 영역에 들어갈 프로세스를 결정하며
한정 대기를 통해 기아 상태를 방지함으로
임계 영역 문제를 해결할 수 있다.

임계 영역 문제를 해결하기 위한 동기화 기법

스핀락 (Spinlock)

공유 자원을 점유하려는 스레드가 락을 획득하지 못하면, 락이 해제될 때 까지 반복적으로 락 획득을 시도

즉, 락이 해제될 때까지 'spin' (계속해서 CPU를 사용하며 대기) 한다. 

 

장점

  • 컨텍스트 스위칭 오버헤드가 없어 짧은 임계 영역에 대한 동기화에 효율적 (짧은 시간 동안 락을 점유하는 경우)

단점

  • 락 획득에 실패한 스레드는 락이 해제될 때까지 CPU를 계속 사용하므로 CPU 자원 낭비

뮤텍스 (Mutex)

1개의 스레드만이 공유 자원에 접근할 수 있도록 하여 경쟁 상태(race condition)을 방지하는 기법

공유 자원을 점유하는 스레드가 락(lock)을 걸면, 다른 스레드는 언락(unlock) 상태가 될 때까지 해당 자원에 접근할 수 없음

 

일반적으로 0 또는 1 값을 갖는 변수 사용. 0 (unlock) / 1 (lock)


세마포어 (Semaphore)

S개의 스레드만이 공유 자원에 접근할 수 있도록 제어하는 동기화 기법 

정수 값과 2가지 함수 wait(P함수) 및 signal(V함수)로 공유 자원에 대한 접근을 처리

뮤텍스와 달리 여러 개의 스레드가 공유 자원에 동시에 접근 가능

현재 수행중인 프로세스가 아닌 다른 프로세스가 세마포어를 해제할 수 있

 

원리

정수형 변수 S 값을 가용한 자원의 수로 초기화 하고 자원에 접근할 때는 S-- 연산을 수행하고 자원을 방출할 때는 S++ 연산을 수행

세마포어 값이 0이 되면 모든 자원을 사용중임을 의미하고 이후 자원을 이용하려는 프로세스는 세마포어 값이 0보다 커질 때까지 블록(block)됨

wait()
자신의 차례가 올 때까지 기다리는 함수
임계 구역 진입할 때 호출되어 들어갈 수 있는지 확인
signal()
다음 프로세스로 순서를 넘겨주는 함수
임계 구역을 빠져나올 때 호출

 

바이너리 세마포어 (Binary Semaphore)

뮤텍스(mutex)와 동일하게 0과 1 두 가지 값만 가질 수 있는 세마포어

 

카운팅 세마포어 (Counting Semaphore)

여러 개의 값을 가질 수 있는 세마포어로 여러 자원에 대한 접근을 제어하는 데 사용 (value 값이 1보다 큰 세마포어)


뮤텍스 vs 세마포어

특징 뮤텍스 (mutex) 세마포어 (semaphore)
목적 상호 배제 공유 자원 접근 제어
접근 가능한 스레드 수 1개 1개 이상
0 또는 1 0 이상의 정수
메커니즘 잠금(lock) 신호(signal)
사용 예시 공유 변수 접근, 데이터베이스 수정 프린터 공유, 작업 개수 제한
사용 권장 상호 배제만 필요한 경우 작업 간의 실행 순서 동기화 필요한 경우

 


뮤텍스 vs 바이너리 세마포어

뮤텍스는 잠금을 기반으로 상호 배제가 일어나는 '잠금 메커니즘' 이고, 

세마포어는 신호를 기반으로 상호 배제가 일어나는 '신호 메커니즘' 이다.


예상 질문 List >

Q. Race Condition(경쟁 상태)에 대하여 간단한 예시를 들어 설명해주세요.

통장 잔고를 예시로 들어보겠다. 2개의 쓰레드와 잔고라는 공유자원이 존재한다고 가정해보자.

잔고가 출금 금액보다 적을 경우에는 출금할 수 없다. 잔고에는 현재 5000원이 있다.

 

만일 쓰레드 1에서 5000원을 출금하기 위해 잔액을 먼저 조회한 후, 5000원 이상인 것을 확인했다.

그런데 이때 Context Switch가 발생하여 쓰레드 2로 교체 되었다.

 

쓰레드 2도 동일한 작업을 한다.

다행히 쓰레드 2에서는 출금 전 Context Switch가 발생하지 않아 출금을 마쳐 잔액은 0원이 되었다.

 

이후 Context Switch가 발생하여 다시 쓰레드 1로 교체되었다. 쓰레드1은 잔액조회까지 마쳤기 때문에 출금을 시도한다. 그러나, 잔액은 아까 쓰레드2의 작업으로 0원이 되어있어 출금을 하게 되면 0보다 작은 수가 된다.

 


Q. 뮤텍스가 스핀락보다 항상 좋은가요?

멀티 코어 환경이고, critical section에서의 작업이 컨텍스트 스위칭보다 더 빨리 끝난다면 스핀락이 뮤텍스보다 더 이점이 있다.


CS 로드맵 출처 : https://github.com/devSquad-study/2023-CS-Study

예상 질문 출처 : https://eunsun-zizone-zzang.tistory.com/48

 

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

교착상태 (Deadlock)  (0) 2025.02.10
TLB (Translation Lookaside Buffer)  (1) 2025.02.06
요구 페이징, 페이지 교체  (0) 2025.02.06
메모리 할당 - 페이징(Paging) & Paged Segmentation  (0) 2025.02.03
메모리 할당  (0) 2025.01.23