관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

교착 상태 2 - 교착 상태 해결 방법 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

교착 상태 2 - 교착 상태 해결 방법

huenuri 2024. 10. 18. 06:06

오늘의 마지막 새벽 공부를 시작해본다. 어제 오후에 낮잠을 많이 잔 관계로 오후 5시 반부터 새벽 5시가 넘도록 12시간 연속 공부를 하는 중이다. 중간에 저녁을 먹느라 30분 정도 쉬었을까 나머지는 모두 열공 중이다.

앞선 포스트에서 교착 상태가 어떨 때 발생하는지에 대해서 학습했다. 운영체제는 교착 상태를 회피할 수도, 예방할 수도, 검출 후 회복할 수도 있다. 이러한 각각의 해결 방법에 대해 알아보겠다.

 

 

운영체제는 애초에 교착상태가 일어나지 않도록 교착 상태 발생 조건에 부합하지 않게 자원을 분배하여 교착 상태를 예방할 수 있다. 교착 상태가 발생하지 않을 정도로 조금씩 자원을 할당하다가 교착 상태의 위험이 있다면 자원을 할당하지 않는 방식으로 교착 상태를 회피할 수도 있다. 그리고 자원을 제약 없이 할당하다가 교착 상태가 검출되면 교착 상태를 회복하는 방법을 취할 수도 있다.


 

 

 

 

교착 상태 예방

 

 

 

이론적으로는 교착 상태를 없앨 수 있지만, 현실적으로 모든 자원의 상호 배제를 없애기는 어렵다. 따라서 이 방식을 현실에서 사용하기에 다소 무리가 있다.

 

 

 

 

이는 마치 식사하는 철학자 문제 속 철학자들로 하여금 한 손에 포크를 들고 다른 포크를 기다리지 못하게 금지하는 것과 같다. 포크 두 개를 동시에 들게 하거나, 아니면 아예 들지 못하게 하는 것이다. 

점유와 대기를 금지하면 한 프로세스에 필요한 자원들을 몰아주고, 그 다음에 다른 프로세스에 필요한 자원들을 몰아줘야 한다. 이는 당장 자원이 필요해도 기다릴 수밖에 없는 프로세스와 사용되지 않으면서 오랫동안 할당되는 자원을 다수 양산하기 때문에 자원의 활용률이 낮아진다.

 

게다가 점유와 대기를 금지하면 많은 자원을 사용하는 프로세스가 불리해진다. 자원을 많이 사용하는 프로세스는 자원을 적게 사용하는 프로세스에 비해 동시에 자원을 사용할 타이밈을 확보하기 어렵기 때문이다. 이는 결국 많은 자원을 필요로 하는 프로세스가 무한정 기다리게 하는 기아 현상을 야기할 우려가 있다.

 

 

 

비선점 조건을 없애면 자원을 이용 중인 프로세스로부터 해당 자원을 빼앗을 수 있다. 가령 CPU는 프로세스들이 선점할 수 있는 대표적인 자원이다. 한 프로세스가 CPU를 이용하다가 일정 시간이 지나면 아직 작업이 모두 끝나지 않았다고 할지라도 다른 프로세스가 CPU를 할당받아 사용할 수 있기 때문이다.

한 프로세스의 작업이 끝날 때까지 다른 프로세스가 기다려야 하는 자원도 얼마든지 있다. 비선점 조건을 없애 모든 자원을 빼앗을 수 있도록 하여 교착 상태를 예방하는 방법은 다소 범용성이 떨어지는 방안이다.

 

 

예를들어, 식사하는 철학자 문제에서 모든 포크에 1번부터 5번까지 번호를 불이고. 철학자들로 하여금 번호가 낮은 포크에서 높은 포크 순으로 집어들게 한다면 원형 대기는 발생하지 않은다. 2번 포크를 집어들고 1번 포크를 집어들 수 없기 때문이다.

 

 

이는 마치 철학자들이 원형 식탁이 아닌 사각형 식탁에서 일렬로 앉아 식사하는 상황과 유사하다.

 


 

 

 

 

교착 상태 회피

프로세스들에 할당할 수 있는 자원이 충분한 상황에서 프로세스들이 한두 개의 적은 자원만을 요구한다면 교착 상태는 발생하지 않는다. 반면 프로세스들에 할당할 수 있는 자원이 한정된 상황에서 모든 프로세스들이 한 번에 많은 자원을 요구하면 교착 상태가 발생할 위험이 증가한다.

 

식사하는 철학자 문제를 생각해보자. 포크가 100개, 1000개 있는 상태에서 철학자들이 한두 개의 포크를 요구하면 교착 상태는 발생하지 않는다.

 

 

교착 상태를 회피하는 방법을 학습하기 위해서는 다음의 용어를 알아야 한다.

 

예를 들어 웹 브라우저, 메모장, 게임 프로세스가 동시에 운영체제에 자원을 요청한 상황에서 웹 브라우저 - 메모장 - 게임 프로세스 순서대로 자원을 할당하면 교착 상태가 발생하지 않는다고 가정해보겠다.

이 경우 웹 브라우저 → 메모장 → 게임이 안전 순서열이 된다. 안전 순서열이 있는 상태를 안전 상태라고 볼 수 있다.

 


 

 

 

 

현재 상황은 아래와 같이 간단한 표로 표현할 수 있다.

이 상태는 안전한 상태이다. P2 → P1 →  P3이라는 안전 순서열이 있기 때문이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

운영체제가 교착 상태를 회피하기 위해서는 시스템 상태가 안전 상태에서 안전 상태로 움직이는 경우에만 자원을 할당하면 된다. 즉, 교착 상태 회피 방식은 항시 안전 상태를 유지하도록 자원을 할당하는 방식이라 보면 된다.

 

 


 

 

 

교착 상태 검출 후 회복

 

 

 

 

 

 

타조가 문제에 처했을 때 머리를 땅에 묻고 모른 체하는 모습에서 따 온 이름이지만, 실제로 타조가 이렇게 행동하지는 않는다.

 

완벽을 추구하는 과학자나 수학자 입장에서는 납득할 수 없는 방식일지 모르나, 문제 발생의 빈도나 심각성에 따라 최대 효율을 추구하는 엔지니어 입장에서는 때때로 이 방식이 적합할 때도 많다.


 

 

 

 

단원 마무리하기

 

 

P2에 자원 두 개를 할당하면 3 - 2 = 1이 되며, P2가 실행을 성공적으로 종료하여 자원을 반납하면 1 + 4 = 5가 된다.

 

 

 

 

원형으로 대기하면 교착 상태가 발생할 수 있다.

 


 

 

 

학습을 마치고

드디어 13장까지 학습을 모두 마쳤다. 교착 상태에 대해서도 어느 정도 잘 이해할 수 있었다. 다만 자원이 얼마가 할당되었고 반환되었는지 등을 계산하는 문제는 많이 어려웠다. 이 부분은 아직도 잘 이해가 안 되는데 다음에 한번 더 복습하려고 한다.

이제 딱 두 단원이 남았는데 오늘 오후 4시 전까지는 이 공부를 다 마치려고 한다. 강의는 6개 정도 남아있어 6시간 정도 공부하면 다 마칠 수 있을 것 같다.