
📃 기본 미션
p.363, 확인 문제 1번 ) 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.
① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
② 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
③ 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
④ 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.
🖍 ) ④, 프로세스를 대기 상태로 변경하여 CPU 사이클에서 제외하는 방법도 존재한다.
📃 선택 미션
Ch.12 (12-1) 임계 구역, 상호 배제 개념을 정리하기
🖍 )
임계 구역 : 레이스 컨디션이 발생할 수 있는 코드 영역
상호 배제 : 특정 프로세스가 공유자원을 사용하고 있을 경우, 다른 프로세스가 해당 공유자원을 사용하지 못하게 배제하는 기법,
프로세스들이 번갈아가며 자원을 사용하게끔 임계 구역에 한 프로세스의 입장을 허락하게 함
1️⃣2️⃣ 프로세스 동기화
12-1 동기화란
동기화의 의미
- 공동의 목적을 위해 동시에 수행되는 프로세스는 서로 데이터를 주고받으며 협력하며 실행될 수 있다.
- 자원의 일관성을 보장하기 위해서 (프로세스) 동기화가 필수적이다.
- 프로세스들의 수행 시기를 맞추는 것을 동기화라고 한다.
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
- 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
- 실행의 문맥을 갖는 모든 대상은 동기화 대상이기에 스레드도 동기화 대상이다.
실행 순서 제어를 위한 동기화 : reader writer problem
- Writer : Book.txt 파일에 값을 저장하는 프로세스
- Reader : Book.txt 파일에 저장된 값을 읽어들이는 프로세스
- Wirter 프로세스와 Reader 프로세스가 무작정 실행되면? ➡️ 😱
- 실행의 순서를 지켜 실행 될 경우 의도성을 가진채로 실행 가능 (예외적인 상황 발생을 억제할 수 있다)
- ex) Reader 프로세스는 ‘Book.txt 안에 값이 존재한다’는 특정 조건이 만족되어야만 실행 가능
상호 배제를 위한 동기화 : Bank account problem
- 공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화
- 한번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화
- 하나의 프로세스에서 자원에 접근 중일때 같은 자원을 접근하는 나머지 프로세스는 대기하여야 한다.
- ex) 은행 계좌의 조작 프로세스 (계좌의 값을 읽어들여서 계산 후 저장하는 과정에서 동기화가 이루어지지 않으면 예상치 못한 값이 저장될 수 있다.)
상호 배제를 위한 동기화 : Producer & Consumer problem
- 물건을 계속해서 생산하는 생산자 (producer, 프로세스 혹은 스레드)
- 물건을 계속해서 소비하는 소비자 (consumer, 프로세스 혹은 스레드)
- ‘총합’ 변수를 공유
- 생산자와 소비자를 무작정 100,000번 실행하면 총합의 변수 값이 10이 아닌 예상 밖의 값이 된다.
- 동기화가 되지 않았기 때문에 발생한 문제로 동시에 접근해서는 안되는 자원(총합)에 동시에 접근해서 발생한 문제
공유 자원(shared resource)과 임계 구역 (critical section)
- 공유 자원 : 여러 프로세스 혹은 스레드가 공유하는 자원 (ex : 전역 변수, 파일, 입출력장치, 보조기억장치, …)
- 임계 구역 : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 (ex : 예시의 ‘총합’ 변수, ‘잔액’ 변수,…)
- 임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다. (동기화를 위해)

