공유자원
•
공유자원이란 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수 등을 의미
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 키워드
•
장점
◦
뮤텍스나 세마포어보다 추상화 수준이 높아 사용하기 쉬움, 실수가 줄어듦
◦
데드락을 방지하는 추가적인 메커니즘을 제공할 수 있습니다.
•
단점
◦
모니터를 지원하지 않는 프로그래밍 언어나 환경에서는 사용하기 어려움
◦
성능 저하가 발생할 수 있으며, 설계가 복잡해질 수 있음