I LEARNED/자료구조

[자료 구조] 교착상태

veganwithbacon 2023. 1. 24. 15:07
반응형

상호배제, 점유대기, 비선점, 환형대기 많이 들었지만, 흐릿한 기억에 선명함을 더하려고 한다.

 

💡데드락(Deadlock)

교착상태라고도 불리는 이것은 시스템 자원에 대한 요구가 서로 엉켜 무한 대기를 발생시키는 상황을 일컫는다.

: 둘 이상의 프로세스가 다른 프로세스가 점유한 자원을 서로 기다릴 때 무한 대기에 빠지는 상황

 

프로그램 상에서 교착 상태는 동기화 과정에서 일어나며,

동기화를 해주는 코드에 문제가 생기면 프로세스는 멈추게 된다.

세마포어, 뮤텍스 등의 동기화를 위한 코드가 프로그래머의 실수를 통해 동기화가 제대로 안된다면, 프로세스가 멈추게 되는 것이다.

 

💡데드락(Deadlock)의 발생 조건

데드락은 한 시스템 내에 네 가지 조건이 동시에 성립 할 때 발생한다.

따라서 4가지 조건 중 하나라도 성립되지 않는다면 교착 상태를 해결할 수 있다.

 

1️⃣ 상호 배제 (Mutual exclusion)

: 병행 프로세스가 작업을 할 때, 특정 공유 자원에 대해 둘 이상의 프로세스가 동시에 사용하는 것을 막는 것

한 번에 한 개의 프로세스만이 해당 자원을 사용할 수 있다. 사용 중인 자원을 다른 프로세스가 사용하려면 자원이 해제될 때까지 기다려야한다.

 

한 프로세스가 임계 영역(Critical Section)에 진입하면 타 프로세스들이 임계구역에 진입할 수 없도록 막는 것을 의미한다

 

2️⃣ 점유 대기 (Hold and wait)

: 최소한 하나의 자원을 점유하며 다른 프로세스가 점유한 자원을 필요로 할 때 해당 자원을 요청 후 할당받을 때까지 대기하는 것

 

3️⃣ 비선점 (No preemption)

: 한 프로세스에 할당된 자원을 강제로 뺏을 수 없다

 

자원 할당을 요청한 준비 프로세스에게 자원을 할당하기 위한 규칙을 스케줄링이라 하는데,

스케줄링은 다양한 관점/방법에 따라 구분가능하나 작업 중인 프로세스의 자원을 더 중요한 프로세스에게 작업 중에 넘겨줄 수 있는지 없는지에 따라 선점(Preemtive)과 비선점(Non-preemtive) 방식으로 구분된다.

 

비선점 방식의 경우 위에서 언급한 것처럼 한 프로세스가 임의의 자원을 점유 시, 해당 프로세스가 작업을 마치기 전까지 그 자원을 계속 점유한다. 그러나 선점 방식의 경우 작업 중인 프로세스가 특정 자원을 점유한다한들 그 자원에 더욱 선순위가 높은 작업이 등장하게 되면 해당 자원을 OS에 반납하게 된다

 

4️⃣ 환형 대기 (Circular wait)

: 프로세스의 자원 점유 및 점유된 자원의 요구 관계가 원형을 이루며 대기하는 조건

각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 지니고 있다.


✔데드락 해결 방법

- 데드락 발생을 예방

- 데드락 발생 가능성을 받아들이며 회피

- 데드락 발생을 허용하며, 데드락 탐지회복

 

 

  예방(Prevention) 기법

교착상태가 애초에 발생하지 않도록 각각의 조건을 방지(부정)하여 데드락 발생 가능성을 차단한다.

아래와 같은 방법으로 데드락을 해결할 수 있으나 이는 시스템 처리량이나 자원 사용의 효율성을 떨어뜨리는 단점이 있다

 

  상호 배제 부정

  •  한 번에 여러 개의 프로세스가 공유자원을 사용할 수 있도록 한다. (읽기 전용 파일과 같은 공유 자원을 사용)

  점유 및 대기 부정 

  •  프로세스가 실행되기 전, 필요한 모든 자원을 할당해 프로세스 대기를 없앤다.(자원 낭비 발생)
  •  자원이 점유되지 않은 상태에서만 자원을 요구하도록 한다.(기아상태가 될 가능성有)

  비선점 부정 

  • 모든 자원에 대한 선점 허용
  • 자원을 점유한 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용

  환형 대기 부정

