멀티 코어 시스템에서는 여러 프로세스가 동시에 실행되어 시스템의 성능 향상을 목표로 한다.
이러한 환경에서 하나의 공유 자원을 한 프로세스가 사용중일 때,
다른 프로세스가 동시에 사용하려고 하면 여러 문제가 발생한다.
서로 다른 값을 변경하려고 하거나 읽는 도중에 값이 바뀌어 오류가 생길 수도 있다.
이러한 문제들을 동기화 문제라고 하며
이렇게 동시에 사용될 수 있는 자원을 임계 영역이라고 한다.
0. 임계 영역 Critical Section
- 정의
프로세스 간 공유 자원을 접근하는 데 있어서 문제가 발생하지 않도록
한 번에 하나의 프로세스만 이용하도록 다른 프로세스의 접근을 제한하는 영역
- Critical Section Problem
: 임계 영역을 만족시키기 위해서 해결해야 할 3가지 문제들
- 상호배제(Mutual Exclusion)
- 하나의 프로세스/스레드가 임계 영역에서 실행중이라면, 다른 프로세스/스레드는 해당 영역에 접근할 수 없어야 함
- 한 순간에 오직 하나의 프로세스/스레드만이 임계 영역에 진입할 수 있음을 보장함
- 진행(Progress)
- 임계 영역에서 실행중인 프로세스가 없을 때 들어가려는 프로세스가 여러 개라면,
현재 대기중인 프로세스만이 진입 후보가 될 수 있고, 어느 것이 들어갈 것인지 결정해주어야 함
- 임계 영역에서 실행중인 프로세스가 없을 때 들어가려는 프로세스가 여러 개라면,
- 제한된 대기(Bounded Waiting)
- 한 프로세스가 임계 영역에 진입 요청 후 받아들여질 때까지의 시간 동안
다른 프로세스들이 임계 영역에 진입하는 횟수는 제한이 있어야 함 - 다른 프로세스들의 기아(Starvation)를 막기 위함
- 한 프로세스가 임계 영역에 진입 요청 후 받아들여질 때까지의 시간 동안
- 구현 방법
섹션에 들어갈 때 락을 취득한 스레드만이 진입하고,
나갈 때 락을 반환하도록 하는 식으로 구현 가능
👉 락을 사용해서 상호 배제 달성 가능
1. 동기화란? Synchronization
- 정의: 어떤 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것
- 목적
- 상호배제(Mutual Exclusion)
- 스레드 간의 순서 보장(Ordering)
- 효율적인 통신과 협력(Cooperation)
스핀락, 세마포어, 뮤텍스 등의 동기화 메커니즘을 적절히 활용하여 동기화를 구현하면
경쟁 조건과 데드락, 스레드 간의 충돌 등의 문제를 예방하고
안정적인 다중 스레드 프로그래밍을 구현할 수 있다.
즉, 스레드 간의 안전한 상호작용과 동기화된 실행을 달성할 수 있다.
동기화 메커니즘에 대해서 자세히 알아보자.
2. 동기화 메커니즘
동기화 메커니즘은 여러 스레드가 공유 자원에 동시에 접근하는 것을 조절하고 조율하는 데 사용되는 기술이다.
주로 운영체제의 커널(Kernel)에서 사용된다.
위에서 말했듯이 동기화 메커니즘이 있어야만 공유자원에 대한 안전한 접근을 보장해 예측 가능하고 일관성 있는 프로그램을 만들 수 있다.
동기화 메커니즘의 종류에는 스핀락, 뮤텍스, 세마포어 등이 있다.
- 스핀락 Spinlock
- 정의
- 임계영역이 락이 걸려서 진입이 불가능할 때, 임계영역이 언락되어 진입이 가능해질 때까지 루프를 돌면서 재시도하여 스레드가 CPU를 점유하고 있는 상태
- 특징
- Busy Waiting 상태이며 대기 큐를 갖지 않음
: CPU를 점유하여 무의미한 코드를 계속 수행하면서 임계영역이 언락되길 기다림 - 문맥 교환(Context Switching)이 일어나지 않아 멀티 프로세서 시스템에서만 사용 가능
: 운영체제의 스케줄링 지원을 받지 않음
- Busy Waiting 상태이며 대기 큐를 갖지 않음
- 장점
- 단순하고 구현이 쉬움
- 속도가 빠른 편
: 락을 기다리는 동안 스레드가 대기하지 않고 계속 실행됨
- 단점
- 효율성이 떨어짐
: Busy-wait 방식으로 대기하면서 락을 얻을 수 있는지 확인하므로 계속해서 CPU 자원 낭비(오버헤드)
- 효율성이 떨어짐
- 뮤텍스 Mutex
- 정의
- 여러 스레드를 사용하는 환경에서 자원에 대한 접근을 강제하기 위한 동기화 메커니즘
- Mutual Exclusion의 약자로서 상호 배제라고도 함
- 특징
- 공유자원을 사용중인 스레드가 있을 때, 다른 스레드가 공유자원에 접근한다면 Blocking 후 대기 큐로 보냄
- 권한을 획득하기까지 Sleep 상태로 들어갔다 Wakeup 되면 다시 권한 획득을 시도함
- Locking 매커니즘: 락을 건 스레드가 임계영역을 나갈 때만 락을 해제할 수 있음
- 장점
- 중요한 섹션에 진입한 다음 해제하기 전에 획득한 단순한 잠금임
- 경쟁 조건이 없으며 데이터가 항상 일관성을 유지함
: 주어진 시간에 하나의 스레드만 임계 섹션에 있음
- 단점
- 기아(Starvation) 현상
: 스레드가 lock을 획득하고 절전 모드로 전환되거나 선점되면 다른 스레드가 앞으로 나아갈 수 없음 - CPU 시간 낭비
: 정상적인 구현에서는 바쁜 대기 상태가 되어 CPU 시간이 낭비될 수 있음
- 기아(Starvation) 현상
- 세마포어 Semaphore
- 정의
- 한 개의 공유되는 자원에 제한된 개수의 프로세스/스레드만 접근 가능하도록 하는 장치
- 특징
- 표현형(자원의 수)이 정수형 👉 하나 이상의 컴포넌트가 공유 자원에 접근 가능
- Signaling 매커니즘: Lock을 걸지 않은 스레드도 Signal을 보내 Lock을 해제할 수 있음
- 작업의 순서를 정해줄 때도 사용 가능
- 종류
- 개수 세마포어 Counting Semaphore
- 정의: 도메인이 0 이상인 임의의 정수값인 세마포어
- 용도: 제한된 자원을 가지고 액세스 작업을 할 때 사용
- 특징: 여러 개의 자원을 가질 수 있음 - 이진 세마포어 Binay Semaphore
- 정의: 0 또는 1 값만 가질 수 있는 세마포어
- 용도: 임계영역 문제를 해결하는 데에 사용
- 특징: 자원이 하나이므로 뮤텍스로도 사용 가능
- 개수 세마포어 Counting Semaphore
- 장점
- 임계 영역에 하나 이상의 스레드가 접근하는 것을 가능하게 함
- 여러 프로세스가 동시에 임계 영역에 접근하는 것을 막음
- 효율적인 CPU 자원 관리
: busy waiting이 있어 프로세스 시간과 자원의 낭비가 없음
- 단점
- 우선순위 역전 가능성
: 낮은 우선순위의 스레드가 높은 우선순위의 스레드보다 먼저 자원을 획득하는 경우 - 기아(Starvation) 현상
: 자원을 계속해서 사용 중인 스레드가 우선순위가 높아 낮은 우선순위의 스레드가 오랫동안 획득하지 못할 수 있음 - 복잡한 프로그래밍
: 복잡할 수 있고 여러 세맛포어를 조합해서 사용하는 경우 프로그램의 가독성과 유지보수성이 떨어짐
- 우선순위 역전 가능성
3. 정리
Mutex vs Spinlock
뮤텍스는 대부분의 상황에서 스핀락보다 효율적으로 동작할 수 있으며,
특히 대기 시간이 길거나 대기 스레드가 많은 상황에서 더 효율적이다.
스핀락은 멀티 코어 환경(락을 얻은 후에 컨텍스트 스위칭이 필요 없는 환경)이고,
임계 영역에서의 작업이 컨텍스트 스위칭보다 더 빨리 일어날 때 더 효율적이다.
Mutex vs Binary Semaphore
뮤텍스는 락을 가진 스레드에서만 락을 해제할 수 있고(Locking 메커니즘),
같은 공유자원을 사용하려는 우선순위가 더 높은 프로세스가 접근한다면 임시적으로 해당 프로세스의 우선순위로 바꾸는 특징을 가진다.
반면, 세마포어는 자원을 요청하는 스레드와 자원을 해제하는 스레드가 다를 수 있고(Signaling 메커니즘),
우선순위를 고려하지 않는 특징을 가진다.
👉 상호 배제만 필요한 경우에 뮤텍스, 작업 간 실행 순서 동기화가 필요한 경우에는 세마포어가 적합함
참고
- https://velog.io/@deannn/CS-%EA%B8%B0%EC%B4%88-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4Semaphore-%EB%AE%A4%ED%85%8D%EC%8A%A4Mutex-%EC%8A%A4%ED%95%80%EB%9D%BDSpin-lock
- https://engineerinsight.tistory.com/288
- https://www.baeldung.com/cs/what-is-mutex
- https://yunchan97.tistory.com/62
- https://www.baeldung.com/cs/spinlock-vs-semaphore
- https://www.guru99.com/ko/mutex-vs-semaphore.html
- https://dkwjdi.tistory.com/247
'Computer Science > OS' 카테고리의 다른 글
[OS] 교착상태 (데드락, Deadlock) (0) | 2024.07.03 |
---|---|
[OS] TLB (Translation Lookaside Buffer) (0) | 2024.06.27 |
[OS] 가상메모리와 요구 페이징, 페이지 교체 (0) | 2024.06.23 |
[OS] 페이징(Paging)과 세그멘테이션(Segmentation) (0) | 2024.06.23 |
[OS] 주소 변환 Address Binding (0) | 2024.06.18 |