////
Search
Duplicate

공유자원과 임계 영역 - 현구

공유자원

공유자원이란 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수 등을 의미 ex) 모니터, 프린터, 메모리, 파일, 데이터
공유자원을 두 개 이상의 프로세스(스레드)가 동시에 읽거나 쓰는 상황을 경쟁 상태(race condition)이라고 함 동시에 접근을 시도 할 때 접근의 타이밍이나 순서 등이 결괏값에 영향을 줄 수 있는 상태 ex) 책의 예시, 우리 프로젝트에서의 좋아요, 티켓팅, 은행 입출금 등등

임계 영역

둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
임계 영역을 해결하기 위한 방법으로는 뮤텍스, 세마포어, 모니터가 있음(lock 매커니즘을 토대로함)
위 방법 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족함
상호배제(mutual exclusion) - 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다. 한정 대기(bounded waiting) - 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안된다. 융통성(progress) - 만약 어떠한 프로세스도 임계 영역을 사용하지 않는다면 임계 영역 외부의 어떠한 프로세스도 들어갈 수 있으며 이 때 프로세스끼리 서로 방해하지 않는다.
Plain Text
복사

뮤텍스

프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해제하는 객체 → 동시에 하나의 프로세스나 스레드만 공유자원을 점유하도록 보장
잠금 또는 잠금 해제라는 상태만을 가짐
장점
단순하고 이해하기 쉬우며, 임계 영역 접근을 엄격하게 제어할 수 있음
단점
데드락(Deadlock) 발생 가능성이 있으며, 스레드가 뮤텍스를 잡고 있을 때 다른 스레드는 대기 상태가 되어 자원 활용도가 낮아질 수 있음

세마포어

세마포어는 일반화된 뮤텍스
간단한 정수 값과 wait(P함수), signal(V함수)함수로 공유 자원에 대한 접근을 처리
wait()은 자신의 차례가 올 때까지 기다리는 함수(0 < 세마포어 값 이면 세마포어 값 -1, 자원에 접근)
signal()은 다음 프로세스로 순서를 넘겨주는 함수(공유자원의 사용을 마치면 세마포어 값 +1)
작동원리
세마포어는 원자적(Atomic)으로 제어되는 정수 변수로, 일반적으로 세마포어의 값이 0이면 자원에 접근할 수 없도록 블럭(Block) 하고 0보다 크면 접근함과 동시에 세마포어의 값을 1 감소시킴
반대로 종료하고 나갈 때에는 세마포어의 값을 1 증가시켜 다른 프로세스가 접근할 수 있도록 함

바이너리 세마포어

0과 1의 두 가지 값만 가질 수 있는 세마포어
뮤텍스와 유사한 방식으로 작동
뮤텍스와 차이점은 뮤텍스는 lock기반의 잠금 매커니즘, 바이너리 세마포어는 신호 기반의 신호 매커니즘
장점
뮤텍스와 마찬가지로 상호 배제를 제공
구현이 간단하며, 운영 체제 수준에서 지원
단점
뮤텍스와 유사하게 데드락 위험이 있으며, 우선순위 역전 문제가 발생할 수 있음

카운팅 세마포어

카운팅 세마포어는 여러 개의 값을 가질 수 있는 세마포어
공유 자원에 대한 동시 접근이 가능한 개수를 제한 ex) 세마포어의 값이 3이라면 최대 3개의 스레드가 동시에 공유 자원에 접근할 수 있음
장점
다수의 스레드가 동시에 공유 자원에 접근할 수 있어 자원 활용도가 높음
단점
올바른 세마포어 값 설정이 어렵고, 데드락과 같은 동기화 문제를 완전히 해결하지 못할 수 있음

모니터

세마포어를 사용하기 위해서는 임계 구역에 명시적으로 상호 배제 로직을 구현함
모니터는 이 상호 배제 로직을 추상화하고, 공유 자원 접근에 대한 인터페이스만을 제공
공유 자원도 외부로부터 캡슐화하여 숨김 → 세마포어에 비해 좀 더 고수준이라고 할 수 있음
모니터는 모니터큐에 작업을 순차적으로 쌓아두고, 한번에 한 프로세스/쓰레드만 임계 영역에 접근할 수 있도록 함 → 한번에 하나의 프로세스만 모니터에서 활동할 수 있도록 보장
개념적으로는 이진 세마포어의 기능을 제공하는 것
ex) JAVA의 Syncronized 키워드
장점
뮤텍스나 세마포어보다 추상화 수준이 높아 사용하기 쉬움, 실수가 줄어듦
데드락을 방지하는 추가적인 메커니즘을 제공할 수 있습니다.
단점
모니터를 지원하지 않는 프로그래밍 언어나 환경에서는 사용하기 어려움
성능 저하가 발생할 수 있으며, 설계가 복잡해질 수 있음