락(lock)은 바로 앞에서 배운 동기화를 보장하는 툴(tool)입니다
그래서 매우 중요한 개념이고 이번 영상에서는 세 가지 종류의 락을 배우게 됩니다
참고로 뮤텍스 락은 그 개념 정의가 상당히 넓고 모호합니다
인터넷을 검색해 봐도 뮤텍스를 정의하는 방식이 천차만별이라 저도 제 다름대로 가장 이해하기 쉬운 방식으로 뮤텍스의 개념을 정리하게 됐습니다.
mutual exclusion : 하나의 프로세스/스레드만 critical section에 진입
어떻게 mutual exclusion을 보장 할 수 있을까? 락(lock)을 사용하자!
락을 획득한 프로세스/스레드만 critical section에 진입이 가능하다.
교착상태 : 하나의 스레드가 다른 스레드의 작업이 끝날때까지 기다리는 상태
여러 스레드가 lock과, critical() 메서드에 접근이 가능하다.
while() loop를 탈출한 스레드만 critical section에 들어와서 기능을 수행한다.
선 진입한 스레드1이 TestAndSet() 메서드 호출 후 lock값은 1로 리턴시키고, 스레드2가 while문을 통해 메서드가 계속 실행되고 lock값은 1이기 때문에 계속해서 while문에 머무른다.
기존 스레드1이 critical section을 나가면서 lock값을 0으로 만든 순간 while문 조건이 false가 되기 때문에 스레드2가 critical section에 진입한다.
TestAndSet : CPU의 도움을 받는 atomic 명령어
atomic 명령어의 특징
실행 중간에 간섭받거나 중단되지 않는다.
같은 메모리 영역에 대해 동시에 실행되지 않는다.
즉, 스레드1과 스레드2가 동시에 TestAndSet에 접근하여 같이 critical section에 진입하는것을 방지한다.
스레드1이 작업중 컨텍스트 스위칭이 발생하는것을 방지한다.
기다리는동안 (while문에서 락을 획득하기위해) CPU를 낭비한다.
하나의 스레드가 critical section에 존재하다가 critical section이 비게 되면 실행시킨다. 락을 가질 수 있을 때 까지 휴식한다.
guard값을 확인하여 락을 획득한다.
value값이 0이면 다른 스레드가 락을 획득한 상태, 0일 경우 스레드는 큐에 자기 자신을 넣어 대기하게 된다.
락을 획득한 스레드가 critical section을 나가게 될때 unlock()메서드를 통해 큐에 값이 존재하면 그중에 하나를 깨우고, 스레드는 unlock() 메서드를 끝을 낸다.
큐에 값이 없으면 value를 1로 초기화하여 다른 스레드가 lock을 획득할 수 있게 설정한다.
핵심 :
어떤 스레드가 락을 갖기위해 value를 확인. value값이 0이면 큐에 넣어 cpu사이클 낭비 최소화
atomic명령어사용
싱글코어에서 스핀락으로 대기 후 락을 획득하면 컨텍스트 스위칭이 필요하다. T1에서 락 해제 후 T2로 컨텍스트 스위칭이 생기고, T2는 락을 이때 확인하기 때문에, 싱글코어에서는 스핀락의 이점이 전혀 없다.
듀얼코어에서 T1이 critical section에서 작업중이면, T2는 락을 계속해서 확인하고 있고, T1이 종료하면서 락을 반환 후 다른 코어에서 계속해서 락을 확인하고 있던 T2는 바로 critical section으로 진입 가능하다. 컨텍스트 스위칭이 발생하지 않는다.
signal mechanism을 가진, 하나 이상의 프로세스/스레드가 critical section에 접근 가능하도록 하는 장치.
★세마포는 하나 이상의 스레드가 critical section에 접근가능하고, 순서를 부여할 수 있다.
프로세스/스레드가 critical section에 진입하면서 wait()을 실행시키고, critical section을 나올때 signal()을 실행시킨다.
task1이 끝나야만 task3가 실행된다.
task2에서 wait를 먼저 실행하면 value가 0이기 때문에 큐에 들어가서 대기하다가
task1에서 value값을 1로 변경해줘야 task3가 실행된다.
뮤텍스는 락을 가진 자만 락을 해제 할 수 있지만, 세마포는 그렇지 않다.
뮤텍스는 priority inheritance 속성을 가지지만, 세마포는 그 속성이 없다.
:여러 프로세스/스레드가 동시에 실행 > CPU : 컨텍스트 스위칭 > 누구를 먼저 실행시킬지 스케줄링이 필요하다.
우선순위가 낮은 프로세스2가 먼저 락을 획득하고 critical section에서 일을 수행하면 우선순위가 높은 프로세스1은 락을 획득하지 못한다. 만약 프로세스2가 일을 수행하다가 컨텍스트 스위칭이 발생하면, 프로세스2는 아직 안끝났기 때문에 락을 반환하지 않는다.
컨텍스트 스위칭이 발생하여 프로세스3,4가 작업을 수행한다 가정한다.
따라서 우선순위가 높음에도 프로세스2가 완전히 끝날때 까지 대기한다.
프로세스1이 critical section으로 들어가게 하기 위해 프로세스2의 우선순위를 프로세스1만큼 올려 프로세스1,2외 다른 프로세스보다 빨리 끝나게 한다.