혼공컴운 5주차 기본 미션
뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르시오
- 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
- 세마포는 공유 자원이 여러 개있는 상황에서도 이용할 수 있습니다.
- 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
- 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다. → 세마포에서는 바쁜 대기를 해결하기 위해 대기 상태를 활용한다.
혼공컴운 5주차 심화 미션
임계 구역, 상호 배제 개념 정리 → 하단 12-1 참고
12장 프로세스 동기화
12-1 동기화(Synchronization)
동시 다발적으로 실행되는 프로세스들이 공통의 목적을 위해 서로 협력하여 실행되기 위하여, 실행 순서와 자원의 일관성을 보장하기 위해 동기화가 필요하다.
→ 프로세스 사이의 수행 시기를 맞추는 것
- 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
- 상호 배제(mutual exclusion): 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기 → 생산자와 소비자 문제
- 공유 자원(shared resource): 다양한 대상이 사용할 수 있는 컴퓨터 자원
- 임계 구역(critical section): 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 / 프로세스 둘 중 하나는 대기 필요
- 레이스 컨디션(race condition): 잘못된 실행으로 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우 → 레이스 컨디션 공격
운영체제의 임계 구역 문제 해결
- 상호 배제
- 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면, 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 유한 대기(bounded wating): 한 프로세스가 임계 구역에 진입하고 싶다면, 무한정 대기하는 것이 아닌, 언젠가는 들어갈 수 있어야 한다.
12-2 동기화 기법
뮤텍스 락(Mutex Lock; MUTual EXclusion Lock; 상호 배제 자물쇠)
상호 배제를 위한 동기화 도구
임계 구역에 있음을 알리기 위한 자물쇠를 통해, 자물쇠의 잠금/열림 상태를 통해 임계 구역 접근을 통제한다.
- lock(자물쇠): 프로세스들이 공유하는 전역 변수
- acquire(쟁취하다) 함수: 프로세스가 임계 구역에 진입하기 전에 호출하는 함수
임계 구역이 잠겨 있다면 열릴 때까지 반복적으로 확인하고, 열려 있다면 임계 구역을 (쟁취하여) 잠그는 함수
- 바쁜 대기(busy wait): 임계 구역이 잠겨 있는지 지속적으로 확인하는 것
- release(잠금을 풀다) 함수: 임계 구역에서의 작업이 끝나고 (잠금을 푸는) 함수
세마포(semaphore; 철도 신호기)
공유 자원이 여러개있는 상황에서도 적용 가능한 동기화 도구
(철도 신호기 처럼)멈춤 신호와, 통과 신호를 통해 임계구역을 관리한다.
- 전역 변수 S: 임계 구역에 진입할 수 있는 프로세스의 개수 또는 사용 가능한 공유 자원의 개수를 나타내는 전역변수
- wait 함수: 임계 구역에 멈춤/통과 상태를 알려주는 함수
- singnal 함수: 임계 구역 앞에서 대기하는 프로세스에게 통과를 허용하는 신호를 주는 함수
'바쁜 대기'를 해결하기 위해
사용할 수 있는 자원이 없을 경우 wait 함수가 해당 프로세스를 대기 상태로 만들어서 대기 큐에 집어 넣은 뒤, 다른 프로세스의 작업이 끝나면 signal 함수를 통해 대기 프로세스를 준비 큐로 옮긴다.
실행 순서 제어를 통한 동기화를 위해
- 전역 변수 S를 0으로 둔다.
- 먼저 실행할 프로세스 뒤에 signal 함수를 붙인다.
- 다음에 실행할 프로세스 앞에 wait 함수를 붙인다.
모니터(monitor; 감시)
공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어서 관리하는 도구
프로세스는 반드시 인터페이스를 통해서만 공유자원에 접근하도록 한다. (감시)
조건 변수(conditon variable)를 사용하여 실행 순서를 제어한다.
- 프로세스가 실행 '조건'에 부합하지 않으면 wait 함수로 실행을 중단한다.
- 프로세스가 실행 '조건'이 충족하면 signal 함수를 통해 실행을 재개한다.
13장 교착 상태(Deadlock)
13-1 교착 상태란?
한정된 자원에서 서로가 상대방의 자원을 사용하기 위해 대기하는 상황
→ 식사하는 철학자 문제
교착 상태 발생 조건
상호 배제(Mutual Exclusion)
한정된 자원을 한번에 하나의 프로세스만 이용 가능하기 때문에 발생
점유와 대기(Hold and Wait)
프로세스가 어떤 자원을 할당받은 상태에서 또다른 자원을 할당받기를 기다리는 상태
비선점(non-preemptive)
어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못함
원형 대기
각 프로세스가 순환적으로 다음 프로세스가 사용할 자원을 점유하고 있다.
위의 네 가지 조건을 모두 충족하면 교착 상태가 발생할 가능성이 매우 높다.
13-2 교착 상태 해결 방법
예방
교착 상태 발생 조건 네 가지 중 하나를 충족하지 못하도록 하는 방법
- 상호 배제 예방: 모든 자원을 공유 가능
→ 현실적으로 불가능
- 점유와 대기 예방: 자원을 프로세스에 모두 할당하거나, 아예 할당하지 않는다
→ 자원의 이용률이 낮아진다.
→ 많은 자원을 사용하는 프로세스의 타이밍을 확보하기 어렵다.
- 비선점 조건 예방: 자원을 이용 중인 프로세스로 부터 자원을 빼앗는다.
→ 한 프로세스가 끝날때 까지 대기해야하는 자원도 있으므로 범용적이지 않다.
- 원형 대기 예방: 자원에 우선순위를 매긴다
→ 수많은 자원에 우선순위를 매기기 어렵다
→ 자원에 매긴 우선순위로 인해 자원의 활용률이 떨어질 수 있다.
회피
교착 상태는 한정된 자원의 무분별한 할당에 의해 발생하므로, 교착 상태가 발생하지 않을 정도로만 자원을 할당하는 방법
- 안전 상태(safe state): 모든 프로세스가 정상적으로 자원 할당 및 종료가 가능한 상태
- 불안전 상태(unsafe state): 교착 상태가 발생할 수 있는 상태
- 안전 순서열(safe sequence): 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
→ 운영체제는 시스템 상태가 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당한다. (항시 안전 상태 유지)
검출 후 회복
교착 상태 발생을 인정하고 사후에 조치하는 방식
선점을 통한 회복
교착 상태가 해결될 때 까지 한 프로세스씩 자원을 몰아주는 방식(강제 독점)
프로세스 강제 종료를 통한 회복
교착 상태에 놓인 모든 프로세스를 종료하거나(작업 내용 손실 위험),
교착 상태가 없어질 때까지 한 프로세스식 종료(교착 상태 확인 과정에서 오버헤드 발생)하는 방식
무시
교착상태를 아예 무시한다. → 타조 알고리즘(ostrich algorithm)