- 레이스 컨디션(race condition) : 임계 구역에 동시에 접근하여 자원의 일관성이 깨지는 상태
- 즉 레이스 컨디션이 발생할 수 있는 코드 영역을 임계 구역이라고 한다.
운영체제가 임계구역 문제를 해결하는 세 가지 원칙
(’상호 배제를 위한 동기화’를 지키기 위한 세 가지 원칙)
- 상호 배제 (mutual exclusion)
- 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.
- 진행 (progress)
- 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세는 들어갈 수 있어야 한다.
- 유한 대기 (bounded waiting)
- 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다
- 임계 구역에 들어오기 위해 무한적 대기해서는 안 된다.
12-2 동기화 기법
뮤텍스 락 (Mutex lock)
- 상호 배제를 위한 동기화 도구(자물쇠 역할)
- 뮤텍스 락의 단순한 형태 : 전역 변수 하나, 함수 두 개
- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 Lock
- 임계 구역을 잠그는 역할 : acquire 함수
- 임계 구역의 잠금을 해제하는 역할 : release 함수
- acquire 함수
- 프로세스가 임계 구역에 진입하기 전에 호출
- 임계 구역이 잠겨 있다면 ➡️ 임계 구역이 열릴 때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인한다.
- 임계 구역이 열려 있다면 ➡️ 임계 구역을 잠근다 (lock을 true로 바꾸기)
- release 함수
- 임계 구역에서의 작업이 끝나고 호출
- 현재 잠긴 임계 구역을 열기 (lock을 false로 바꾸기)
✅ 바쁜 대기 (busy waiting) : lock이 잠겨있는지 계속 확인해보는 것 ➡️ 좋은 방식은 아님

세마포 (Semaphore)
- 좀 더 일반화된 방식의 동기화 도구
- 뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식 ↔️ 세마포는 공유 자원이 여러 개 있는 경우에도 적용 가능한 방식
- 세마포의 종류로 이진 세마포 (binary semaphore), 카운팅 세마포 (counting semaphore)가 있지만, 이진 세마포는 뮤텍스 락과 비슷한 개념이고 일반화된 개념인 카운팅 세마포를 중점으로 본다.
- 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기
- 임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
- 세마포의 단순한 형태 : 전역 변수 하나, 함수 두 개
- 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
- 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
- 임계구역 앞에서 기다리는 프로세스에 ‘이제 가도 좋다’고 신호를 주는 signal 함수
- 허용된 S의 값으로 프로세스 실행이 결정 된다.

✅ Mutex lock 과 동일하게 busy waiting 이다. ➡️ CPU 사이클 낭비
해결 방법
사용할 수 있는 자원이 없을 경우 대기 상태로 만듦, CPU 사이클이 필요없는 상태 (해당 프로세스의 PCB를 대기 큐에 삽입) 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)
세마포를 활용한 실행 순서 동기화
- 세마포의 변수 S를 0으로 두고,
- 먼저 실행할 프로세스 뒤에 signal 함수
- 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 된다.
모니터
- 사용자(개발자)가 다루기 편리한 동기화 도구
- 상호 배제를 위한 동기화
- 인터페이스를 위한 큐
- 공유자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
- 큐에 삽입된 순서대로 (한 번에 하나의 프로세스만) 공유 자원 이용

- 실행 순서 제어를 위한 동기화
- 조건 변수 (condition variable) 이용
- 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
- 조건변수.wait() : 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
- 조건변수.signal() : wait()으로 대기 상태로 접어든 조건변수를 실행 상태로 변경

- 모니터 안에는 하나의 프로세스만이 있을 수 있다.
- wait()를 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개하는 방법
- signal()을 호출했던 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개하는 방법
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
- 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.
1️⃣3️⃣ 교착 상태
13-1 교착 상태란

