동기화 전략 (스핀락, 뮤텍스, 세마포)

텐저린티·2024년 1월 17일
0

알쓸신잡

목록 보기
9/10
post-thumbnail

경쟁조건 (Race Condition)

  • 프로세스/스레드가 동시에 같은 데이터 조작 시 타이밍, 접근 순서에 따라 결과가 달라지는 현상

동기화 (Synchronization)

  • 프로세스/스레드를 동시 실행해도 공유 데이터 일관성 유지

임계영역 (Critical Section)

  • 공유데이터 일관성 보장위해 하나의 프로세스/스레드만 진입해서 실행 가능한 영역 (mutual exclusion)
  • mutual exclusion 을 만족하는 방법은 Lock

임계영역 문제 해결 조건

  1. mutual exclusion 상호배제
  2. progress 진행
  3. bounded waiting 한정된 대기

    SimpleDateFormat 은 java의 대표적인 Thread-unsafe 클래스

CPU atomic 명령어

  • 실행 중간에 간섭/중단 되지 않는 명령어
  • 같은 메모리 영역에 대해 동시 실행 X
  • 이 부분 실행 중에는 문맥교환으로 인한 동시 실행이 일어나지 않음
int TestAndSet(int *lockPtr) {
	int oldLock = *lockPtr;
	*lockPtr = 1;
	return oldLock;
}

동기화 전략

스핀락

  • 락 획득까지 반복 시도
  • 기다리는 동안 CPU 낭비

뮤텍스

  • 락 획득까지 휴식
class Mutex {
	// 대기 큐에 넣기 위한 값
	// 0 : 락 사용 중 / 1 : 락 미사용 중
	int value = 1;
	// 대기 큐가 동시성 문제에 걸릴까봐 존재하는 값
	int guard = 0;
}

Mutex::lock() {
	while (test_and_set(&guard));
	if (value == 0) {
		현재 스레드 큐에 넣기;
		guard = 0;
	} else {
		value = 0;
		guard = 0;
	}
}

Mutex:unlock() {
	while (test_and_set(&guard));
	if (큐에 하나라도 대기중이면) {
		그 중 하나 깨움;
	} else {
		value = 1;
	}
	guard = 0;
}

세마포 (Semaphore)

  • Signal mechanism을 가진 하나 이상의 프로세스/스레드가 임계영역에 접근 가능토록하는 장치
  • 이진 세마포 : 0 / 1 만 갖는 (임계영역에 하나만 들어가는) 세마포
  • 카운팅 세마포 : n(>1) 개의 프로세스/스레드가 동시에 임계영역 접근 하는 세마포
  • 세마포는 순서 정해줄 때 사용
  • wait, signal 이 같은 프로세스에 있을 필요 없음
class Semaphore {
	int value = n;
	int guard = 0;
}

Semaphore::wait() {
	while (test_and_set(&guard));
	if (value == 0) {
		현재 스레드를 큐에 넣음
	} else {
		value -= 1;
		guard = 0;
	}
}

Semaphore::signal() {
	while (test_and_set(&guard));
	if (큐에 하나라도 대기중이면) {
		그 중 하나 깨워 준비시키기;
	} else {
		value += 1;
	}
	guard = 0;
}

동기화 전략 비교

스핀락 vs 뮤텍스

스핀락 < 뮤텍스

  • 싱글코어 환경
    - 락 해제 시 문맥교환이 꼭 필요하기 때문

스핀락 > 뮤텍스

  • 멀티코어 환경
    - 스핀락을 돌고 있는 다른 스레드 덕에 문맥교환이 발생하지 않음
  • 임계영역 작업이 문맥교환(휴식 <-> 재개)보다 빨리 끝남

뮤텍스 != 이진 세마포

뮤텍스이진 세마포
락을 건 놈만 해제 가능세마포는 락을 건놈과 해제하는 놈이 다를 수 있음
Priority Inheritance 속성해당 속성 없음
상호배제만 필요한 경우 유리작업 간 실행 순서 동기화 필요하면 유리

Priority Inheritance

  • 스케줄링 우선순위 (Low, Middle, High)
  • Low P2 이 락을 건 임계영역에 대해서 High P1 이 락 시도
  • P2 의 낮은 우선순위 때문에 P1 이 계속 기다림
  • 뮤텍스에서는 P2 우선순위를 P1 으로 올려서 빨리 처리하도록 함
  • 이것이 우선순위 유전
profile
개발하고 말테야

0개의 댓글