Zettelkasten

stream은 앞으로만 쌓이고 소비되면 사라지는, 버퍼에서 순서대로 꺼내는 추상화다

·수정 1

요약

  • stream은 데이터를 순서대로 흘려보내거나 꺼내는 통로다 — 앞에서부터 읽고, 읽으면 소비되어 사라지고, 길이는 끝날 때까지 모른다.
  • 배열(random access)과 결정적으로 다르고, TCP만의 개념이 아니라 파일·stdin/stdout 등에서 쓰이는 일반 프로그래밍 추상화다.

본문

배열과의 결정적 차이

배열/메모리 파일 stream
접근 아무 데나 자유 접근 (arr[i]) 앞에서부터 순서대로만 (forward-only)
존재 전체가 이미 있음 도착한 만큼만, 나머진 나중에
읽으면 그대로 남음 소비됨 — stream에서 사라지고 읽기 포인터 전진
길이 알고 있음 끝날 때까지 모름

한 줄로: 배열은 자유 접근, stream은 앞으로만 쌓이고 소비되면 사라진다.

3가지 성질

  1. 순서대로, 앞으로만 (sequential / forward-only)
    • 읽기 포인터가 앞으로만 간다. 한 번 읽은 바이트는 지나가고 되돌아가 인덱싱 못 함.
  2. 시간에 걸쳐 도착 (over time)
    • 전체가 이미 있는 게 아니라 지금 도착한 만큼만 있음. 읽을 게 없으면 read가 기다림(block).
  3. 길이를 미리 모름 (unbounded)
    • 끝(EOF/FIN)이 언제일지 모르고, 흐르는 동안 계속 꺼낸다.

buffer 비유는 실제다

"통로 뒤에 데이터가 쌓이고 거기서 지속적으로 꺼낸다"는 모델이 물리적으로 맞다. 예: TCP는 커널에 receive buffer가 있어서 —

도착한 데이터 → 커널이 수신 버퍼에 쌓음 → 앱이 read/recv로 거기서 꺼냄
  • 버퍼에 있으면 바로 꺼내짐, 비었으면 read가 기다림
  • 앱이 안 꺼내 버퍼가 차면 송신 측을 늦춤(흐름 제어)

stream = 통로(소켓/파일 핸들 등), 그 뒤에 쌓이는 곳 = 버퍼.

위치

  • stream은 네트워크만의 개념이 아니다. 파일 읽기 스트림, stdin/stdout, Node stream, 로그 파이프 등 "바이트를 순서대로 흘려보내거나 꺼내는 통로"는 다 같은 추상화.
  • TCP는 이 stream 모델을 네트워크 위에(segment 전송 위에) 구현한 한 사례다.

참고