혼공학습단 10기 - 혼공컴운 (5주차)
5주 차 목표
# | 진도 | 기본 미션 | 선택 미션 |
5주차 (8/7 ~ 8/13) |
Chapter 12 ~ 13 | p. 363의 확인 문제 1번 풀고 인증하기 | Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기 |
퇴사하고 조금 쉬다가...
이번 주부터 국비학원에 다니고 있다 보니
공부할 시간이 정말 없어서 참 힘들었다 (세미 직장인 시간표ㅜㅜ)
그래도 이제 다음 주가 마지막 주니까 열심히 해서 꼭 완주하자~ 파이팅!
기본 미션
p.363 확인 문제 1번
Q. 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.
1. 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
2. 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
3. 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
4. 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.
A. 4
해설
바쁜 대기를 이용하는 대신에 해당 프로세스를 wait()로 대기 상태, signal()로 준비 상태로 만드는 방법도 존재한다.
선택 미션
Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기
임계 구역
임계 구역의 개념을 정리하기 위해선 먼저 공유 자원에 대한 이해가 필요하다.
공유 자원이란, 여러 프로세스(& 스레드)가 접근할 수 있는 공동의 자원을 지칭하는 것으로 전역 변수, 입출력 장치, 보조기억장치, 파일 등이 존재한다.
공유 자원은 동시에 접근할 경우 문제가 발생하는 경우도 있는데, 임계 구역은 이러한 공유 자원에 접근하는 코드 영역을 말한다.
상호 배제
위와 같이 동시에 접근해서는 안 되는 자원에(임계 구역에) 한 번에 한 프로세스만 접근하도록 하는 것을 말한다.
메모
12 - 1 동기화란
1. 공동의 목적을 위해 동시에 수행되는 프로세스(& 스레드)들은 실행 순서와 자원의 일괄성을 보장하기 위해 동기화(synchronization)되어야 한다.
- 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기. 예를 들어 파일이 쓰이기 전에 읽으려고 하는 경우 문제가 생기기 때문.
- 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기. 같은 잔액 데이터에 접속할 때 변동된 잔액의 데이터가 저장되기 전에 문맥 교환이 일어나, 다음 프로세스가 잘못된 잔액 데이터에 접근하면 안 된다.
2. 여러 프로세스 혹은 스레드가 공유하는 자원(전역 변수, 파일, 입출력장치, 보조기억장치...)을 공유 자원(shared resource)이라 하며, 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section)이라 한다.
- 임계 구역에 먼저 진입한 프로세스의 작업이 마무리되어야 기다리던 프로세스가 임계 구역에 진입한다.
- 임계 구역에 동시에 접근하면 자원의 일괄성이 깨질 수 있는데 이를 레이스 컨디션(race condition)이라고 한다.
- 고급 언어에서는 소스코드 한 줄로 보이더라도, 저급 언어로 변환하면 여러 코드로 이루어져 있음. 그래서 문맥 교환이 이루어질 우려가 있는 것.
3. 운영체제가 임계구역 문제를 해결하기 위한 세 가지 원칙
- 1. 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.
- 2. 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 3. 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.
12 - 2 동기화 기법
1. 뮤텍스 락(Mutex lock; MUTual EXclusion lock): 상호 배제를 위한 동기화 도구.
- 구현 방법
- 자물쇠 역할 전역 bool 변수 lock
- 임계 구역을 잠그는 acquire 함수: lock 변수가 false가 될 때까지 루프를 돈다. 이후 만약 임계 구역이 잠겨있지 않다면 lock을 true로 바꾼다.(함수를 호출한 프로세스가 임계 구역에 진입함.)
- 임계 구역의 잠금을 해제하는 release 함수: 임계 구역 작업이 끝나지 않았다면 lock 변수를 false로 바꾼다.
- 이렇게 반복하면서 잠겨있는지 계속 확인하는 것을 바쁜 대기(busy wait)라고 함.
2. 세마포(semaphore): 뮤텍스 락은 공유자원이 하나일 경우만 상정. 세마포는 뮤텍스 락과 비슷하나 공유 자원이 여러 개 있는 상황도 상정.
- 이진 세마포(binary semaphore)와 카운팅 세마포(counting semaphore)가 있으나, 이진 세마포는 뮤텍스 락과 비슷함.
- 구현 방법
- 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
- 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수: 변수 S가 0 이하라면 대기 상태로 만듦. 1 이상이면 S를 1 감소시키고 대기 큐의 프로세스를 준비 상태로 만든다.
- 이제 가도 좋다고 신호를 줄 signal 함수. 변수 S 1 증가시킴.
- 실행 순서 제어를 위한 동기화도 제공하는데, 세마포 변수를 0으로 두고, 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wiat 함수를 붙이면 된다.
3. 모니터(monitor): 개발자가 다루기 편리한 동기화 도구. 상호 배제를 위한 동기화, 실행 순서 제어를 위한 동기화를 둘 다 제공.
- 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 함. 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입. 큐에 삽인 된 순서대로 하나씩 공유 자원을 이용하도록 함.
- 조건 변수(condition variable)로 실행 순서 제어를 위한 동기화 제공. 조건 변수의 wait, signal 연산을 수행 가능.
- 조건변수. wait(): 대기 상태로 변경. 조건변수에 대한 큐 삽입.
- 조건변수. signal(): 대기 상태로 접어든 조건변수를 실행 상태로 변경.
13 - 1 교착 상태란
1. 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상을 교착 상태(deadlock)라고 한다.
- 두 프로세스가 모두 자원 A, B를 필요로 하며 각각 자원 A, 자원 B를 점유하였을 때, 다른 자원 사용이 가능해질 때까지 영원히 기다린다.
2. 교착 상태는 자원 할당 그래프(resourc-allocation graph)를 통해 대략적 표현 가능.
- 그리는 방법
- 1. 프로세스는 원으로, 자원의 종류는 사각형으로 표현.
- 2. 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현.
- 3. 프로세스가 어떤 자원을 할당받아 사용 중이면 자원에서 프로세스를 향한 화살표 표시.
- 4. 프로세스가 어떤 자원을 기다리고 있다면 프로세스에서 자원을 향한 화살표 표시.
- 교착 상태가 일어나면 자원 할당 그래프가 원의 형태를 띤다.
3. 교착 상태가 발생할 조건은 네 가지 있으며, 하나라도 만족하지 않으면 발생하지 않음. 모두 만족할 경우 발생할 수 있음.
- 1. 상호 배제(mutual exclusion): 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태.
- 2. 점유와 대기(hold and wait): 자원을 할당받은 상태에서 다른 자원을 기다리고 있는 상태.
- 3. 비선점(nonpreemptive): 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태.
- 4. 원형 대기(circular wait): 프로세스들이 원의 형태로 자원을 대기하는 상태
13 - 2 교착 상태 해결 방법
1. 교착 상태 예방: 교착 상태가 발생하지 않도록 예방하는 방법. 대신 여러 부작용이 따를 수 있음.
- 상호 배제를 없애기: 동기화 문제로 없애기엔 현실적이지 않음.
- 점유와 대기를 없애기: 해결은 되지만 한 프로세스에 자원을 몰아주기 때문에 기다리는 시간이 늘어나며, 당장 사용되지 않는데 오랫동안 할당되는 자원이 늘어나 비효율적.
- 비선점을 없애기: 실제로 효과적이나 모든 자원이 선점 가능하진 않음.
- 원형 대기를 없애기: 모든 자원에 번호를 붙이고 오름차순으로 자원을 할당. 예를 들어 철학자 문제에서 번호가 낮은 포크에서 높은 포크 순으로 집어들게 하는 것. 실제로 효과적이나 수많은 자원에 번호를 붙이긴 힘들고, 어떤 자원에 어떤 번호를 붙이는지에 따라 특정 자원의 활용율이 떨어질 수 있음.
2. 교착 상태 회피: 교착 상태를 무분별한 자원 할당으로 인해 발생했다고 간주. 교착 상태가 발생하지 않을 만큼 할당. 항상 안전 상태로 움직이도록 자원 할당. (은행원 알고리즘) https://jhnyang.tistory.com/102
- 안전 순서열(safe state): 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
- 안전 상태(unsafe state): 교착 상태 없이 모든 프로세스가 자원을 할당 받고 종료될 수 있는 상태 (안전 순서열이 있는 상태)
- 불안전 상태(unsafe state): 교착 상태가 발생할 수도 있는 상태 (안전 순서열이 없는 상태)
3. 교착 상태 검출 후 회복
- 선점을 통한 회복: 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아준다.
- 프로세스 강제 종료를 통한 회복
- 교착 상태에 놓인 프로세스 모두 강제 종료 (작업내용을 모두 잃어버림)
- 교착 상태가 해결될 때까지 한 프로세스씩 강제 종료 (오버헤드 발생)
4. 교착 상태 무시: 교착 상태를 아예 무시. 타조 알고리즘(ostrich algorithm).