본문 바로가기
운영체제(OS)

[OS] 동기화 메커니즘(Synchronization Mechanisms)과 스핀락(Spinlock), 뮤텍스(Mutex), 세마포어(Semaphore)

by 도전하는 린치핀 2024. 6. 28.

 

0. 경쟁 상태와 임계 구역

0-1. 경쟁 상태 (Race Condition)

  • 경쟁 상태는 여러 개의 프로세스가 병행하여 공유 자원을 읽고 쓸 때 발생하는 상황
  • 공유 자원 접근 순서에 따라 실행 결과가 매번 달라지는 문제 (non-deterministic)
  • 이러한 경쟁 상태를 해결하기 위해 동기화 매커니즘이 필요하다.

0-2. 임계 구역 (Critical Section)

  • 둘 이상의 프로세스/스레드가 동시에 실행될 경우 생길 수 있는 경쟁 조건을 발생시킬 수 있는 코드 영역
  • 임계 구역 해결 조건
    • Mutual Exclusion (상호 배제) : 이미 한 프로세스가 임계 구역에서 실행중이라면 다른 프로세스의 접근을 금지하는 것
    • Progress (진행) : 임계 구역에 프로세스가 없을 때, 임계 구역에 접근하고자 하는 프로세스가 있다면 진입할 수 있어야 한다.
    • Bounded Waiting (한정 대기) : 프로세스가 임계 구역에 진입하기 위해 요청한 후부터 그 요청이 허욜될 때까지 다른 프로세스들이 임계 구역에 들어가는 횟수에 제한이 있어야 한다. 

1. 동기화 매커니즘

1-1. 동기화

  • 프로세스/스레드가 공유 자원에 동시에 접근하지 못하도록 접근 순서를 제어하는 방법
  • 여러 프로세스/스레드가 동시에 실행되어도, 공유 자원의 일관성을 유지하는 것으로 방법에서는 스핀락, 뮤텍스, 세마포어가 있다.

1-2. Lock (락)

  • 공유 자원을 특정 프로세스/스레드가 사용하고 있을 때, 다른 프로세스/스레드는 해당 공유 자원에 접근할 수 없도록 제한하는 것
  • 예를 들면, 스레드 A가 공유 자원을 사용할 때 Lock을 통해(= acquire) 다른 스레드가 접근하지 못하게 하고, 스레드 A의 작업이 종료되면 Lock을 풀고(=release, unlock) 대기하고 있던 다른 스레드가 작업을 수행하게 된다.
while (true) {
	acquire(); //acquire lock

    /* critical section */
    
    release(); //release lock
    
    /* remainder section */
}

 

2. 스핀 락(Spin Lock), 뮤텍스(Mutex, MUTual EXclusion), 세마포어(Semaphore)

2-1. 스핀 락 (Spin Lock)

  • 스레드가 공유자원을 얻을 수 있을 때 까지 무한 루프를 돌면서 확인하는 매커니즘
  • 대기중인 스레드가 공유 자원의 상태를 무한 루프를 돌며 확인하는 방식
  • busy waiting → CPU 낭비가 계속된다.
  • 보통, 컨텍스트 스위칭 시간이 더 짧을 때나 멀티 코어 상태일 때 사용한다.
  • 예를 들어, 한 사람이 화장실을 사용하고 있고 다른 사람이 화장실을 이용하려고 할 때 다른 사람은 계속 화장실 앞에서 노크를 하면서 나올때까지 기다리는 상황이다.

 

2-2. 뮤텍스 (Mutex)

  • 임계 구역 문제를 해결하기 위한 가장 간단한 방법
  • 상호 배제(Mutual Exclusion)을 따르기 때문에 하나의 Lock만 존재한다.
  • 공유 자원이 하나일 때 사용하는 동기화 방법
  • Lock을 걸고(acquire), 푸는(release) 동작은 atomic하게 수행한다. (Lock을 건 프로세스만 Lock을 풀 수 있다)
  • 예를 들어, 한 사람이 화장실을 사용하고 있고 다른 사람이 화장실을 이용하려는 상황이 있다고 가정해보자
    • 이때, 처음 사용하는 사람이 들어가면서 문을 잠근다(Lock)
    • 다른 사람이 화장실을 이용하려고 하면 처음에 문이 잠겨 있는지 확인하고 문을 잠겨 있다면 대기하는 장소에서 대기한다.
    • 먼저 사용하고 있는 사람이 나오면서 잠긴 문을 열어놓고 나간다(release)
    • 문이 열리면 기다리고 있는 사람이 들어가서 문을 잠그고 볼 일을 본다.
  • 대기 큐를 생성하여 임계 영역에 스레드가 있을 경우 다른 스레드가 공유 자원을 사용하려고 한다면, 스레드를 Blocking하고 대기 큐에 Sleep한다.

 