교착상태
- 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상
- 프로세스들이 서로가 점유한 자원을 기다리고 멈춰 ✋!!! 하고 있음
교착 상태를 해결하기 위해서는?
- 교착 상태가 발생했을 때의 상황을 정확히 표현해보기
- 교착 상태가 일어나는 근본적인 이유를 이해하기
자원 할당 그래프
- 교착 상태 발생 조건 파악 가능
- 어떤 프로세스가 어떤 자원을 할당 받아 사용 중인지 확인 가능
- 어떤 프로세스가 어떤 자원을 기다리고 있는지 확인 가능
- 자원 할당 그래프 그리는 방법
- 프로세스는 원으로, 자원의 종류는 사각형으로 표현
- 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현
- 프로세스가 어떤 자원을 할당 받아 사용 중이라면 자원에서 프로세스를 향해 화살표를 표시
- 프로세스가 어떤 자원을 기다리고 있다면 프로세스에서 자원으로 화살표를 표시
- 교착 상태가 일어난 그래프의 특징
- 자원 할당 그래프가 원의 형태를 띄고 있다.
교착 상태 발생할 조건
- 상호 배제 : 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태
- 점유와 대기 : 자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다리는 상태
- 비선점 : 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태
- 원형 대기 : 프로세스들이 원의 형태로 자원을 대기하는 상태
- 네 가지 조건 중 하나라도 만족하지 않으면 교착 상태가 발생하지 않음
- 네 가지 조건을 모두 만족하면 교착 상태가 발생할 수 있음
13-2 교착 상태 해결 방법
교착 상태 해결
- 예방
- 회피
- 검출 후 회복
교착 상태 예방
- 애초에 교착 상태가 발생하지 않도록 한다.
- 교착 상태 발생 조건(상호 배제, 점유와 대기, 비선점, 원영 대기) 중 하나를 없애버리기
- 상호 배제를 없애면… : 모든 자원을 공유하게 만든다? ➡️ 현실적으로 불가능
- 점유와 대기를 없애면… : 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분 ➡️ 자원의 활용률이 떨어질 수 있음
- 비선점 조건을 없애면… : 선점이 가능한 자원 (CPU)에 한해서 효과적 ➡️ 모든 자원이 선점 가능한 것은 아니다.
- 원형 대기 조건을 없애면… : 모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하는 방식 ➡️ 모든 자원에 번호를 붙이는 것이 어려움, 어떤 자원에 어떤 번호를 붙이느냐에 따라 자원 활용률이 달라짐
- 교착 상태 해결을 위한 예방은 교착 상태가 발생하지 않음은 보장할 수 있으나 부작용이 따라온다.
교착 상태 회피
- 교착 상태를 무분별한 자원 할당으로 인해 발생했다고 간주 (포크가 무제한이라면 교착 상태가 발생하지 않는다)
- 교착 상태가 발생하지 않을 만큼 조심스럽게 할당하기
- 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 만큼만 자원 배분
- 안전 순서열 : 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
- 안전 상태 : 교착 상태 없이 모든 프로세스가 자원을 할당 받고 종료될 수 있는 상태 (안전 순서열이 있는 상태)
- 불안전 상태 : 교착 상태가 발생할 수도 있는 상태 (안전 순서열이 없는 상태)
- 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당하는 방식
- 항시 안전 상태를 유지하도록 자원을 할당하는 방식
- 추가 학습 : 은행원 알고리즘
교착 상태 검출 후 회복
- 교착 상태의 발생을 인정하고 사후에 조치하는 방식
- 프로세스가 자원을 요구하면 일단 할당, 교착 상태가 검출되면 회복
- 검출 후 회복 방식 2가지
- 선점을 통한 회복
- 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식
- 프로세스 강제 종료를 통한 회복
- 교착 상태에 놓인 프로세스 모두 강제 종료 (작업 내역을 잃을 위험이 존재한다)
- 교착 상태가 해결될 때까지 한 프로세스씩 강제 종료 (교착 상태가 없어졌는지 확인하는 과정에서 오버헤드 발생)
- 선점을 통한 회복
교착 상태 무시
- 타조 알고리즘 : 드물게 발생하는 잠재적 문제를 무시로 대처하는 방식
- 문제 발생의 빈도나 심각성에 따라 때때로 적합한 방식일 수도 있다.
주절주절 : 📖 ➡️ 👀 ➡️ 🤯 ➡️ ☠️ ➡️ 👻 ➡️ 📖
'혼공컴운' 카테고리의 다른 글
혼자 공부하는 컴퓨터 구조+운영체제 6주차 (14~15) (0) | 2023.02.19 |
---|---|
혼자 공부하는 컴퓨터 구조+운영체제 4주차 (9~11) (0) | 2023.02.05 |
혼자 공부하는 컴퓨터 구조+운영체제 3주차 (6~8) (0) | 2023.01.24 |
혼자 공부하는 컴퓨터 구조+운영체제 2주차 (4~5) (0) | 2023.01.15 |
혼자 공부하는 컴퓨터 구조+운영체제 1주차 (1~3) (0) | 2023.01.08 |