다양한 I/O(입출력) 호출 방식에 대해 이야기해보겠습니다.
I/O는 Inbound(입력)와 Outbound(출력)를 의미합니다. 흔히 사용하는 네 가지 주요 I/O 모델에 대해 알아보겠습니다.
동기 블로킹은 가장 단순하고 전통적인 방식입니다.
예시:
고객이 식당에 전화를 걸어 예약을 하려고 합니다. 전화를 걸면 직원이 받을 때까지 기다려야 합니다. 직원이 전화를 받으면 예약을 진행할 수 있습니다. 이 동안 고객은 전화기를 들고 아무것도 할 수 없습니다.
프로그램에서의 동기 블로킹:
애플리케이션이 서버에 요청을 보냅니다. 서버가 응답할 때까지 요청을 보낸 스레드는 아무 작업도 하지 않고 대기합니다. 즉, 블로킹 상태가 됩니다.
비동기 통신에서는 작업을 다른 사람에게 위임할 수 있습니다.
예시:
고객이 친구에게 "나 대신 식당에 전화해서 예약 좀 해줘"라고 부탁합니다. 친구는 식당에 전화를 걸어 예약을 진행하고, 고객은 그 동안 다른 일을 할 수 있습니다. 친구는 전화가 연결되길 기다려야 하지만, 고객은 블로킹되지 않습니다.
프로그램에서의 비동기 통신:
애플리케이션이 서버에 요청을 보낼 때, 요청을 다른 스레드에 위임합니다. 요청을 보낸 스레드는 다른 작업을 수행할 수 있습니다. 하지만 요청을 처리하는 스레드는 응답을 받을 때까지 블로킹됩니다.
논블로킹 통신에서는 요청을 보낸 후에도 블로킹되지 않습니다.
예시:
고객이 식당 웹사이트에 접속해 예약 요청을 남깁니다. 시스템은 "예약 요청이 접수되었습니다. 처리 후에 문자로 알려드리겠습니다"라고 안내합니다. 고객은 예약이 확정될 때까지 다른 일을 할 수 있습니다. 예약이 완료되면 시스템이 고객에게 문자를 보내 알립니다.
프로그램에서의 논블로킹 통신:
애플리케이션이 서버에 요청을 보낸 후, 스레드는 블로킹되지 않고 다른 작업을 수행할 수 있습니다. 서버가 응답을 준비하면 운영체제가 스레드에게 알립니다. 이렇게 하면 스레드는 다른 작업을 할 수 있어 자원을 효율적으로 사용할 수 있습니다.
이 모델은 비동기와 논블로킹 통신의 결합입니다. 여러 CPU를 효율적으로 사용하기 위해 여러 스레드를 활용합니다.
예시:
고객이 식당 웹사이트에 접속해 예약 요청을 남기고, 친구의 연락처를 대신 남깁니다. 시스템은 예약이 확정되면 친구에게 문자로 알립니다. 친구는 그 동안 다른 일을 할 수 있습니다. 고객도, 친구도 블로킹되지 않습니다.
프로그램에서의 비동기 논블로킹 통신:
한 스레드가 요청을 보냅니다. 응답이 올 때까지 해당 스레드는 블로킹되지 않습니다. 응답이 도착하면 운영체제가 다른 스레드에게 알림을 보내 처리하게 합니다. 이렇게 하면 여러 CPU를 활용할 수 있습니다.
리액티브 프로그래밍은 이러한 비동기 논블로킹 방식을 쉽게 구현할 수 있도록 하는 프로그래밍 모델입니다. 이를 통해 복잡한 방식을 더 단순하고 효율적으로 관리할 수 있습니다.
I/O 모델 복잡도 비교
동기 블로킹: 1 (가장 간단)
비동기: 2
논블로킹: 3
비동기 논블로킹: 4 (가장 복잡)