[CS] 동기/비동기 처리

박원준·2025년 10월 1일

⚡ 동기 vs 비동기


✅ 동기 처리(Synchronous)

  • 정의: 하나의 작업이 끝난 뒤에야 다음 작업이 실행되는 방식
  • 특징
    • 코드 실행 흐름이 직관적이고 단순
    • 예측 가능성이 높음
    • 오래 걸리는 작업이 있으면 전체 프로세스가 지연됨

✅ 비동기 처리(Asynchronous)

  • 정의: 작업이 완료될 때까지 기다리지 않고, 다음 작업을 바로 실행하는 방식
  • 특징
    • 동시에 여러 작업을 처리 가능
    • 지연이 큰 작업(네트워크/DB I/O 등)에서 효율적
    • 흐름 제어가 복잡해지고 코드 가독성이 떨어질 수 있음

🔹 동기 vs 비동기 비교

구분동기(Sync)비동기(Async)
실행 순서순차적병렬/이벤트 기반
장점단순, 직관적성능 향상, 응답성 ↑
단점작업 지연 시 전체 대기복잡한 흐름 제어, 디버깅 어려움
활용 예시파일 읽기, 단순 계산네트워크 요청, 대용량 데이터 처리

🔹 Blocking vs Non-Blocking

  • Blocking: 호출한 작업이 끝날 때까지 제어권 반환 ❌ → 주로 동기 방식
  • Non-Blocking: 호출 즉시 제어권 반환 ⭕, 완료되면 콜백/이벤트로 알림 → 주로 비동기 방식

🔹 실무 활용 사례

  • 동기 처리
    • DB 트랜잭션 처리 (commit/rollback)
    • 간단한 연산, 순차적 실행이 중요한 로직
  • 비동기 처리
    • 웹 서버 요청 처리 (Node.js 이벤트 루프, Java NIO)
    • 메시지 큐(Kafka, RabbitMQ)
    • UI 이벤트 처리 (사용자 입력/클릭 등)

🧵 멀티스레드 동시성 문제

✅ 데드락(Deadlock)

  • 정의: 두 개 이상의 스레드가 서로의 자원을 기다리며 무한 대기 상태에 빠지는 현상

  • 발생 조건 (4대 조건)

    1. 상호 배제(Mutual Exclusion)
    2. 점유와 대기(Hold and Wait)
    3. 비선점(Non-preemption)
    4. 환형 대기(Circular Wait)
  • 해결 방법

    • 자원 획득 순서를 고정
    • 타임아웃 기반 락 사용
    • 교착 상태 탐지 알고리즘 적용

✅ 레이스 컨디션(Race Condition)

  • 정의: 둘 이상의 스레드가 동시에 같은 자원에 접근할 때, 실행 순서에 따라 결과가 달라지는 문제
  • 예시
    int count = 0;
    // 여러 스레드가 동시에 실행
    count++; // 원자적이지 않음 → Race Condition 발생
  • 해결 방법
    • synchronized 블록 사용
    • ReentrantLock 사용
    • 원자적 클래스(AtomicInteger 등) 활용

✅ 스레드풀(Thread Pool)

  • 정의: 미리 일정 개수의 스레드를 생성해두고, 작업이 들어오면 재사용하는 방식
  • 장점
    • 스레드 생성/소멸 비용 절감
    • 동시 처리 성능 향상
    • 리소스 관리 용이

🚀 요약:

  • 동기는 단순하고 직관적이지만 지연에 취약
  • 비동기는 복잡하지만 성능과 응답성을 높일 수 있음
  • 멀티스레드 환경에서는 데드락, 레이스 컨디션 같은 동시성 문제를 반드시 이해해야 함

0개의 댓글