[CSAPP 10장 골라읽기] 10.5 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복

2025. 5. 5. 13:40·크래프톤 정글/컴퓨터구조(CSAPP)
목차
  1. 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복
  2. 시스템 콜 수준의 I/O, 왜 믿을 수 없을까?
  3. rio_readn(), rio_writen()으로 short count를 처리하는 방식
  4. 줄 단위 처리까지 지원하는 버퍼링 함수들
  5. Rio 내부 구조(rio_t) 간단하게 뜯어보기
  6. Unix I/O와 Rio I/O 비교
  7. Rio는 Tiny Web Server에서도 필수
  8. 마치면서

안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복

이번 포스트에서는 네트워크와 파일 I/O에서 반드시 마주치는 불편한 진실인 short count 문제와 그 해결책인 RIO(Robust I/O) 패키지를 살펴보겠습니다.

 

이 글에서는 CSAPP 10.5의 내용을 바탕으로 우리가 흔히 쓰는 read(), write() 시스템 콜이 왜 신뢰할 수 없는지, 그리고 rio_readn(), rio_writen(), rio_readlineb()가 어떤 원리로 안정적인 I/O를 보장하는지 정리해 봅니다.

 

 

시스템 콜 수준의 I/O, 왜 믿을 수 없을까?

short count 문제

  • read(), write()는 요청한 만큼의 바이트를 처리하지 않을 수 있다
  • 특히 소켓, 파이프 등 네트워크 I/O에서 흔하게 발생한다
  • 이유: EINTR 인터럽트, 내부 커널 버퍼 부족 등

해당 문제로 인해, 실제로는 while() 루프로 반복 호출해서 누락된 바이트를 메꾸는 처리가 필요해집니다.

 

 

rio_readn(), rio_writen()으로 short count를 처리하는 방식

rio_readn(fd, usrbuf, n)

  • n바이트를 읽을 때까지 내부적으로 read()를 반복 호출
  • 중단되거나 적게 읽힌 경우에도 누적하여 끝까지 채움

rio_writen(fd, usrbuf, n)

  • write()로 일부만 보내졌을 경우, 남은 데이터를 계속 write
  • 파일뿐 아니라 소켓 통신에서도 신뢰성 확보

즉, 두 함수는 시스템 콜을 '성공할 때까지' 반복 호출함으로써 short count를 처리하고, 안정적인 바이트 입출력을 보장합니다. 참고로 여기서 사용하는 usrbuf는 사용자에게 데이터를 넘겨주기 위한 최종 목적지일 뿐이며, rio가 사용하는 내부 버퍼(rio_buf)와는 별개입니다.

 

 

줄 단위 처리까지 지원하는 버퍼링 함수들

rio_readinitb()

  • 버퍼 구조체(rio_t)를 초기화
  • 내부 버퍼를 설정하고 fd 연결

rio_readlineb()

  • 한 줄(개행까지)을 안정적으로 읽어옴
  • HTTP 헤더 같은 텍스트 프로토콜에 최적

rio_readnb()

  • n 바이트만큼 읽지만, 내부적으로 한 번에 더 큰 덩어리를 읽어 내부 버퍼에 저장
  • 다음 요청 시 시스템 콜 없이 버퍼에서 바로 처리 → 빠르고 효율적

핵심은 한 번 read()를 호출해 큰 덩어리로 읽어온 뒤, 여러 번 메모리에서 꺼내 사용자에게 빠르게 제공한다는 점입니다.

 

 

Rio 내부 구조(rio_t) 간단하게 뜯어보기

typedef struct {
  int rio_fd;              // 읽을 파일 디스크립터
  int rio_cnt;             // 버퍼에 남은 바이트 수
  char *rio_bufptr;        // 다음 읽기 위치
  char rio_buf[RIO_BUFSIZE]; // 내부 버퍼
} rio_t;

즉, 시스템 콜로 읽어온 내용을 사용자 공간에 캐시해서 매번 커널 호출 없이도 빠르게 읽을 수 있게 해줍니다.

 

 

Unix I/O와 Rio I/O 비교

구분 Unix I/O (read/write) Rio 패키지
short count 발생 가능 (직접 처리 필요) 자동 반복 호출로 방지
버퍼링 없음 내부 버퍼 사용
줄 단위 읽기 직접 구현 필요 rio_readlineb() 제공
사용성 낮음 (낮은 수준) 높음 (고수준 wrapper)

곧 성능과 안정성을 모두 잡고 싶다면 Rio를 선택해야 합니다.

 

 

Rio는 Tiny Web Server에서도 필수

Tiny 서버에서는 Rio를 다음처럼 사용합니다.

  • rio_readlineb() - HTTP 요청 줄 및 헤더 읽기
  • rio_writen() - 응답 헤더와 본문을 안정적으로 전송

Rio 덕분에 네트워크 환경에서도 신호로 인한 끊김, 누락 없이 부드러운 I/O 흐름을 유지할 수 있죠.

 

 

마치면서

우리가 평소 당연하게 여기는 read(), write()가 사실은 그렇게 믿을 만한 친구가 아니라는 것을 알게 되는, 순간 시스템 프로그래밍이 달리 보이기 시작합니다. Rio는 단순한 보조 도구가 아니라, 네트워크 프로그래밍에서 거의 표준처럼 쓰이는 기본기라고 할 수 있지요. 이제 rio_t와 rio_readlineb()를 사용할 수 있다면, 여러분은 이미 Tiny 서버의 동작 원리 절반 이상을 이해하고 있다고 할 수 있습니다.

저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글

[CSAPP 12장 골라읽기] 12.3 스레드를 이용한 동시성 프로그래밍 빠삭하게 이해하기  (0) 2025.05.05
[CSAPP 11장 완전 정복] 11.5~11.6(Part3) Tiny 웹 서버 확장성과 실전 응용  (1) 2025.05.03
[CSAPP 11장 완전 정복] 11.5~11.6(Part 2) Tiny 웹 서버 구조 뜯어보기  (1) 2025.05.03
[CSAPP 11장 완전 정복] 11.5~11.6(Part 1) 웹 서버의 세계로 한 걸음, Tiny는 왜 필요한가?  (0) 2025.05.03
CSAPP 11.5~11.6 rawdata 공유 (전체 학습 목표, 학습 정리 자료)  (0) 2025.05.03
  1. 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복
  2. 시스템 콜 수준의 I/O, 왜 믿을 수 없을까?
  3. rio_readn(), rio_writen()으로 short count를 처리하는 방식
  4. 줄 단위 처리까지 지원하는 버퍼링 함수들
  5. Rio 내부 구조(rio_t) 간단하게 뜯어보기
  6. Unix I/O와 Rio I/O 비교
  7. Rio는 Tiny Web Server에서도 필수
  8. 마치면서
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 12장 골라읽기] 12.3 스레드를 이용한 동시성 프로그래밍 빠삭하게 이해하기
  • [CSAPP 11장 완전 정복] 11.5~11.6(Part3) Tiny 웹 서버 확장성과 실전 응용
  • [CSAPP 11장 완전 정복] 11.5~11.6(Part 2) Tiny 웹 서버 구조 뜯어보기
  • [CSAPP 11장 완전 정복] 11.5~11.6(Part 1) 웹 서버의 세계로 한 걸음, Tiny는 왜 필요한가?
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무) N
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 10장 골라읽기] 10.5 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.