Critical Section(임계영역)
- 멀티 스레딩에 문제점에 나오듯, 동일한 자원을 동시에 접근하는 작업(공유하는 변수, 공용메모리 등)을 실행하는 코드 영역을 말한다.
임계 영역문제
- 프로세스들이 임계 영역을 함께 사용할 수 있는 프로토콜을 설계하는 것.
- 해결을 위한 기본조건
-- Mutual Exclusion ( MUTEX ) 상호배제:
어느 한 프로세스가 임계영역에서 코드가 실행중이라면, 다른 프로세스들은 그들이 가진 임계영역에서 실행될 수 없다. (일관성)
-- Progress(진행):
임계영역에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 임계영역 진입 후보로서 참여 될 수 있다.
-- Bounded waiting(한정된 대기):
어느 한프로세스가 임계영역에 진입 신청 후 부터 받아들여질 때까지 무한정 기다리면 안된다. 즉, 한정된 대기시간을 가져야한다.
- 해결책
-- LOCK :
하드웨어 기반 해결책으로, 동시에 공유자원에 접근하는 것을 막기 위해 CS에 진입하는 프로세스는 LOCK을 흭득하고 CS를 빠져나올때, LOCK을 반납함으로써 동시에 접근이 되지 않도록 한다.(하나밖에 없는 화장실 키)
-- Semaphore :
소프트웨어상에서 cs문제를 해결하기 위한 동기화 도구.
- 세마포어의 종류
-- 카운팅 :
가용한 개수를 가진 자원에 대한 접근 제어용으로 사용되며, 세마포어는 그 가용한 자원의 개수로 초기화 된다. 자원을 사용하면 -, 반납하면 +
-- 이진방식 :
MUTEX라고도 부르며, 상호배제(MUTUAL EXCLUSION)에서 파생된 말이다. 이름 그대로 0과 1사이의 값만 사용가능. 다중 프로세스 사이의 CS 문제를 해결하기 위해 사용된다.
-- 단점 :
Busy Waiting 바쁜대기
SPIN LOCK 이라고 불리는 세마포어 초기버전에서 CS에 진입해야하는 프로세스는 진입 코드를 계속 반복 실행 해야해서 CPU의 자원을 낭비했었다. 이를 BUSYWAITING 이라고 하며 비효율적인 방법이다. 일반적으로 세마포어에서 CS에 진입을 시도했지만 실패한 프로세스에 대해 BLOCK시킨 뒤, CS에 자리가 날 때 다시 깨우는 방식을 사용한다.
이경우 BUSY WAITING으로 인한 시간낭비가 해결.
데드락
세마포어가 레디큐를 가지고 있고, 둘 이상의 프로세스가 CS진입을 무한정 기다리면서 CS에서 실행되고 있는 프로세스는 진입 대기 중인 프로세스의 진입신호를 무한정 기다리고 있는 상황.
모니터
- 고급언어의 설계 구조물로서, 개발자의 코드를 상호배제 하게 끔 만든 추상화된 데이터형태.
- 공유자원에 접근하기 위한 키 흭득과 자원 사용 후 해제를 모두처리(세마포어는 직접 키 해제와 공유 자원 접근처리가 필요.)