2-3. 세마포어 (Semaphore)

  • 뮤텍스에서 더 고차원적인 동기화 방법이다.
  • 멀티 프로세스 환경에서 여러 개의 공유 자원에 대한 접근을 제한하는 방법이다.
  • 예를 들어, 최대 3개의 화장실을 사람들이 공동으로 나눠서 쓰는 방법을 생각해보자
    • 이때, 세마포어는 S(정수형)는 남은 화장실 수 = 공유 자원에 접근할 수 있는 프로세스/스레드의 수를 의미한다.
    • 화장실에 들어가면서 사용중인 화장실 수를 나타내는 P 연산
    • 화장실을 모두 사용한 사람이 나오면서 빈 화장실 수를 올리는 V 연산
    • 즉, S가 0이면 모든 사람이 화장실을 사용중이고 남은 화장실 수가 없다는 뜻이다.
  • 대기하는 방식에는 Busy Waiting / Block & Wake-up 방식이 있다.

3. 스핀 락 / 뮤텍스 공통점과 차이점

  • 공통점 : 자원에 대해 사용할 시 락을 걸고 자원이 다른 프로세스/스레드에 의해 점유 중이라면 락이 풀릴때 까지 기다려야 한다.
  • 스핀락
    • 무한 루프로 인한 CPU 낭비가 있다 (busy waiting)
    • Lock이 곧 사용가능한 경우 콘텍스트 스위칭을 줄여 부하를 줄일 수 있다.
    • 하나의 공유자원에 대해서는 유용하지 못하다.
  • 뮤텍스
    • 무한 루프가 아닌 콘텍스트 스위칭이 일어나 CPU 낭비가 적다.
    • 자원을 얻는 시간이 짧다면 콘텍스트 스위칭으로 인한 낭비가 더 크다.

4. 뮤텍스 / 세마포어

  • 뮤텍스 : 이진 세마포어로 자원의 개수가 하나 뿐일 때, 사용 가능한지 사용 불가능한지만 파악하면 된다.
    • 오직 한개의 프로세스 혹은 스레드만이 공유 자원에 접근할 수 있다. 
  • 세마포어 : 여러 개의 공유 자원에 대한 접근을 제어하는 방법
    • 지정된 변수의 값(공유 자원의 수)만큼 접근할 수 있다.
예상질문
1. 컨텍스트 스위칭 시간이 더 짧거나 멀티 코어 상태일 때 spin lock을 사용하는 이유는 뭔가요?
→ 스핀 락은 컨텍스트 스위칭 오버헤드를 줄이고 멀티 코어 환경에서 효율성을 높이기 위해 사용됩니다. 컨텍스트 스위칭은 CPU 상태 저장과 복구 때문에 시간이 많이 걸리지만, 스핀 락은 짧은 시간 동안 CPU가 바쁘게 대기하면서 자원을 낭비하지 않고 락을 얻을 수 있도록 합니다.
2. 뮤텍스와 세마포어의 차이는 무엇인가요?
→ 가장 큰 차이점은 공유자원의 개수가 다르다는 점입니다. 따라서, 뮤텍스는 임계영역에 대한 접근을 보호하기 위해 사용되고, 세마포어는 자원의 수량을 관리하거나 동시접근을 관리하는 데 사용됩니다.
3. context switching에 대해서 간단하게 설명해주실 수 있을까요?
→ CPU가 한 프로세스(또는 스레드)의 실행을 중단하고, 다른 프로세스의 실행을 시작하는 과정입니다.
4. 스핀락의 장단점은 무엇인가요?
→ 스핀 락의 장점은 컨텍스트 스위칭 없이 락을 얻을 수 있어 오버헤드가 적다는 장점이 있습니다. 단점은 긴 대기 시간이나 단일 코어 시스템에서는 CPU 자원을 낭비하게 되어 비효율적입니다. 적절한 상황에서만 사용하는 것이 중요합니다.
5. 동기화란 무엇인가요?
→ 동기화란 여러 프로세스나 스레드가 공유자원에 접근할 때 접근 순서를 제어하는 방법입니다. 따라서, 공유자원의 일관성을 유지하고 데드락을 방지하며 프로그램의 정확성과 안정성을 확보하는데 중요한 역할을 합니다.