* '혼자서 공부하는' 컴퓨터구조+운영체제 이지만, 혼자보단 여럿이하면 더 좋으니 혼공 학습단 13기와 함께합니다 :)
[5주차 학습목록] (‘•̀ ▽ •́ )✎
Ch12. 프로세스 동기화
01. 동기화란
02. 동기화 기법
Ch13. 교착 상태
01. 교착 상태란
02. 교착상태 해결방법
Ch12. 프로세스 동기화
12-1. 동기화란
동기화
동시다발적으로 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장하기 위해서 반드시 동기화 되어야 한다!
그렇다면 동기화(synchronization)란 무엇인가?
동기화란, 특정 자원에 접근할 대 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는 것을 의미한다! 그러면 프로세스 동기화는 무엇일까?
프로세스 동기화란, 프로세스들 사이의 수행 시기를 맞추는 것을 의미하다.
크게 동기화에는 아래의 두가지를 위한 동기화가 있다!
1) 실행 순서 제어 동기화 : 프로세스를 올바른 순서대로 실행하기
2) 상호 배제 동기화 : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
각각의 동기화를 알아보자.
첫번째, 실행 순서 제어를 위한 동기화
이 동기화가 필요한 때는 다음과 같은 경우에 필요할 것이다.
Writer와 Reader 라는 프로세스가 동시에 실행 중이라고 가정하자. 여기서, Writer 프로세스는 Word.txt 파일에 값을 저장하는 프로세스이고, Reader 프로세스는 같은 Word.txt 파일의 값을 읽는 프로세스라고 하자. 여기서 Reader 프로세스는 'Word.txt 파일에 값이 존재한다.' 라는 전제 조건이 성립이 되어야 실행을 할 수가 있다.
따라서 이 두 프로세스는 정해진 순서 없이 그냥 무작정 실행이 되어서는 안 될 것이다 :0
이같은 상황에서 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것! 그것이 실행 순서 제어를 위한 동기화이다.
두번째, 상호 배제를 위한 동기화
상호 배제(mutual exclusion)란, 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘이다.
무슨 말인지 책에 담긴 예시를 보며 이해해보자!
내 계좌에 1,000만원이 저축되어 있고, 현재 저축 금액에 100만원을 넣는 A 프로세스, 현재 저축 금액에 500만원을 넣는 B 프로세스가 있다고 생각해보자. (희히,,상상만해도 좋다,,ㅎㅎ)
각 프로세스를 더 정확하게 나타내면 아래와 같은 순서가 될 것이다.
- A 프로세스 : (1) 계좌의 잔액 읽기 -> (2) 읽은 잔액에 100만원 더하기 -> (3) 더한 값 저장
- B 프로세스 : (1) 계좌의 잔액 읽기 -> (2) 읽은 잔액에 500만원 더하기 -> (3) 더한 값 저장
이 두개의 프로세스가 동시에 실행이 된다고 생각해보자. 나는 당연히 두개의 실행이 끝난 나의 계좌 잔액이 1,000만원 + 100만원 + 500만원 = 1,600만원이 될거라고 생각을 했다.
BUT,, 동기화가 제대로 이뤄지지 않은 경우에는 아래의 사진의 순서와 같이 전혀 다른 이상한 결과가 나올 수 있다.
이 같은 상황이 발생하는 것은 A 와 B 프로세스는 '잔액' 이라는 데이터를 동시에 사용하기 때문이다!
A 프로세스가 끝나기도 전에 B 프로세스가 잔액을 읽어버려서 이상한 결과가 다르게 나온 것이다. 내가 당연하게 생각했던 결과가 나오기 위해서는 A와 B 프로세스가 올바르게 실행이 되어 하나의 프로세스가 끝나고 다음 프로세스가 실행이 되어야 하는 것이다. 이처럼 동시에 접근해선 안 되는 자원에 동시에 접근을 하지 못하게 하는 것이 상호 배제를 위한 동기화이다!
이러한 상호 배제를 위한 동기화에는 아주 고전적이고 유명한 '생산자와 소비자 문제'가 있다.
어떤 문제인지 알아보자.
생산자와 소비자 문제는 물건을 계속해서 생산하는 프로세스인 생산자와 물건을 계속해서 소비하는 프로세스인 소비자로 이루어져 있다.
* 여기서 생산자와 소비자가 동시에 실행되는 스레드가 될 수도 있다..!
생산자와 소비자는 '총합' 이라는 데이터를 공유하고 있다. 여기서 생산자와 소비자는 아래와 같은 순서를 가지고 있고, 총합이라는 값이처음에는 10이라고 가정해보자. 이를 코드 형식으로 작성하면 아래와 같을 것이다.
총합 = 10
생산자 ( ) {
버퍼에 데이터 삽입
'총합' 변수 1 증가
}
소비자 ( ) {
버퍼에서 데이터 빼기
'총합' 변수 1 감소
}
이 상태에서 생산자를 10만번, 소비자를 10만번 동시에 실행을 한다고 하면, 총합 결과 값은 얼마가 될까?
그냥 보기와 같이 동시에 실행이 되면, 10 + 10만 - 10만 = 10 으로 처음 값과 동일하다고 생각할 것이다.
하지만 실제로 코드로 동작시켜 동시에 실행해 보면 생각과 다른 결과를 볼 수가 있다!
총합이 10이 아닌 다른 수가 되거나 오류가 발생하기도 한다. (책 345p - 예제 코드 다운로드 링크를 참고해주세요 :D)
이러한 결과가 나오는 이유는 생산자 프로세스와 소비자 프로세스가 제대로 동기화되지 않았기 때문이다!
소비자가 생산자의 작업이 끝나기도 전에 총합을 수정하거나, 생산자가 소비자의 작업이 끝나기 전에 총합을 수정했기 때문에 이와 같은 전혀 다른 결과가 발생하게 되는 것이다.
-> 즉, 앞서 다룬 계좌 잔액 문제와 이 생산자와 소비자 문제는 동시에 접근해서는 안되는 자원에 동시에 접근했기 때문에 발생하는 문제이다!!
공유 자원과 임계 구역
그렇다면 동시에 접근해서는 안되는 자원이란 무엇일까?
그것을 바로 공유 자원(shared resource)이라고 한다. 공유 자원은 전역 변수가 될 수도, 파일이 될 수도, 입출력장치 등등이 될 수가 있다. 이러한 공유 자원 중에는 두 개 이상의 프로세스를 동시에 실행하면 문제가 발생하는 자원이 있다.
동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section)이라고 한다.
2개 이상의 프로세스가 이 임계 구역에 진입하려고 하면 둘 중 하나는 대기를 해야한다.
임계 구역은 2개 이상의 프로세스가 동시에 실행되면 안되는 영역이지만, 잘못된 실행으로 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우가 있는데 이를 레이스 컨디션(race condition)이라고 한다.
레이스 컨디션이 발생하면 앞서 다룬 계좌 잔액 문제 혹은 생산자와 소비자 문제와 같이 데이터의 일관성이 깨지는 문제가 발생한다. 운영체제는 이러한 임계 구역 문제를 3가지 원칙으로 해결을 한다.
1. 상호 배제(mutual exclusion) : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
2. 진행(progress) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
3. 유한 대기(bounded waiting) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다. (무한정 대기해서는 안된다!)
12-2. 동기화 기법
동기화를 위한 대표적인 도구를 알아보자.
뮤텍스 락(Mutex lock: MUTual EXclusion lock)
- 동시에 접근해서는 안되는 자원에 동시에 접근하지않도록 만드는 도구, 즉 상호 배제를 위한 동기화 도구이다.
임계 구역에 진입하는 프로세스는 뮤텍스 락을 이용하여 임계 구역에 있는 동안 다른 프로세스가 들어오지 못하게 막고, 다른 프로세스들은 임계 구역이 뮤텍스 락이 잠겨있는지 확인하고 잠겨있으면 기다리고, 안잠겨 있으면 임계 구역에 진입하게 된다.
뮤텍스 락을 매우 단순한 형태로 나타내면 하나의 전역 변수와 두개의 함수로 구현이 가능하다.
- 자물쇠 역할 : 프로세스들이 공유하는 전역 변수 lock
- 임계 구역을 잠그는 역할 : acquire 함수
- 임계 구역의 잠금을 해제하는 역할 : release 함수
aquire 함수란, 프로세스가 임계 구역에 진입하기 전에 호출하는 함수이다.
임계 구역을 반복적으로 확인하며 잠겨있는지 보고, 잠겨 있지 않다면 프로세스가 잠그고 들어가도록 해주는 함수이다.
release 함수는 임계 구역에서의 작업이 끝나고 호출하는 함수이다.
현재 잠긴 임계 구역을 열어주는(lock : true -> false) 함수이다.
이렇게 aquire 함수가 반복적으로 계속 임계 구역을 확인해야 하니 이런 대기 방식을 바쁜 대기(busy wait)라고도 한다.
세마포(semaphore)
세마포는 뮤텍스 락과 비슷하지만, 조금 더 일반화된 동기화 도구이다.
- 공유 자원이 여러 개 있는 상황에서 적용 가능한 동기화 도구이다.
뮤텍스 락은 공유 자원이 1개인 경우라면, 세마포는 공유 자원이 2개 이상인 경우에 해당한다.
세마포는 하나의 변수와 두개의 함수로 아래와 같이 구현할 수 있다.
- 임계 구역에 진입할 수 있는 프로세스 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
- 임계 구역에 들어가도 되는지, 기다려야 하는지 알려주는 wait 함수
- 임계 구역 앞에서 기다리는 프로세스에게 들어가도 된다는 신호를 주는 signal 함수
뮤텍스 락에서의 aquire()와 release()가 있듯, 세마포에서는 wait()과 signal()이 있다.
그런데, 앞선 뮤텍스 락과 세마포에게는 한가지 문제가 있다.
사용할 수 있는 공유 자원이 없는 경우, 프로세스는 무한히 반복하며 사용 가능한 공유 자원이 있는지 확인해야 한다. 이렇게 바쁜 대기를 반복하며 CPU 주기를 낭비한다는 손해점이 발생한다.
그래서 세마포는 뮤텍스 락보다 더 좋은 방법을 사용한다. 그 방법은 다음과 같다.
wait 함수는 사용할 수 있는 자원이 없는 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 넣는다. 그리고 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하게 되면 그 signal 함수는 대기 큐에서 대기 중인 프로세스를 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮긴다.
세마포를 이용한 상호 배제를 위한 동기화 기법을 얘기했다면, 이제는 세마포를 이용해 프로세스의 순서를 제어하는 방법을 알아보자. 세마포를 이용하면 동시에 실행되는 프로세스의 실행 순서도 원하는대로 제어할 수가 있다.
바로, 세마포의 변수 S를 0으로 두고, 먼저 실행할 프로세스 뒤에 signal 함수, 그 다음에 실행할 프로세스 앞에 wait 함수를 붙이면 된다!
이처럼 세마포는 그 자체로는 매우 훌륭한 도구이지만, 사용하기에는 조금 불편한 점이 있다.
매번 임계 구역에 앞뒤로 하나하나 wait과 signal 함수를 명시하는 번거로운 일을 해줘야 한다는 점이다.
특히 코드가 방대해지고 복잡해지면, 더더욱 잘못된 코드로 인해 예기치 못한 결과가 일어날 때도 있다.
모니터(monitor)
그래서 최근에 나온 도구가 바로 모니터이다. 모니터는 세마포에 비해 훨씬 사용하기 편한 도구이다.
- 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공하는 도구이다.
더 이해하기 쉽게 책에서 그려진 그림을 가져와 봤다,,ㅎㅎ
특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수(condition variable)를 사용한다. 이 조건 변수란 프로세스나 스레드의 실행 순서를 제어하기 위해 사용되는 특별한 변수를 말한다.
조건 변수로는 wait과 signal 연산을 수행할 수 있다.
먼저 wait은 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산이다!
* 유의할 점 : 모니터에 진입하기 위해 삽입되는 큐(상호 배제를 위한 큐)와 wait 함수가 호출되어 실행이 중단된 프로세스들이 삽입되는 큐(조건 변수에 대한 큐)는 서로 다른 큐이다...!!
그 다음 wait 함수로 일시 중단된 프로세스는 다른 프로세스의 signal 함수 연산을 통해 실행이 재개될 수 있다.
즉, signal 함수는 wait을 호출하여 조건 변수 큐에 삽입된 프로세스의 실행을 재개하는 연산이다.
따라서 wait을 호출했던 프로세스는 signal을 호출한 프로세스가 모니터를 떠난 뒤에 실행되거나, signal을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤에 다시 signal을 호출한 프로세스의 수행을 재개한다.
모니터의 가장 중요한 점은, 조건 변수를 이용하여 프로세스 실행 순서 제어를 위한 동기화를 제공한다는 것이다!!!
Ch13. 교착 상태
13-1. 교착 상태란
교착 상태
프로세스를 실행하기 위해서는 자원이 필요한데, 두 개 이상의 프로세스가 각자 가지고 있는 자원을 무작정 기다린다면 그 어떤 프로세스도 더 이상 진행할 수 없는 상태인 교착 상태가 된다!
식사하는 철학자 문제
교착 상태를 설명하는 고전적이고 재미있는 문제 상황에는 식사하는 철학자 문제(dining philosophers problem)가 있다.
이 문제는 교착 상태가 어떠한 상황에서 왜 발생하는지, 더 나아가 어떻게 문제를 해결할 수 있는지를 알아볼 수 있는 가상의 문제 시나리오이다. 이는 다음과 같은 시나리오이다.
동그란 원탁에 5명의 철학자가 앉아 있다. 각각의 철학자들 앞에는 맛있는 음식이 있고, 철학자들 각 사이에는 포크가 놓여있다.
그리고 앞에 놓인 음식은 두 개의 포크로 먹을 수 있는 음식이라고 가정하자. 이러한 상황에서 철학자들은 아래의 순서대로 식사를 할 것이다.
1) 계속 생각을 하다 왼쪽 포크가 사용 가능하면 집어든다.
2) 또 계속 생각을 하다 오른쪽 포크가 사용 가능하면 집어든다.
3) 왼쪽과 오른쪽 포크를 모두 집어들면 정해진 시간동안 식사를 한다.
4) 정해진 시간이 끝나 식사를 마치면 오른쪽 포크를 내려놓는다.
5) 오른쪽 포크를 내려놓은 후 왼쪽 포크를 내려놓는다.
6) 다시 1)부터 반복을 한다.
이러한 순서대로만 하면 철학자들은 무사히 식사를 잘 마칠 수 있을 거라고 생각이 된다. 한 두명의 철학자들이 식사를 할 때는 별 문제가 없을 것이다. 하지만, 5명의 모든 철학자들이 동시에 포크를 집어 식사를 한다면 어떠한 철학자도 식사를 할 수가 없고 또 영원히 생각만 하는 상황이 발생할 수가 있다. 모든 철학자들이 왼쪽 포크를 집어들면 모두가 오른쪽 포크를 집을 수가 없기 때문이다. 즉, 모든 철학자는 다른 철학자가 포크를 내려놓을 때까지 기다릴 것이고, 모든 철학자들은 그 생각을 할 것이다.
이렇게 일어나지 않을 사건을 기다리면서 진행이 멈춰 버리는 현상을 바로 교착 상태(deadlock)라고 한다.
위의 문제에서 철학자, 포크, 생각하는 행위는 다음과 같이 빗대어 볼 수 있다.
철학자 -> 프로세스 or 스레드 / 포크 -> 자원 / 생각하는 행위 -> 자원을 기다리는 것
이때 포크는 한 번에 하나의 프로세스 혹은 스레드만 접근할 수 있다는 점에서 임계 구역이라고 볼 수 있다.
이러한 상황은 다음과 같은 상황과도 같다.
영상 프로세스는 자원 A를 점유한 채 웹 브라우저 프로세스가 점유하고 있는 자원 B의 사용이 끝나기를 기다리고,
반대로 웹 브라우저 프로세스는 자원 B를 점유한 채 영상 프로세스의 자원 A 사용이 끝나기를 기다리는 상황
-> 웹 브라우저 프로세스도 영상 프로세스도 서로 상대방이 가진 자원을 기다리기만 하다가 결국 실행 한 번 못하는 상황이 발생한다! 이를 교착 상태(deadlock)라고 한다.
이 교착 상태는 아주 다양한 상황에서 발생을 하는데, 앞서 나온 뮤텍스 락에서도 발생할 수 있다.
자원 할당 그래프
교착 상태가 발생했을 때의 상황을 한 눈에 보기 쉽게 그래프로 표현하는 방법이 있다.
그 방법이 자원 할당 그래프(resource-allocation graph)이다. 교착 상태는 자원 할당 그래프를 통해서 단순하게 표현을 할 수가 있다.
자원 할당 그래프는 어떤 프로세스가 어떤 자원을 사용하고 있는지 혹은 어떤 자원을 기다리고 있는지를 표현하는 그래프이다.
이 그래프는 아래와 같은 규칙으로 그려진다.
1. 프로세스는 원으로, 자원의 종류는 사각형으로 표현한다.
2. 사용할 수 있는 자원의 개수는 자원 사각형 내에 점으로 표현한다.
- 같은 자원이라고 해도 사용 가능한 자원의 개수는 여러 개 있을 수가 있다.
3. 프로세스가 어떤 자원을 할당받아 사용 중이라면, 자원에서 프로세스를 향해 화살표를 표시한다.
- (자원 --> 프로세스) 자원 이용이 끝나서 운영체제에 자원을 반납하면 화살표는 삭제된다.
4. 프로세스가 어떤 자원을 기다리고 있다면 프로세스에서 자원으로 화살표를 표시한다.
- (프로세스 --> 자원)
위와 같은 규칙으로 교착 상태를 자원 할당 그래프로 표현해 본다면 아래와 같이 표현이 된다.
아래의 그림을 보면 교착 상태의 그래프의 특징을 알 수 있다. 바로, 자원 할당 그래프가 원의 형태를 띄고 있다는 것이다!
교착 상태 발생 조건
교착 상태가 발생할 조건에는 아래와 같이 4가지가 있다.
아래의 4가지 조건 중 하나라도 만족하지 않으면 교착 상태가 발생가지 않지만, 아래 조건이 모두 만족이 될 때까지 교착 상태가 발생할 가능성이 생긴다.
1. 상호 배제(mutual exclusion)
- 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때인 상호 배제 상황에서 교착 상태가 발생할 수 있다.
2. 점유와 대기(hold and wait)
- 어떠한 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다린다면 교착 상태가 발생할 수 있다.
이러한 상태를 점유와 대기라고 한다.
3. 비선점(nonpreemptive)
- 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못했기 때문에 즉, 프로세스가 자원을 비선점하여 교착 상태가 발생할 수 있다.
4. 원형 대기(circular wait)
- 프로세스들과 프로세스가 요청 및 할당받은 자원이 원의 형태를 이루었기 때문에 교착 상태가 발생할 수 있는 것이다.
프로세스들이 원의 형태로 자원을 대기하는 것을 원형 대기라고 한다.
13-2. 교착 상태 해결 방법
교착 상태 예방
교착 상태를 예방하는 방법은 앞서 말한 발생 필요 조건 4가지 중 하나를 충족하지 못하게 하는 방법이다.
-> 프로세스들에 자원을 할당할 때 '상호 배제', '점유와 대기', '비선점', '원형 대기' 조건 중 하나라도 만족시키지 않게 할당하면 예방할 수 있다!
먼저, 상호 배제 조건을 없애는 예방법
-> 현실적으로 모든 자원의 상호 배제를 없애기는 어렵기에 이 예방법은 현실에서 사용하기에는 무리가 있다.
두번째, 점유와 대기 조건을 없애는 예방법
-> 점유와 대기를 없애면 운영체제는 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분하게 된다.
이러한 예방법도 이론적으로는 해결할 수 있지만, 자원의 활용률이 낮아진다는 단점이 있다.
또한 많은 자원을 사용하는 프로세스는 적게 사용하는 프로세스에 비하여 동시에 자원을 사용할 타이밍을 확보하기가 어려워 무한정 기다리게 되는 기아 현상을 초래하기 때문에 불리하다.
세번째, 비선점 조건을 없애는 예방법
-> 비선점 조건을 없애면 자원을 이용 중인 프로세스로부터 해당 자원을 빼앗을 수 있게 된다.
이 예방법은 선점하여 사용할 수 있는 일부 자원에 대해선 효과적이다. 이에 해당하는 선점 사용 가능한 대표적인 자원은 CPU이다.
선점 사용 가능한 자원이 일부 있지만, 모든 자원이 다 가능한 것은 아니다. 그렇기에 비선점 조건을 없애서 모든 자원을 빼앗을 수 있도록 하여 예방하는 방법인 이 방법은 다소 범용성이 떨어진다.
마지막으로, 원형 대기 조건을 없애는 예방법
-> 원형 대기를 없애는 방법은 간단하다. 모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하면 원형 대기는 발생하지 않는다!
마치, 원형 식탁에 철학자들이 앉아 있는 것이 아닌 사각형의 기다란 식탁에 일렬로 앉아 식사하는 것과 같다.
이 예방법은 앞선 3가지 예방법에 비해선 비교적 현실적이고 실용적인 방법이다. 하지만, 이 역시도 단점이 있다.
모든 컴퓨터 시스템 내에 존재하는 수많은 자원에 번호를 붙이는 일은 간단한 작업이 아니면서, 각 자원에 어떤 번호를 붙이는지에 따라서 특정 자원의 활용률이 떨어질 수가 있다.
위와 같이 교착 상태의 발생 조건을 원천적으로 제거해서 교착 상태를 예방하는 방법은 교착 상태가 발생하지 않음을 보장 할 수는 있지만, 여러가지 부작용이 따르게 된다.
따라서 나온 것이 교착 상태 회피이다.
교착 상태 회피
교착 상태 회피란 교착 상태가 발생하지 않을 정도로만 조심 조심 자원을 할당하는 방식이다.
즉, 프로세스들에 배분할 수 있는 자원의 양을 고려하여 교착 상태가 발생하지 않을 정도의 양만큼만 자원을 배분하는 방법을 말한다.
교착 상태를 회피하는 방법을 알기 위해선 '안전 상태', '불안정 상태', '안전 순서열' 이라는 용어를 알아야 한다.
- 안전 상태(safe state)
: 교착 상태가 발생하지 않고 모든 프로세스가 정상적으로 자원을 할당받고 종료될 수 있는 상태 (= 안전 순서열이 존재하는 상태)
- 불안전 상태(unsafe state)
: 교착 상태가 발생할 수도 있는 상황 (= 안전 순서열이 없는 상태)
- 안전 순서열(safe sequence)
: 교착 상태 없이 안전하게 프로세스들에 자원을 할당할 수 있는 순서
즉, 운영체제가 교착 상태를 회피하기 위해선 시스템 상태가 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당하면 된다.
-> 교착 상태 회피는 안전 상태를 유지하도록 자원을 할당하는 방식
교착 상태 검출 후 회복
앞선 교착 상태 예방과 회피는 교착 상태 발생을 막기 위한 노력이었다면, 교착 상태 검출 후 회복은 교착 상태 발생을 인정하고 사후에 조치하는 방법이다. 아래와 같이 교착 상태 검출 후 회복에는 2가지가 있다.
선점을 통한 회복
- 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식
프로세스 강제 종료를 통한 회복
- 교착 상태에 놓인 프로세스를 모두 강제 종료할 수도, 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료를 하는 방식
- 교착 상태에 놓인 프로세스를 모두 강제 종료(전자) : 가장 확실한 방식이지만, 많은 프로세스들의 작업 내역을 잃게 될 가능성 높아짐
- 교착 상태가 없어질 때까지 한 프로세스씩 강제 종료(후자) : 작업 내역 잃게 될 가능성 낮아지지만, 교착 상태가 없어졌는지 여부 확인하는 과정에서 오버헤드를 야기함
* 사실은,, 교착 상태를 그냥 아예 무시하는 방법도 있다.
드물게 발생하는 잠재적 문제를 그냥 모르쇠 무시로 대처하는 방식인 타조 알고리즘(ostrich algorithm) 방식이다.
과학자나 수학자와 같은 완벽을 추구하는 입장에선 납득하지 못할 방식이겠지만, 문제 발생의 빈도나 심각성에 따라 최대 효율을 추구해야하는 엔지니어, 개발자 입장에선 가-끔,,, 종종(?) 이 방식이 적합할 때도 많다. ((부끄럽지만,, 내가 그러하다,,ㅎㅎ 합리화하는 너낌이랄까,,,)
[과제]
- 필수과제
01) 363p
01. 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르시오.
1) 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
2) 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
3) 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
4) 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.
답: 4번
뮤텍스 락은 하나의 공유 자원에 대하여 프로세스가 임계 구역에 들어가면 락으로 잠가두어 다른 프로세스가 임계 구역에 들어오지 못하도록 막고, 임계 구역에 들어간 프로세스가 실행을 마치면 락을 풀어 프로세스가 들어올 수 있도록 하여 상호 배제를 위한 동기화 도구이다. 이러하다 보니 반복적으로 계속 임계 구역을 확인해야 하는데 이런 대기 방식을 바쁜 대기라고 한다. 하지만 세마포는 wait과 signal 함수를 사용하며 세마포를 위한 '큐'를 사용하기에 이러한 바쁜 대기를 반드시 할 필요는 없게 된다!
- 선택과제
01) Ch12(12-1) 임계 구역, 상호 배제 개념 정리하기
임계 구역이란, 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역을 의미한다.
이 임계 구역에서 발생하는 문제를 해결하는 방안 중 상호 배제가 있다.
먼저, 상호 배제 자체의 의미는 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용되는 알고리즘을 의미하는데, 임계 구역에 사용되는 방법의 의미는 다음과 같다.
한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없는 것을 의미한다.
'Studying > 혼공학습단' 카테고리의 다른 글
[혼공컴운]혼공학습단 13기 활동 회고록 (2) | 2025.02.23 |
---|---|
[혼공컴운]6주차_Ch.14 - 15 (0) | 2025.02.23 |
[혼공컴운]4주차_Ch.09 - 11 (0) | 2025.02.13 |
[혼공컴운] 3주차_Ch.06 - 08 (0) | 2025.02.03 |
[혼공컴운] 2주차_Ch.04 - 05 (0) | 2025.01.20 |