1. 전체 흐름
[송신 애플리케이션]
User Space
│ write()
▼
[커널 송신 버퍼]
Kernel Space
│
▼
NIC
│
Network
│
▼
[상대방 커널 수신 버퍼]
│ read()
▼
[상대방 애플리케이션]
- 네트워크 I/O는 애플리케이션끼리 직접 데이터를 주고받는 것이 아니라 커널의 소켓 버퍼를 거쳐서 처리됨
2. 커널 소켓 버퍼
| 구분 | 역할 |
| Send Buffer | Application이 write()한 데이터를 네트워크로 보내기 전 임시 저장 |
| Receive Buffer | 네트워크에서 받은 데이터를 Application이 read()하기 전 임시 저장 |
3. I/O 처리 모델
Blocking I/O
- 현재 I/O를 수행할 수 없다면 호출한 Thread를 기다리게 하는 방식
- ✅ Receive Buffer에 데이터가 없다면 데이터가 도착할 때까지 해당 스레드 대기
- ✅ Send Buffer에 충분한 공간이 없다면 공간이 생길때까지 계속 대기
Non-blocking I/O
- 현재 I/O를 수행할 수 없으면 Thread를 기다리게 하지 않고 즉시 반환하는 방식
- ✅ I/O Multiplexing을 통해 여러 Socket 중 I/O 가능한 상태가 된 Socket을 효율적으로 확인
- ✅ Java NIO의 Selector가 I/O Multiplexing를 지원함
- ✅ Event Loop가 Selector를 반복적으로 확인하면서 준비된 I/O 이벤트를 받아 실제 read() / write() 작업을 처리
- ✅ Java의 Netty는 이러한 Non-Blocking + Event Driven I/O 구조를 추상화한 네트워크 프레임워크임
흐름) Non-Blocking I/O
더보기
Socket A ─┐
Socket B ─┤
Socket C ─┼──→ Selector
Socket D ─┘ │
│
"Socket B 읽기 가능"
│
▼
Event Loop
│
▼
Socket B read()
│
▼
다음 이벤트 처리
4. write() 반환 ≠ 상대방이 받음
- Socket의 write() 반환은 일반적으로 해당 데이터가 커널의 Send Buffer에 받아들여졌다는 의미
- ➡️ 상대방 애플리케이션이 데이터를 읽었다는 뜻은 아님
'OS' 카테고리의 다른 글
| [따배셸] 4. Bash Shell Script (0) | 2025.03.31 |
|---|---|
| [따배셸] 3. Bash Shell과 Rules (0) | 2025.03.31 |
| [따배셸] 2. Bash Shell과 변수 (0) | 2025.03.31 |
| [따배셸] 1. Linux Shell 이란? (0) | 2025.03.31 |