본문 바로가기

학습/웹개발 직무 수행 중 메모

[면접] Deadlock 해결 방법

데드락(Deadlock)은 둘 이상의 프로세스나 스레드가 서로 상대방이 가진 리소스를 기다리며 무한히 대기하는 상황을 말합니다. 데드락이 발생하면 시스템이 블록될 수 있어서 중요한 문제입니다. 데드락을 해결하기 위한 몇 가지 주요한 방법들은 아래와 같습니다:

  1. 예방 (Prevention):
    • 데드락 발생의 4가지 조건을 미리 제거하여 데드락을 방지하는 방법입니다.
    • 상호 배제, 점유 및 대기, 비선점, 환형 대기 조건을 어느 하나라도 만족하지 않도록 리소스 할당을 관리합니다.
    • 예방 방법은 비효율적일 수 있고, 자원 활용이 줄어들 수 있습니다.
  2. 회피 (Avoidance):
    • 데드락 가능성을 고려하여 리소스 할당을 결정하는 알고리즘을 사용합니다.
    • 안전 상태를 유지하도록 리소스를 할당하며, 데드락이 발생하지 않도록 미리 계산합니다.
    • 단점은 보다 복잡하고 무한루프에 빠질 가능성이 있는 경우가 있을 수 있습니다.
  3. 회복 (Recovery):
    • 데드락이 발생한 후에 시스템을 회복시키는 방법입니다.
    • 프로세스를 중지하거나 리소스를 선점하여 데드락을 해결합니다.
    • 회복 방법은 사용자 경험에 영향을 줄 수 있고, 어떤 프로세스가 중지되어야 할지 선택하는 문제가 발생합니다.
  4. 무시 (Ignorance):
    • 데드락을 처리하지 않고 무시하는 방법입니다.
    • 일부 시스템에서는 데드락이 드물게 발생하거나 미치는 영향이 작을 경우 무시하는 경우도 있습니다.

 

다음과 같은 방법을 사용하여 데드락을 해결할 수 있습니다:

1. **프로세스 또는 스레드 강제 종료:**
   데드락이 발생한 프로세스 또는 스레드를 강제로 종료시켜 데드락 상태를 해제할 수 있습니다. 이 방법은 비교적 빠르게 데드락을 해결할 수 있지만, 중요한 작업이 중단될 수 있으므로 사용에 주의가 필요합니다.

2. **리소스 선점:**
   데드락이 발생한 프로세스 또는 스레드가 보유한 리소스를 강제로 선점하여 다른 프로세스가 해당 리소스를 사용할 수 있도록 하는 방법입니다. 이를 통해 데드락 상태를 해제할 수 있지만, 어떤 프로세스가 리소스를 선점해야 할지 결정하는 문제가 발생할 수 있습니다.

3. **프로세스 또는 스레드 우선순위 변경:**
   데드락이 발생한 프로세스 또는 스레드의 우선순위를 변경하여 다른 프로세스 또는 스레드가 리소스를 먼저 할당받도록 하는 방법입니다. 이는 데드락을 해결하는 데 도움이 될 수 있지만, 모든 상황에서 효과적이지는 않을 수 있습니다.

4. **자원 할당 정책 변경:**
   데드락 발생의 가능성을 줄이기 위해 자원 할당 정책을 변경할 수 있습니다. 예를 들어, 자원을 비선점 가능하도록 하거나, 미리 정해진 순서대로 자원을 할당하거나, 자원의 점유 시간을 제한하는 등의 방법을 사용할 수 있습니다.

5. **자원 모니터링과 경고 시스템 구축:**
   시스템에서 데드락이 발생할 수 있는 상황을 모니터링하고, 데드락이 발생할 가능성이 높을 때 경고를 발생시키는 시스템을 구축하여 조치를 미리 취할 수 있습니다.

6. **예방을 위한 설계 개선:**
   데드락 발생을 최소화하기 위해 시스템 설계를 개선할 수 있습니다. 예를 들어, 자원 요청 순서를 통일하거나, 리소스 할당에 대한 중재자를 도입하는 등의 방법을 사용하여 데드락을 예방할 수 있습니다.

데드락 발생 시에는 상황과 환경에 맞는 방법을 선택하고, 신속한 조치를 통해 시스템의 가용성과 안정성을 유지하는 것이 중요합니다.

 

 

다음은 데드락 해결을 위한 리소스 선점 작업의 예시입니다:

1. **kill 명령어를 사용한 프로세스 종료:**
   `kill` 명령어를 사용하여 데드락에 빠진 프로세스를 종료할 수 있습니다. 예를 들어, 터미널에서 다음과 같이 입력합니다:
   ```
   kill <PID>
   ```
   `<PID>`는 종료하려는 프로세스의 식별자 번호입니다.

2. **renice 명령어를 사용한 프로세스 우선순위 변경:**
   `renice` 명령어를 사용하여 데드락에 빠진 프로세스의 우선순위를 변경하여 리소스 선점을 할 수 있습니다. 예를 들어, 다음과 같이 입력합니다:
   ```
   renice -n <우선순위> -p <PID>
   ```
   `<우선순위>`는 높은 값일수록 낮은 우선순위를 의미하며, `<PID>`는 프로세스의 식별자 번호입니다.

3. **스크립트를 사용한 자동화:**
   데드락이 발생할 가능성이 있는 상황을 감지하고, 자동으로 해당 프로세스를 종료하거나 우선순위를 변경하는 스크립트를 작성하여 자동화할 수 있습니다. 이를 통해 데드락 상태를 빠르게 해결할 수 있습니다.

4. **운영체제의 자원 관리 도구 활용:**
   리눅스는 `nice`, `renice`, `kill` 등의 명령어 외에도 `top`, `htop`, `killall`과 같은 명령어 및 프로세스 관리 도구를 제공합니다. 이러한 도구를 사용하여 데드락을 해결하는데 도움을 받을 수 있습니다.

이러한 리소스 선점 작업은 데드락을 해결하기 위한 임시적인 조치일 수 있으며, 프로세스나 스레드를 중단하거나 우선순위를 변경하는 것은 시스템의 안정성과 성능에 영향을 미칠 수 있습니다. 따라서 리소스 선점 작업을 수행하기 전에 잘 고려하고, 가능한 대안을 검토하는 것이 중요합니다.