[리눅스 시스템 프로그래밍] 5.1 버퍼링

리눅스에서는 파일 입출력을 할 때 물리적인 파일에 조회 및 기록의 횟수를 최소화하여 성능을 높이기 위해 버퍼링 정책을 사용하고 있습니다.

 

만약 write 호출로 데이터를 쓰기 명령을 전달하면 해당 파일 작업을 위한 버퍼에 기록을 해 두었다가 정책에 따라 특정 시점에 물리적인 파일에 기록을 수행합니다. 리눅스에서 제공하는 버퍼링 정책에는 버퍼가 꽉 차면 물리적인 파일에 기록하는 FULL BUFFERING과 꽉 차거나 개행문자가 오면 처리하는 LINE BUFFERING, 버퍼를 사용하지 않는 NULL BUFFERING 정책을 제공하고 있습니

 

디폴트 버퍼링 정책은 FULL BUFFERING이며 char 장치 파일에 관한 작업은 LINE BUFFERING 정책을 사용합니다. 그리고 오류를 출력하는 stderr 파일 스트림은 NULL BUFFERING을 사용합니다.

[그림 5.1] ex_buffering 실행 화면
[그림 5.1] ex_buffering 실행 화면

putchar(‘e’);

sleep(1);

fputc(‘H’, stderr);

표준 출력은 LINE BUFFERING을 합니다. 따라서 putchar(‘e’); 구문을 호출하면 stdout 버퍼에 문자 e를 기록하지만 아직 개행 문자를 기록한 것이 아니므로 콘솔 화면에 출력하지는 않습니다. sleep(1); 구문에 의해 프로세스는 1초 멈춥니다. 그리고 fputc(‘H’, stderr); 구문에 의해 ‘H’를 표준 에러에 출력합니다. 표준 에러는 NULL BUFFERING이므로 콘솔 화면에 ‘H’문자를 바로 출력합니다.

 

putchar(‘h’);

sleep(1);

fputc(‘e’, stderr);

그리고 putchar(‘h’); 구문에 의해 stdout 버퍼에 문자 h를 출력합니다. 현재 stdout 버퍼에는 ‘e’, ‘h’가 있는 상태입니다. 다시 프로세스는 1초 멈춥니다. fputc(‘e’, stderr); 구문에 의해 stderr 버퍼에 ‘e’를 출력하며 표준 출력은 NULL BUFFERING이므로 바로 콘솔화면에 ‘e’를 출력합니다. 현재 콘솔 화면에 출력 내용은 ‘H’, ‘e’ 입니다.

 

putchar(‘\n’);

sleep(1);

fputc(‘l’, stderr);

putchar(‘\n’); 구문에 의해 stdout 버퍼에 문자 ‘\n’를 출력합니다. 현재 stdout 버퍼에는 ‘e’, ‘h’, ‘\n’가 있습니다. 표준 출력은 LINE BUFFERING이므로 콘솔 화면에 ‘e’, ‘h’, ‘\n’(개행 문자)를 출력합니다. 현재까지 출력 내용은 ‘H’, ‘e’, ‘e’, ‘h’, ‘\n’(개행 문자)입니다.

 

이처럼 계속 진행한 결과가 [그림 5.1]입니다.