저번 글에선 소프트웨어 동기화 솔루션으로 피터슨 알고리즘을 배웠으며, 하드웨어로는 set_and_set, compare_and_swap인 하드웨어 instruction으로 atomic variable이 필요함을 배웠습니다.
복잡한 알고리즘인 아닌 high level에서의 소프트웨어 툴로 임계 영역 문제를 해결하는 뮤텍스와 세마포어를 정리해봅니다.
Mutex가 무엇인지 아시나요??
뮤텍스는 가장 단순한 동기화 도구입니다. 뮤텍스는 mutual exclusion입니다.
race condition의 막고 임계영역을 보호할 수 있습니다.
임계영역에 들어가기 전에 락을 획득하고 임계영역에서 나올 때 락을 해제합니다.
접근 권한을 획득할 때까지 busy waiting상태에 머무르지 않고 sleep 상태로 들어가며 wake되면 다시 권한을 획득을 시도합니다.
뮤텍스는 Locking 매커니즘으로 오직 하나의 스레드만이 동일 시점에 뮤텍스를 임계 영역에 접근할 수 있습니다.
저번에 배웠던 lock이랑 같은거 아닌가요??
저번에 배운 lock하려고 하면 누가 임계영역을 사용 중이라면 무한정 대기라는 busy waiting이라는 것을 하는 일명 spin lock이라고 부릅니다.
busy waiting의 문제가 무엇인가요??
busy waiting은 락을 획득하기 위해서 무한정 대기를 하게 됩니다. 멀티 프로세싱 환경에서는 반드시 문제가 발생합니다.
만약 싱글 CPU 코어를 사용하게 된다면, 락을 획득할 때까지 CPU가 쓸 때 없이 while문만 돌게 되는 것입니다. 그래서 CPU를 효율적으로 활용하지 못하여 다른 프로세스가 생산적이지 못합니다.
하지만, 콘텍스트 스위칭이 발생하지 않고 락을 기다리기 때문에 콘텍스트 스위칭의 시간을 줄일수도 있는 장점이 존재하기에 무조건 나쁘다고 할 순 없습니다.
Sempahore가 무엇인지 아시나요??
세마포어는 가장 보편적인 동기화 도구입니다.
스핀락과 뮤텍스와는 다르게 하나 이상의 스레드가 공유자원에 접근할 수 있도록 할 수 있습니다. 표현형은 정수로 표현하며 lock과 unlock이 아닌 값을 올리고 내리는 방식입니다.
특정 자원에 접근할 때 P()가 먼저 호출 되어 임계 구역에 들어갈 수 있는지 확인하고 조건에 만족하게 되면 P()에서 나와 임계 구역에 들어가게 되고 이후 V()을 통해 임계 구역을 빠져나옵니다.
P() : 세마포어의 값을 감소합니다. 음수가 되면 호출한 스레드는 블록되지만 음수가 아니라면 스레드는 작업을 수행합니다.
V() : 세마포어의 값을 증가시킵니다. 양수라면 블록된 스레드를 wake 시킵니다.
Sempahore 문제점은 무엇인가요??
P() 수행 후 V()을 수행하지 않으면, 현재 프로세스가 임계영역을 빠져나갈 수 없게 됩니다. 그럼 다른 프로세스들은 임계구역에 들어갈 수 없으므로 데드락이 발생합니다.
Mutex와 Sempahore의 차이를 아시나요??
세마포어는 여러 개의 스레드가 접근할 수 있는 반면 뮤텍스의 경우 오직 1개의 스레드만 접근가능합니다. 그래서 일종의 이진 세마포어라고 부릅니다.
세마포어는 수행 중인 아닌 다른 스레드가 세마포어를 해제할 수 있지만 뮤텍스는 획득과 해제하는 주체가 동일해야합니다.
'운영체제' 카테고리의 다른 글
철학자들의 저녁식사 문제 (0) | 2021.08.11 |
---|---|
모니터 (0) | 2021.08.10 |
동기화 문제 해결책(2) (0) | 2021.08.09 |
동기화 문제 해결책(1) (0) | 2021.08.09 |
프로세스 동기화 (0) | 2021.08.09 |