방학을 너무 즐겨버려서.. 조금 늦었지만 그래두 정리해봅니당..! 추가숙제는 나중에 첨부하겠습니당
+) 6주차는 늦지 않게! 제출하겠습니당
Chapter 12 프로세스 동기화
12-1 동기화란
협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기 때문에 동기화 되어야 한다.
1. 동기화의 의미
협력적으로 실행되는 프로세스들은 올바르게 실행되기 위해서 동기화가 필수이다.
프로세스 동기화란 프로세스의 수행 시기를 맞추는 것을 의미한다. 프로세스들 사이의 수행 시기를 맞추는 것은 크게 두 가지이다.
실행 순서 제어 | 프로세스를 올바른 순서대로 실행하기 |
상호 배제 | 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 |
즉, 동기화에는 실행 순서 제어를 위한 동기화가 있고, 상호 배제를 위한 동기화가 있다.
실행 순서 제어를 위한 동기화
동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것이 첫 번째 프로세스 동기화이다.
상호 배제를 위한 동기화
상호 배제는 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘이다.
즉, 동시에 접급해서는 안 되는 자원에 동시에 접근하지 못하게 하는 것이 상호 배제를 위한 동기화이다.
2. 생산자와 소비자 문제
생산자와 소비자 문제는 물건을 계속 생산하는 생산자와 생산된 물건을 소비하는 소비자로 이루어져 있다. 생산자와 소비자는 '총합'이라는 데이터를 공유하고 있다. 생산자는 버퍼에 물건을 넣은 후 총합을 1 증가시키고, 소비자는 버퍼에 물건을 빼낸 후 총합을 1 감소시킨다.소비자와 생산자 프로세스를 각 100,000번 동시에 실행시켰을 때, 처음 총합이 10이였다면 실행 시킨 후의 총합과 10이여야 하지만 다른 수가 나오거나 오류가 나오기도 한다.
이는 생산자 프로세스와 소비자 프로세스가 동기화되지 않았기 때문에 발생한 문제이다. 각 프로세스가 작업이 끝나기 전에 총합을 수정하였기 때문에 문제가 생긴 것이다. 이는 동시에 접근해서는 안 되는 자원에 동시에 접근했기에 발생한 문제이다.
3. 공유 자원과 임계 구역
생산자와 소비자 문제에서 사용한 총합같은 여러 개의 프로세스가 공동으로 두고 사용하는 자원을 공유 자원이라고 한다. 공유자원은 전역 변수가 될 수고 있고, 파일이 될 수도 있고, 입출력장치, 보조기억장치가 될 수도 있다.
공유 자원 중에는 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원이 있는데, 이에 접근하는 코드 영역을 임계 구역이라고 한다. 두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야 한다.
임계 구역은 두 개 이상의 프로세스가 동시에 실행되면 안 되는 영역이지만, 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있는데, 이를 레이스 컨디션이라고 한다. 레이스 컨디션이 발생하면 생산자와 소비자 문제 처럼 데이터의 일관성이 깨지는 문제가 발생한다.
운영체제는 임계 구역 문제를 아래 세 가지 원칙 하에 해결한다.
상호 배제 | 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다. |
진행 | 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다. |
유한 대기 | 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역게 들어올 수 있어야 한다. |
12-2 동기화 기법
동기화를 위한 대표적인 도구인 뮤텍스 락, 세마포, 모니터에 대해서 학습
1. 뮤텍스 락
뮤텍스 락은 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구로 상호 배제를 위한 동기화 도구이다.
옷 가게를 예시로 설명하자면 옷 가게에 있는 탈의식에는 한 명의 인원만 들어갈 수 있다. 손님들은 탈의식이라는 자원을 이용하고 탈의실 안에는 손님 한 명 씩만 들어갈 수 있기 때문에 손님은 '프로세스', 탈의실은 '임계구역'이라고 생각할 수 있다. 탈의실 내에 사람이 있는지 없는지 알 수 없는 상황이라면 일단 탈의실을 열어보고 자물쇠가 걸려 있다면 탈의실 안에 사람이 있다고 판단하고 기다린다. 자물쇠가 걸려 있지 않다면 탈의실을 이용하면 되는 것이다.
위의 자물쇠 기능을 코드로 구현한 것이 뮤텍스 락이다.
뮤텍스 락의 매우 단순한 형태는 하나의 전역 변수와 두 개의 함수로 구현할 수 있다.
전역 변수 lock | 자물쇠 역할로 임계 구역이 잠겨있으면 true, 임계 구역이 잠겨 있지 않으면 false 이다. |
acquire 함수 | 임계 구역을 잠그는 역할로 프로세스가 임계 구역에 진입하기 전에 호출하는 함수이다. 만일 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인하고, 임계 구역이 열려 있다면 임계 구역을 잠그는 함수이다. |
release 함수 | 임계 구역의 잠금을 해제하는 역할로 작업이 끝나고 호출하는 함수이다. 현재 잠긴 임계 구역을 열러주는 함수이다. |
acquire 함수는 임계 구역이 잠겨 있을 경우 프로세스는 반복적으로 lock을 확인한다. 이런 대기 방식을 바쁜 대기라고 한다.
2. 세마포
뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식의 동기화 도구이다. 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다.
위의 옷가게 예시에서 탈의실의 개수가 여러개로 늘어났다고 생각하면 된다.
프로세스는 임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리고, 가도 좋다는 신호를 받으면 그제서야 임계 구역에 들어가게 된다. 세마포는 뮤텍스 락과 비슷하게 하나의 변수와 두 개의 함수로 단순하게 구현할 수 있다.
전역 변수 S | 임계 구역에 진입할 수 있는 프로세스의 개수를 나타낸다. |
wait 함수 | 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려준다. 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다. |
signal 함수 | 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 준다. 대기 중인 프로스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨준다. |
3. 모니터
최근에 등장한 동기화 도구로 세마포에 비해 사용자가 사용하기 훨씬 편리한 동기화 도구이다.
모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다. 그리고 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.
즉, 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록하여 상호 배제를 위한 동기화를 제공한다.
이 밖에도 모니터는 세마포와 마찬가지로 실행 순서 제어를 위한 동기화도 제공한다. 특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수를 사용하는데, 조건 변수는 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수이다.
모니터는 조건 변수를 이용하여 아래와 같은 프로세스 실행 순서 제어를 위한 동기화를 제공한다.
① 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.
② 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.
Chapter 13 교착 상태
13-1 교착 상태란
두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작정 기다린다면 그 어떤 프로세스도 더 이상 진행할 수 없는 교착 상태가 된다.
1. 식사하는 철학자 문제
식사하는 철학자 문제는 교착 상태를 설명하기 위한 아주 고전적이고 재미있는 문제 상황이다.
① 계속 생각을 하다가 왼쪽 포크가 사용 가능하면 집어든다.
② 계속 생각을 하다가 오른쪽 포크가 사용 가능하면 집어든다.
③ 왼쪽과 오른쪽 포크를 모두 집어들면 정해진 시간동안 식사를 한다.
④ 식사 시간이 끝나면 오른쪽 포크를 내려놓는다.
⑤ 오른쪽 포크를 내려놓은 뒤 왼쪽 포크를 내려놓는다.
⑥ 다시 ①번부터 반복한다.
위의 상황에서 한두 명의 철학자가 식사할 때는 아무런 문제가 없지만 모든 철학자가 동시에 포크를 집어 식사를 하면 어떤 철학자도 식사를 할 수 없고 영원히 생각만 하는 상황이 발생할 수 있다.
이렇게 일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상을 교착 상태라고 한다.
식사하는 철학자 문제에서 철학자는 프로세스 혹은 스레드, 포크는 자원, 생각하는 행위는 자원을 기다리는 것에 빗대어 볼 수 있다. 그리고 포크는 한 번에 하나의 프로세스 혹은 스레드만 접근할 수 있으니 임계 구역이라고 볼 수 있다.
교착 상태를 해결하기 위해서는 첫째, 교착 상태가 발생했을 때의 상황을 정확히 표현해 보고, 둘째, 교착 상태가 일어나는 근본적인 이유에 대해 알아야 한다.
2. 자원 할당 그래프
교착 상태는 자원 할당 그래프를 통해 단순하게 표현할 수 있다. 자원 할당 그래프는 어떤 프로세스가 어떤 자원을 사용하고 있고, 또 어떤 프로세스가 어떤 자원을 기다리고 있는지를 표현하는 간단한 그래프이다.
자원 할당 그래프는 아래와 같은 규칙으로 그려진다.첫째, 프로세스는 원으로, 자원의 종류는 사각형으로 표현한다.둘째, 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현한다.셋째, 프로세스가 어떤 자원을 할당받아 사용 중이라면 자원에서 프로세스를 향해 화살표를 표시한다.넷째, 프로세스가 어떤 자원을 기다리고 있다면 프로세스에서 자원으로 화살표를 표시한다.
3. 교착 상태 발생 조건
교착 상태가 발생할 조건에는 네 가지가 있다.
상호 배제 | 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때, 즉 상호 배제 상황에서 교착 상태가 발생할 수 있다. |
점유와 대기 | 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태 |
비선점 | 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못했기 때문에 교착 상태가 발생 |
원형 대기 | 자원 할당 그래프가 원의 형태로 그려지면 교착 상태가 발생할 수 있다. |
13-2 교착 상태 해결 방법
운영체제는 교착 상태를 크게 세 가지 방법으로 해결한다. 예방, 회피, 검출 후 회복이다.
1. 교착 상태 예방
교착 상태를 예방하는 방법은 앞에서 설명한 교착 상태 발생 필요 조건 네 가지 중 하나를 충족하지 못하게 하는 방법과 같다.
상호 배제 제외 | 상호 배제를 없앤다는 말의 의미는 모든 자원을 공유 가능하게 만든다는 말과 같다. 이론적으로 교착 상태를 없앨 수는 있지만, 현실적으로는 어렵다. |
점유와 대기 제외 | 점유와 대기를 없애면 운영체제는 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분한다. 이론적으로는 교착 상태를 해결할 수 있지만, 자원의 활용률이 낮아질 우려가 있다. 자원을 많이 사용하는 프로세스는 자원을 적게 사용하는 프로세스에 비해 동시에 자원을 사용할 타이밍을 확보하기가 어렵다. → 기아 현상을 야기 |
비선점 조건 제외 | 자원을 이용 중인 프로세스로부터 해당 자원을 빼앗을 수 있다. 일부 자원에 대해서는 효과적이지만 범용성이 떨어지는 방안이다. |
원형 대기 조건 제외 | 모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하면 원형 대기는 발생하지 않는다. 하지만 자원에 번호를 붙이는 일은 간단하지 않고, 각 자원에 어떤 번호를 붙이는지에 따라 특정 자원에 활용률이 떨어질 수 있다. |
2. 교착 상태 회피
교착 상태 회피는 교착 상태가 발생하지 않을 정도로만 조심 조심 자원을 할당하는 방식이다. 교착 상태 회피 방식에서는 교착 상태를 한정된 자원의 무분별한 할당으로 인해 발생하는 문제로 간주한다.
프로세스들에 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 정도의 양만큼만 자원을 배분하는 방법이 교착 상태 회피이다.
안전 상태 | 교착 상태가 발생하지 않고 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태 |
불안전 상태 | 교착 상태가 발생할 수도 있는 상황 |
안전 순서열은 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서를 의미한다. 안전 순서열이 있고, 안전 순서열대로 프로세스들에 자원을 배분하여 교착 상태가 발생하지 않는를 안전 상태라고 하고, 반면 불안전 상태는 안전 순서열이 없는 상황이다.
즉, 교착 상태 회피 방식은 항시 안전 상태를 유지하도록 자원을 할당하는 방식이다.
3. 교착 상태 검출 후 회복
교착 상태 검출 후 회복은 교착 상태 발생을 인정하고 사후에 조치하는 방식이다.
선점을 통한 회복 | 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식으로 교착 상태가 해결될 때까지 다른 프로세스로부터 자원을 강제로 빼앗고 한 프로세스에 할당하는 방식이다. |
프로세스 강제 종료를 통한 회복 | 가장 단순하면서 확실한 방식이다. 운영체제는 교착 상태에 놓인 프로세스를 모두 강제 종료할 수도 있고, 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료할 수도 있다. |
숙제
363p. 확인문제 1번
뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.
① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
② 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
③ 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
④ 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.
→ 반드시 바쁜 대기를 할 필요는 없고 대기 상태로 접어들게 할 수 있다.
추가숙제
임계 구역, 상호 배제 개념을 정리하기
'[혼공학습단 12기] 혼자 공부하는 컴퓨터구조+운영체제' 카테고리의 다른 글
[혼공컴운] 회고록 (0) | 2024.08.21 |
---|---|
[혼공컴운] 6주차 (0) | 2024.08.21 |
[혼공컴운] 4주차 (0) | 2024.07.30 |
[혼공컴운] 3주차 / 더 열심히..! (0) | 2024.07.21 |
[혼공컴운] 2주차 / 화이팅 >ㅁ< (0) | 2024.07.13 |