데드락(Deadlock)은 둘 이상의 프로세스나 스레드가 서로 상대방이 가진 리소스를 기다리며 무한히 대기하는 상황을 말합니다. 데드락이 발생하면 시스템이 블록될 수 있어서 중요한 문제입니다. 데드락을 해결하기 위한 몇 가지 주요한 방법들은 아래와 같습니다:
- 예방 (Prevention):
- 데드락 발생의 4가지 조건을 미리 제거하여 데드락을 방지하는 방법입니다.
- 상호 배제, 점유 및 대기, 비선점, 환형 대기 조건을 어느 하나라도 만족하지 않도록 리소스 할당을 관리합니다.
- 예방 방법은 비효율적일 수 있고, 자원 활용이 줄어들 수 있습니다.
- 회피 (Avoidance):
- 데드락 가능성을 고려하여 리소스 할당을 결정하는 알고리즘을 사용합니다.
- 안전 상태를 유지하도록 리소스를 할당하며, 데드락이 발생하지 않도록 미리 계산합니다.
- 단점은 보다 복잡하고 무한루프에 빠질 가능성이 있는 경우가 있을 수 있습니다.
- 회복 (Recovery):
- 데드락이 발생한 후에 시스템을 회복시키는 방법입니다.
- 프로세스를 중지하거나 리소스를 선점하여 데드락을 해결합니다.
- 회복 방법은 사용자 경험에 영향을 줄 수 있고, 어떤 프로세스가 중지되어야 할지 선택하는 문제가 발생합니다.
- 무시 (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`과 같은 명령어 및 프로세스 관리 도구를 제공합니다. 이러한 도구를 사용하여 데드락을 해결하는데 도움을 받을 수 있습니다.
이러한 리소스 선점 작업은 데드락을 해결하기 위한 임시적인 조치일 수 있으며, 프로세스나 스레드를 중단하거나 우선순위를 변경하는 것은 시스템의 안정성과 성능에 영향을 미칠 수 있습니다. 따라서 리소스 선점 작업을 수행하기 전에 잘 고려하고, 가능한 대안을 검토하는 것이 중요합니다.
'학습 > 웹개발 직무 수행 중 메모' 카테고리의 다른 글
IntelliJ 설치 후 기본 설정 (0) | 2024.03.08 |
---|---|
[면접] HTTP와 HTTPS의 차이점 (0) | 2023.08.21 |
[면접] 프로세스와 스레드의 차이점을 메모리 구성인 힙, 스택으로 연관해서 설명 (0) | 2023.08.21 |
[면접] 웹개발 공통 질문 (0) | 2023.08.21 |
웹 운영만하다가 웹 개발하면 헤매니까 정리 (0) | 2023.06.20 |