자원에 고유 번호를 할당하고, 번호 순서대로 자원을 요구하도록 한다.(자원 낭비 발생)


  회피 기법

: 교착 상태가 발생할 가능성이 있는 자원 할당을(Unsafe allocation)을 피하고 안전한 상태에서만 자원 요청을 하는 방법데드락 회피를 위해서는 아래의 가정이 필요하다

 

 - 프로세스 수 고정

 - 자원의 종류와 수 고정

 - 프로세스가 요구하는 최대 자원의 수를 알아야 한다

 - 프로세스는 자원 사용 후 반드시 반납

 

Safe state

safe sequence(교착 상태 발생없이 자원을 할당하는 순서)가 존재하며 모든 프로세스가 정상적으로 종료될 수 있는 상태

 

Unsafe state

: 교착상태를 발생할 가능성이 있는 상태

 

데드락 회피를 위한 알고리즘에는 은행원 알고리즘과 자원 할당 그래프 알고리즘이 있다.

 

👨‍⚖️은행원 알고리즘(Banker`s Algorithm)

다익스트라가 제안한 기법으로, 은행에서 모든 고객의 니즈를 충족할 수 있도록 현금을 대출해주는 것으로부터 유래되었다. 은행원 알고리즘은 자원 할당 결정전에 예상되는 모든 자원의 최대 할당량을 통해 시뮬레이션 하여 safe state에 들 수 있는지 여부를 검사해 교착상태의 가능성을 미리 파악하는 알고리즘이다.

 

기본 전제는 "CPU는 최소 하나의 프로세스에 할당해줄 만큼의 자원을 항상 보유해야한다." 이다.

 다음 예제를 통해 이해해보자

  • Max needs  : 현재 프로세스에서 필요한 최대 자원의 수
  • Current allocation : 현재 할당된 자원의 수
  • Additional need : 추가로 필요한 자원의 수
  • Available resource : 이용가능한 자원의 수
  • 프로세스들은 max needs 만큼의 자원을 할당 받아야 자원을 사용 후 반납한다

Current Allocation의 총합을 통해 전체 할당한 자원의 수를 먼저 파악한다

5 + 2 +2 + 3 = 12

 

앞서 언급했던 것처럼, available resource를 가지고, Additional Need를 충족해줄 수 있는 순으로 순서를 정한다.

추가적으로 요하는 자원을 할당해 max치를 맞춰주면 모든 자원을 반납하므로 Additional Need가 낮은 것부터 순서대로 할당해주면 되는 것이다.

현재 할당 가능한 잉여 자원이 3이므로, 순서는 P2 - P1 - P3가 되는 것이다.

>>   P2에 잉여자원 3개 중 2개를 할당해 P2의 Max needs인 4개를 충족시킨 후 4개를 반환 받으면 available resource는 5개가 된다. 이후 P1으로 가서 자원 5개를 모두 할당해준뒤 10개를 반납받고 P3에 10개 중에 7개를 할당 해주면 P3의 Max needs에 충족하기에 Safe Sequence를 만족한다.

 

🤔Safe Sequence

일종의 자원을 필요로 하는 프로세스들에게 자원을 할당해주는 순서

바로 이전 프로세스가 수행을 마치고 반납한 자원과 현재 할당 가능한 자원을 이용해 현재 프로세스에게 할당이 가능한 프로세스의 자원 할당 순서

 

safe state sequence가 1개라도 존재한다면 Safe State이다.
만약 Safe State라면 Deadlock은 일어나지 않지만,
Safe State가 아니라면 Deadlock은 발생가능성이 생긴다.

 

문제는 다음이다. 은행원 알고리즘이 경우 미리 자원의 최대 요구량을 알아야 하고 ,할당할 수 있는 자원의 수가 일정해야한다는 등등의 제약조건이 많다.

또한 문제 발생에 대한 일관성과 가정이 완벽할 거라는 보장을 하기가 어렵다. 시스템의 규모가 작은 운영체제라면 고려해볼 방법이나, 멀티 리소스, 멀티 프로세스의 복잡한 운영체제 환경에서는 자원 할당 그래프를 분석하며 safe state를 파악하기 힘들다.

 

🎞자원 할당 그래프 알고리즘

자원 할당 그래프에 예약 간선을 추가해 예약 간선으로 설정한 자원에 대해서만 자원 할당 요청이 가능하고 사이클이 형성되지 않을 때만 자원을 할당받는 방법

 

자원 할당 그래프(할당) : R(resource)에서 나온 화살표로 가리킴받은 P(process)가 할당 받은 것(자원에서 프로세스로 연결된 선)

예약 간선(요청) : 향후 요청할 수 있는 자원을 가리키는 선(프로세스에서 자원으로 연결된 선)

 

- 자원 할당 그래프에 예약 간선을 추가한다

     >> 예약 간선 : 향후 요청가능한 자원을 가리키는 점선

- 프로세스 시작 전에 모든 예약 간선들을 자원 할당 그래프에 표시한다

- 프로세스는 예약 간선으로 설정한 자원에만 요청가능하며 주기가 형성되지 않을때만 자원 할당을 받는다. 

 

 

다음 그래프에서는 P2가 자원 R2를 요청해 자원을 할당받는다면

주기가 발생하기에 자원 요청을 승인할 수 없다.

반대로 P1이 자원 R2를 요청해 자원을 할당받으면 주기가 발생하지 않아 자원을 요청해 할당받을 수 있다.


  탐지(Detection) 기법

데드락 발생 여부를 탐색하고 회복 기법 알고리즘에 활용하는 것을 의미한다.

교착상태가 탐지되면 회복 기법을 통해 교착상태를 복구한다.

 

탐지 기법은 지속적으로 교착상태를 확인하는 작업이 필요하기에 오버헤드(성능저하)가 발생한다

- 교착상태 발견 알고리즘과 자원 할당 그래프 등을 사용 가능하다

 

  회복(Recovery) 기법

교착상태가 발생했을 때 해결하는 기법

교착상태를 일으킨 프로세스를 종료하거나 교착상태의 프로세스에 할당된 자원을 선점해 프로세스나 자원을 회복하는 것

 

1. 사용자 처리

교착상태에 있는 프로세스 중 하나의 프로세스를 사용자가 강제 종료

 

2. 시스템 처리

1. 프로세스 종료

> 교착상태에 속해있는 모든 프로세스를 중지

> 교착상태가 해결될 때까지 한 프로세스씩 중지

 

2. 자원 선점

: 프로세스들로부터 자원을 빼앗아 교착상태가 해결될 때까지 다른 프로세스들에게 자원을 할당하여 해당 프로세스를 정지시키는 방법

 

자원선점에 있어서는 다음과 같은 사항들이 고려된다,

 > 희생자 선택(selection of a victim)

      - 최소의 피해를 줄 수 있는 프로세스를 선택

 > 롤백(rollback)

      - 선점된 프로세스를 문제 없던 이전 상태로 롤백해야한다

      - 일반적으로 가장 안전한 방법은 프로세스를 중지시키고 재시작하는 것이다

 > 기아 상태(starvation)

      - 한 프로세스가 계속 선점해 기아상태가 되는 것을 방지해야 한다

      - 한 가지 방법은 우선 순위를 통해 선점될 때 마다 프로세스 우선순위를 높이는 것이다.

 

다음 포스팅에서는 프로세스 동기화에 대해서 다루겠다.(임계구역, 뮤텍스, 세마포어)

 

 

 

참고 자료 : 

https://yoongrammer.tistory.com/67 

https://cocoon1787.tistory.com/858  

https://chanhuiseok.github.io/posts/cs-2/ 

https://wannabe-gosu.tistory.com/26 

https://coding-factory.tistory.com/311 

https://jwprogramming.tistory.com/12 

반응형