[운영체제] 동기화를 위한 스핀락(Sprinlock), 뮤텍스(mutex), 세마포어(senaphore)

강민승·2023년 7월 31일
0

운영체제

목록 보기
11/18

용어 정리!

Race condition (경쟁 조건)

  • 여러 프로세스/스레드가 동시에 같은 데이터를 조작할 때 타이밍이나 접근 순서에 따라 결과가 달라질 수 있는 상황

synchronization (동기화)

  • 여러 프로세스/스레드를 동시에 실행해도 공유 데이터의 일관성을 유지하는 것

critical section(임계 영역)

  • 공유 데이터의 일관성을 보장하기 위해 하나의 프로세스/스레드만 진입해서 실행 가능한 영역 = mutual exclusion

그럼 어떻게 mutual exclusion을 보장할 수 있을까?
-> lock을 활용하자!

do{
	acquire lock
    	critical section
    release lock
    	remainder section
} while (true)

Spin Lock

volatile int lock = 0;

void critical() {
	while(test_and_set(&lock) ==1);
    ...critical section	
    lock = 0;
}

int test_and_set(*int lockPtr){
	int oldLock = *lockPtr;
    *lockPtr = 1;
    return oldLock;
}

이럴 때 만약 T1, T2가 있다고 가정하고 test_and_set을 동시에 실행시키면 동시에 critical section에 들어가지 않을까? 하는 의문이 들수도 있는데 이때 CPU 의 atomic 명령어인 test_and_set은 원자성을 유지하기 때문에 괜찮다!

원자성

  • 실행 중간에 간섭받거나 중단되지 않는다.
  • 같은 메모리 영역에 대해 실행되지 않는다.

즉, 스핀락은 락을 가질 수 있을 때까지 반복해서 시도!
하지만 기다리는 동안 CPU 낭비 심해..!

그래서 뮤텍스를 한 번 보자!

Mutex

뮤텍스는 락을 가질 수 없다면 큐에 넣어서 기다리고 락을 가지고 있을 때 프로세스를 깨워서 락을 가지게 하는 것이다. 즉, 락을 가질 수 있을 때까지 쉬는 것이다.

그렇다면! 뮤텍스가 스핀락보다 항상 좋은가?
좋은 경우도 있다!

  • 멀티코어 환경이도 critical section에서의 작업이 context switching보다 더 일찍 끝난다면 이점이 있다!

Semaphore

signal mechanism을 가진 하나 이상의 프로세스 혹은 스레드가 critical section에 접근 가능하도록 하는 장치

profile
Step by Step goes a long way. 꾸준하게 성장하는 개발자 강민승입니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

이런 유용한 정보를 나눠주셔서 감사합니다.

답글 달기