OS

[OS] I/O 모델

noahkim_ 2026. 9. 29. 17:11

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