임계 영역과 락
- 고전적인 예 : 공유 변수 갱신
- 락을 이용한 임계 영역 처리


- mutex_lock 부분을 exit 사용
- 초기화 해줘야 함!!! 아니면 -1 반환됨
락 변수
- 락의 상태를 저장
- 사용 가능
- 사용 중
- 정확히 하나의 쓰레드가 락을 획득하여 임계 영역에 진입한 상태
- 락 함수
- 락 변수의 상태를 보고 사용 중이면 대기, 사용 가능하면 락을 획득하여 임계 영역으로 진입(1개만)
- 락의 치밀도
- 락의 사용 범위와 개수
- 예 : 여러 개의 공유 변수와 임계 영역이 있을 때 락 변수는 몇 개를 사용할까?
- Coarse-grained lock (각각 하지 않고 전체 락 걸어버림) (단순함)
- 적은 수의 락으로 넓은 범위의 임계 영역 처리
- Fine-grained lock (병렬성이 좋음) (효율성을 높이고 싶을 때 사용)
- 많은 수의 락으로 작은 임계 영역을 각각 처리
핵심 질문
- lock()/unlock() 함수는 어떻게 만드는가?
- 어떤 하드웨어 지원이 필요한가
- 어떤 운영체제 지원이 필요한가
- 만들어진 락은 무엇을 기준으로 평가하는가
- 상호 배제 : 한번에 하나의 쓰레드만 임계 영역 진입 보장
- 공정성 : 모든 쓰레드가 공정하게 락을 획득할 기회를 얻는가
- 시아 상태에 빠지는 쓰레드가 있을 위험이 완전히 배제되는가
- 아무도 락을 획득하지 못하는 무한 대기 상태에 빠지지 않는가
- 성능 : 락을 사용하는데 드는 시간적 오버헤드를 최소화할 수 있는가
임계 영역에서 인터럽트 비활성화
- 초창기 단일 프로세서 시스템의 해결책 중 하나
void lock() {
disableinterrupts();
}
void unlock(){
enableinterrupts();
}
- 문제점
- 이것도 특권 명령임
- 멀티프로세서에 적용 불가
- 최신 CPU에서 인터럽트 비활성화는 느리다
- SW 알고리즘만으로 락 구현 시도