비동기 프로그래밍에서 'deadlock'이란 무엇인가요?
_____1. Q: 데드락이란 무엇인가요?
A: 데드락은 둘 이상의 작업(스레드, 코루틴, 태스크 등)이 서로가 점유한 자원을 기다리느라 영원히 진행되지 못하는 상태를 말합니다.
- 각 작업이 상대방이 해제해야 할 자원을 점유하고 있음
- 자원 요청과 해제가 교착 상태에 빠져 더 이상 진행 불가
2. Q: 동기 프로그래밍의 데드락과 비동기 프로그래밍의 데드락 차이는 무엇인가요?
A:
- 동기: 스레드 간 락(lock) 획득 순서 꼬임이 주 원인
- 비동기: 락뿐 아니라 await/continuation, 이벤트 루프, 콜백 체인 간 순환 대기에서도 발생
- 비동기는 스레드 블로킹 없이도 “진행 지연”이 데드락 형태로 이어질 수 있음
3. Q: 비동기 데드락이 발생하는 주요 원인은?
A:
- 잘못된 await 패턴(예: .Result, .Wait() 사용)
- 이벤트 루프(reactor) 내부에서 동일 작업 간 재진입 차단
- 프로미스 혹은 태스크 간 순환 참조하여 서로의 완료를 무한 대기
- 리소스(데이터베이스 연결, 파일 핸들 등) 분배·회수 로직 충돌
4. Q: 간단한 예시를 들어 설명해 주세요.
A:
1) A 작업이 데이터베이스 트랜잭션을 획득
2) A 작업이 내부 비동기 함수 B를 await
3) B 작업이 같은 트랜잭션 자원에 접근 대기
4) 트랜잭션은 A가 해제할 때까지 잠겨있어 B가 진행 못 함
5) A는 B 완료를 기다리며 대기 → 교착 상태
A:
- 로깅: await 진입·종료 시점 기록
- 스택 트레이스: 이벤트 루프 지연 태스크 확인
- 타임아웃 설정: 특정 시간 이상 대기 시 예외 발생
- 진단 도구: Visual Studio 비동기 진단기, Node.js ––inspect
6. Q: 데드락을 예방·해결하는 방법은 무엇인가요?
A:
- await/async 패턴 일관성 유지(절대 동기 블로킹 호출 금지)
- 락 획득 순서 명확히 정의
- 비동기 락 라이브러리 사용(e.g. async-lock, SemaphoreSlim)
- 최대 대기 시간(timeout) 설정 후 예외로 복구 로직 실행
- 리소스 해제 책임 분리(try/finally, using 문)
7. Q: 실무에서 주의할 모범 사례(best practices)는?
A:
- 단일 책임 원칙: 함수가 너무 많은 자원 제어 책임 지지 않기
- 코드 리뷰: await 흐름·락 사용 패턴 집중 점검
- 문서화: 자원 획득·해제 순서 명시
- 경량화: 가능한 한 공유 자원 최소화
- 테스트: 스트레스·경합 상황 자동화 테스트
8. Q: 추가로 참고할 만한 자료는?
A:
- “Concurrency in C Cookbook” (Stephen Cleary)
- Node.js 공식 문서 – 이벤트 루프와 비동기 I/O
- Python asyncio 문서 – Deadlock and Tasks 섹션
- 각 언어별 비동기 디버거 및 프로파일러 활용 가이드
작성자:
박지현 [비회원]
| 작성일자: 1년 전
2024-09-12 16:03:43
조회수: 203 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 203 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.