동기(Synchronous)와 비동기(Asynchronous)
동기는 미팅에서 대화하는 것, 비동기는 채팅이나 이메일로 대화하는 것. devramyun
🧵 동기(Synchronous) 🔹 정의
호출자는 요청을 보내고, 응답을 받을 때까지 기다리며(blocking) 아무 일도 하지 못함.
- 클라이언트 → 서버에 요청(Request)
- 서버 → 작업 처리 → 응답(Response)
- 이 사이, 클라이언트는 아무 작업도 하지 못하고 대기
- read() 같은 파일 I/O 시스템 호출은,
- 메인 스레드가 CPU에서 내려옴 (blocked)
- 디스크 읽기가 끝날 때까지 아무 일도 못함
- 처리 지연 시 전체 흐름 차단
- 비효율적 CPU 자원 활용
- 고부하 시스템에 불리
🔀 비동기(Asynchronous) 🔹 정의
요청을 보내고, 응답을 기다리지 않고 다른 일을 수행할 수 있음. 응답은 나중에 도착하며, 도착 시점에 콜백 또는 알림으로 처리됨.
- 응답이 준비되었는지 주기적으로 확인 (epoll, select)
- 작업 완료 후, 등록한 함수가 자동 실행 (io_uring)
- 별도의 스레드가 blocking I/O를 수행하고 결과를 전달
- 파일을 읽을 때 별도 스레드에 맡김
- 메인 스레드는 계속 실행됨
- 완료되면 콜백 함수를 호출하여 결과 처리
🔁 동기 vs 비동기: 요청-응답 모델에서의 차이
| 구분 | 동기 (Synchronous) | 비동기 (Asynchronous) |
|---|---|---|
| 요청 후 처리 | 응답까지 기다림 | 응답 없이 바로 다음 작업 |
| CPU 사용 | 비효율적 (대기) | 효율적 |
| 구현 복잡도 | 단순 | 다소 복잡 (콜백, 이벤트) |
| 예시 | Python의 requests, Java의 기본 I/O | Python aiohttp, Node.js, Java NIO |
💬 비유로 쉽게 이해하기
| 상황 | 동기 | 비동기 |
|---|---|---|
| 질문 | 사람에게 직접 묻고 대답을 기다림 | 이메일 보내고 다른 일 하다가 답장을 받음 |
| 전화 | 상대가 받을 때까지 계속 대기 | 음성 메시지 남기고 나중에 응답 받음 |
- 프로그래밍 패턴: async/await, Promise, Future, Callback
- 데이터베이스: PostgreSQL의 비동기 커밋
- 백엔드 서버: 비동기 요청 처리 (FastAPI + Starlette)
- 파일 시스템: Linux epoll, io_uring 등 고성능 I/O
- 복제 시스템: 비동기 복제(replication)
- fsync: 비동기 파일 동기화 (write-back cache)
- 동기는 간단하지만 대기가 필요하고,
- 비동기는 복잡하지만 유연하고 효율적입니다.
- 대규모, 고성능 시스템일수록 비동기 구조가 요구됩니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.