✔️ 동기화(Synchronization)란?
- 여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것을 의미합니다.
✔️ 동기화의 목적
- 상호배제(Mutual Exclusion)
- 스레드 간의 순서 보장(Ordering)
- 효율적인 통신과 협력(Cooperation)
- 일반적으로 뮤텍스, 세마포어, 조건 변수, 원자적 연산 등의 기법과 동기화 객체를 활용하여 스레드 간의 안전한 상호작용과 동기화된 실행을 달성할 수 있습니다. 이러한 동기화 메커니즘을 적절히 사용하여 스레드 동기화를 구현하면 경쟁 조건과 데드락(Deadlock), 스레드 간의 충돌 등의 문제를 예방하고 안정적인 다중 스레드 프로그래밍을 구현할 수 있습니다.
✔️ 임계 영역(Critical Section)이란?
- 공유 데이터의 일관성을 보장하기 위해 하나의 프로세스/스레드만 진입해서 실행 가능한 영역을 의미합니다.
✔️ 스핀락(Spinlock)
- Busy-waiting 하며 대기 큐를 갖지 않는다.
- Mutex-nonblocking 모델로 볼 수 있다.
- 스핀락은 운영체제의 스케줄링 지원을 받지 않기 때문에 해당 스레드에 대한 문맥 교환이 일어나지 않습니다.
✔️ 뮤텍스(Mutex)
- 여러 스레드를 사용하는 환경에서 자원에 대한 접근을 강제하기 위한 동기화 메커니즘이다.
- Boolean 타입의 Lock 변수를 사용한다.
- 공유자원을 사용중인 스레드가 있을 때, 다른 스레드가 공유자원에 접근한다면 Blocking 후 대기 큐로 보낸다.
- Lock을 건 스레드만 Lock을 해제할 수 있다.
뮤텍스
뮤텍스 예제 코드
do {
wait (mutex);
// Critical section
signal (mutex);
// Remainder section
} while (TRUE);
✔️ 세마포어(Semaphore)
- 세마포어 변수를 통해 wait, signal을 관리한다. 세마포어 변수는 0 이상의 정수형 변수를 갖는다.
- 계수 세마포어로 사용할 수 있으며, 접근 가능한 공유 자원의 수가 1개일 때는 이진 세마포어로 뮤텍스처럼 사용할 수 있다.
- Lock을 걸지않은 스레드도 Signal을 보내 Lock을 해제할 수 있다.
- 세마포어는 크게 Counting Semaphores, Binary Semaphore 2종류가 있다.
세마포어
세마포어 예제 코드
wait(S) {
while (S <= 0); // 자원이 없다면 while 루프를 돌며 대기를 함.
S--; // 자원을 획득함.
}
signal(S) {
S++; // 자원을 해제함.
}
✔️ 세마포어와 뮤텍스의 차이점
- 세마포어는 자원의 상태를 나타내는 일종의 '변수'로써 소유 개념이 아니지만, 뮤텍스는 자원을 점유한 프로세스나 쓰레드가 잠시 소유하였다가 작업이 끝나면 반환하는 개념이다.
- 뮤텍스는 Locking 메커니즘으로 락을 걸은 쓰레드만이 임계 영역을 나갈때 락을 해제할 수 있다. 하지만 세마포어는 Signaling 메커니즘으로 락을 걸지 않은 쓰레드도 signal을 사용해 락을 해제할 수 있다.
- 가장 큰 차이점은 뮤텍스가 동기화 대상이 자원의 하나라면, 세마포어는 하나 이상일 때 사용된다.
- 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 절대로 세마포어가 될 수 없다.
Reference
'운영체제' 카테고리의 다른 글
[Pintos-Kaist] Project2 - Argument Passing (1) | 2023.06.05 |
---|---|
[운영체제] 인터럽트 & 시스템 콜(Interrupt, System Call) (0) | 2023.06.02 |
[Pintos-Kaist] Project 1 - Threads 1주차 학습 (0) | 2023.06.02 |
[운영체제] 동시성(Concurrency)과 병렬성(Parallelism) (0) | 2023.05.27 |
[운영체제] 프로세스(Process)와 스레드(Thread) (0) | 2023.05.27 |