I/O란?
- Input/Output이라고 부르며, 프로그램이 외부와 데이터를 주고받는 작업이다.
- 네트워크에서의 I/O
: 서버가 클라이언트의 요청을 받아 응답을 돌려주는 과정이다. - 예시
- 파일 읽기/쓰기
- 네트워크 요청 처리(웹 서버와 클라이언트의 HTTP 요청/응답)
- 위의 이미지는 네트워크 I/O 흐름을 간단하게 표현한 다이어그램이다.
- 클라이언트가 서버에 요청을 보내고, 서버가 응답을 돌려주는 과정이다.
동기(Synchronous) I/O와 비동기(Asynchronous) I/O
동기 I/O
- I/O 작업이 완료될 때까지 대기하는 방식이다.
- I/O 작업이 끝나기 전까지 다음 코드 실행이 불가능하다.
cf ) 동기
- 사전적으로 '동시에 일어난다'는 의미를 가지고 있다.
- 프로그래밍에서의 동기는 작업이 순차적으로 진행되는 것을 의미한다.
비동기 I/O
- I/O 작업을 요청하면, 응답 상태와 상관없이 다음 동작을 수행한다.(= 작업의 순서가 보장되지 않는다.)
- 작업이 완료되면 별도의 이벤트나 콜백으로 알림을 받는다.
cf ) 비동기
- 사전적으로 '동시에 일어나지 않는다'는 의미를 가지고 있다.
cf ) 이벤트(Event)
- 비동기 작업이 끝나면 어떤 일이 발생했다는 신호를 주는 것이다.
cf ) 콜백(Callback)
- 위의 이벤트가 발생했을 때, 자동으로 실행되는 함수이다.
- 작업이 끝난 후 어떤 동작을 할지 정해놓는 것
- 예
: 파일 다운로드가 끝나면, 콜백 함수가 실행되어 "다운로드 완료" 메시지를 출력하거나 파일을 처리하는 작업을 시작한다.
Blocking I/O와 Non-Blocking I/O
Blocking I/O
- I/O 작업이 완료될 때까지 스레드가 대기하는 방식
- 예시
: 클라이언트가 서버에 요청을 보내면, 서버가 그 요청을 처리하는 동안 아무것도 하지 않고 대기한다. - 장점
: 이해하기 쉽고 구현이 간단하다. - 단점
: 요청이 많아지면 서버가 여러 요청을 동시에 처리하지 못하고, 대기 시간이 길어질 수 있다.
- 애플리케이션에서 Read함수를 호출해 커널에 read I/O를 요청하면, read가 끝날 때까지 애플리케이션은 block이 되어 다른 작업을 하지못하고 대기한다.
= read I/O가 수행될 때까지는 애플리케이션이 다른 작업을 수행하지 못한다는 것을 의미
cf ) 커널이란?
- 하드웨어와 소프트웨어 사이의 중간자 역할을 한다.
- I/O 작업이 일어난 후 커널이 없다면, 애플리케이션이 하드웨어를 제어할 수 없고, I/O 작업이 불가능하다.
- Blocking I/O 시스템 호출은 I/O가 완료될때 까지 반환하지 않는다.
Non-Blocking I/O
- I/O 작업을 요청한 후, 작업이 완료되지 않았더라도 스레드가 다른 작업을 처리할 수 있는 방식이다.
- 예시
: 클라이언트가 서버에 요청을 보냈을 때, 서버는 그 요청을 바로 처리하지 않고 다른 요청도 동시에 처리 가능하다. - 장점
: 동시성 처리에 유리하며, 많은 요청을 효율적으로 처리할 수 있다. - 단점
: 구현이 복잡하고, 코드의 가독성이 떨어질 수 있다.
- read I/O를 하기 위해 system call을 수행하면, 커널의 I/O작업 완료 여부와는 무관하게 즉시 응답한다.
- 커널이 시스템 콜을 받자마자 CPU 제어권을 다시 애플리케이션에게 넘겨주고, 따라서 애플리케이션은 I/O 작업이 완료되기 전에 다른 작업을 수행할 수 있다.
- 애플리케이션은 다른 작업들을 수행하다가 중간중간 시스템 콜을 보내서 I/O가 완료됐는지 커널에게 물어보고, 완료되면 I/O 작업을 완료한다.
- Non-Blocking I/O 시스템 호출은 즉시 반환되며, 프로세스는 나중에 I/O가 완료되면 알림을 받는다.
Blocking I/O와 Non-Blocking I/O의 비교
구분 | Blocking I/O | Non-Blocking I/O |
스레드 대기 여부 | 대기함 | 대기하지 않음 |
성능 | 동시성 처리 어려움 | 많은 동시 요청 처리 가능 |
구현 난이도 | 쉬움 | 어려움 |
사용 사례 | 간단한 애플리케이션이나 작은 규모의 서버 등 |
실시간 채팅 서버, 대규모 네트워크 서비스 등 |
실생활 비교
I/O 작업 처리의 4가지 방식
Blocking I/O vs Non-Blocking I/O는 제어권의 차이
- Blocking: 제어권이 반환되지 않고 함수가 끝날 때까지 기다린다.
- Non-Blocking: 제어권이 즉시 반환되어 함수가 완료되지 않아도 다른 작업을 계속할 수 있다.
Sync I/O vs Async I/O는 작업 완료 후의 처리 방식의 차이
- Sync(동기): 작업이 완료된 후에만 다음 작업을 처리한다.
- Async(비동기): 작업이 완료되지 않아도 즉시 반환되며, 작업 완료 후 나중에 콜백이나 이벤트를 통해 후속 작업을 처리한다.
- Synchronous + Blocking (동기식 + 블로킹)
: 여기에서는 Read/Write 방식으로, 작업이 끝날 때까지 기다린다. - Synchronous + Non-Blocking (동기식 + 논블로킹)
: 이 방식에서는 작업이 끝날 때까지 기다리지 않고, Polling으로 확인하며 다른 작업을 할 수 있다. - Asynchronous + Blocking (비동기식 + 블로킹)
: I/O 멀티플렉싱(Select/Poll) 방식으로, 비동기적으로 여러 작업을 처리하지만, 각각의 작업이 완료될 때까지 대기한다. - Asynchronous + Non-Blocking (비동기식 + 논블로킹)
: 가장 효율적인 방식으로, I/O 작업이 완료되지 않아도 다른 작업을 하면서, 완료되면 알림을 받아 처리하는 방식입니다.
'TIL(Today I Learned)' 카테고리의 다른 글
[Spring] QueryDSL 관련 코드 정리 (2) | 2024.10.10 |
---|---|
[Spring] Spring Security 관련 코드 정리 (3) | 2024.10.04 |
[내배캠] 아웃소싱 프로젝트 후 KPT 회고 작성 (0) | 2024.09.25 |
[Java] Jwt Filter & 인증/인가 관련된 코드들 정리 (0) | 2024.09.11 |
[MYSQL] 시간 차이 구하는 방법 3가지 (0) | 2024.09.05 |