SI 프로젝트 수행 중 TCP/IP 소켓 통신을 구현하다가 데드락(Dead Lock)과 레이스 컨디션(Race Condition)이 발생했었다.
관련 내용을 아래에 정리해 보자.
TCP/IP 소켓 연결에서 데드락과 레이스 컨디션 문제를 해결하기 위해서는 프로세스와 스레드의 동작 방식을 이해하고 적절한 동기화 메커니즘을 사용하는 것이 중요하다.
먼저, 데드락(교착 상태)은 두 개 이상의 프로세스나 스레드가 서로의 자원을 기다리며 무한히 대기하는 상황을 말한다.
이를 해결하기 위해서는 자원 할당 순서를 정하고, 자원을 요청할 때 타임아웃을 설정하여 일정 시간 내에 자원을 얻지 못하면 요청을 취소하고 나중에 다시 시도하는 방법을 사용할 수 있다.
레이스 컨디션은 두 개 이상의 스레드가 공유 자원에 동시에 접근할 때 발생하는 문제로, 예상치 못한 결과를 초래할 수 있다.
이를 해결하기 위해서는 동기화 메커니즘을 사용하여 스레드 간의 자원 접근을 제어해야 한다.
예를 들어, 뮤텍스(Mutex)나 세마포어(Semaphore)를 사용하여 동시 접근 스레드 수를 조정하여 한 번에 하나의 스레드만 공유 자원에 접근할 수 있도록 할 수 있다.
데드락이나 레이스 컨디션을 회피할 디자인 패턴은 아래와 같다.
싱글톤 패턴 (Singleton Pattern): 인스턴스가 하나만 존재하도록 구성하여 자원 접근을 제어한다.
뮤텍스 (Mutex)와 세마포어 (Semaphore): 임계 구역을 설정하여 동시 접근을 방지한다.
모니터 패턴 (Monitor Pattern): 객체의 메서드가 동기화되어 한 번에 하나의 스레드만 접근할 수 있도록 한다.
락 객체 패턴 (Lock Object Pattern): 명시적인 락 객체를 사용하여 동기화 문제를 해결한다.
이벤트 기반 비동기 패턴 (Event-based Asynchronous Pattern): 이벤트를 사용하여 비동기적으로 작업을 처리한다.
대표적인 이벤트 기반 비동기 패턴으로는 옵서버 패턴이 존재한다.
- 끝 -
'플젝 구현내용 정리' 카테고리의 다른 글
그라파나(Grafana), 프로메테우스(Prometheus), MongoDB (1) | 2024.09.03 |
---|---|
DBMS 인덱스 적용 사례 (0) | 2024.09.03 |
RAID 구현 연구 사례 (AWS EC2, RAID 1+0) (0) | 2024.09.03 |
Scalable Distributed Systems 구축 사례 정리 (0) | 2024.09.03 |
OSI 7 Layer와 AWS 인프라 (0) | 2024.09.03 |