이론 공부!/기술 면접 준비

[OS] 동기화 및 Lock 관련 정리

TutleKing 2022. 8. 24. 22:09
  • 동기화, 경쟁 조건, 임계영역
    • 예시 : 하나의 객체를 두 개의 스레드가 접근할 때 생기는 일
경쟁 조건이 일어날 수 있는 상황을 없애기 위해 동기화를 해야하는데, 동기화를 하기 위해 임계 영역을 지정하고자 한다.
    • 동기화 (Synchronization)
      • 여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지 하는 것
    • 경쟁 조건 (Race condition)
      • 여러 프로세스/스레드가 동시에 같은 데이터를 조작할 때, 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황
    • 임계 영역 (Critical section)
      • 공유 데이터의 일관성을 보장하기 위해 하나의 프로세스/스레드만 진입해서 실행 가능한 영역
      • Critical section problem의 해결책이 되기 위한 조건
        1. Mutual exclusion (상호 배제)
          1. 하나가 동작할 때는 다른거는 실행 못시킴
        2. Progress (진행)
          1. 임계영역이 비어있거나 요청이 오면 임계 영역에서 실행 될 수 있음
        3. Bounded wait (한정된 대기)
          1. 계속 기다리게 하지 않는다





스핀락, 뮤텍스, 세마포 : 어떻게 mutual exclusion을 보장할 수 있을까에 대한 고민

  • Lock : 임계영역을 지켜낼 수 있는 기법
    (test_and_set 함수는 atomic 함수 : 실행 중간에 간섭받거나 중단 되지 않음)
volatile int lock = 0;

void critical(){
	while (test_and_set(&lock)==1);
	//critical section operating
	lock=0;
}
  1. 스핀락(spinlock) : 위의 방법 처럼 lock을 가질 수 있을 때 까지 반복해서 시도
    • 기다리는 동안 CPU 낭비 됨
  2. 뮤텍스(Mutex)스핀락의 CPU 점유율 높은 현상을 해결하기 위해 락이 준비 되면 깨우는 방법
    • 현재 돌아가고있는 스레드가 있을 경우, 다음 스레드의 lock 차례에 스레드를 큐에 넣고
    • 현재 돌아가는 스레드가 unlock될때 , 큐에 하나라도 있으면 다음 순서의 스레드를 깨운다.
    • Priority inheritance 속성을 가진다.
      • Priority inheritance : 프로세스/스레드를 동작시키는 우선순위를 가지고 스케줄링 할 때, lock을 가지고있는 프로세스의 우선순위를 높여주어 critical section을 먼저 빠져나오게 하는 속성
      • 락을 가질 수 있을때 까지 휴식을 취하는 방법 (큐 & atomic 함수)
💡 뮤텍스가 스핀락 보다 항상 좋은가?
No. 멀티 코어 환경이고, critical section에서의 작업이 컨텍스트 스위칭보다 더 빨리 끝난다면 스핀락이 뮤텍스보다 더 이점이 있음.

3. 세마포(semaphore)

  • signal mechanism을 가진, 하나 이상의 프로세스/스레드가 critical section에 접근 가능하도록 하는 장치
  • 순서를 정해줄때 사용

 

💡 뮤텍스와 이진 세마포는 같은것 아닌가? 
No. 뮤텍스는 락을 가진 자만 락을 해제할 수 있지만 세마포는 그렇지 않다
💡 상호 배제만 필요하다면 뮤텍스 작업간의 실행 순서 동기화가 필요하다면 세마포
반응형