๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“SUBJECT/๐Ÿ“š์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ

[์‹œ์Šคํ…œํ”„๋กœ๊ทธ๋ž˜๋ฐ/Linux] 2. File I/O(1)

by Yun Je 2020. 5. 6.

1. Linux System Calls

๋ฆฌ๋ˆ…์Šค์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ ์ฝœ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

  • File descriptor I/O
    • open(); close(); creat(); read(); write();
    • seek();   // random access
    • fcntl();   // for file/record locking
  • Process control
  • Thread programming
  • IPC
  • Signal handling
  • Memory management
  • Synchronization
  • Time management
  • Network socket API(TCP, UDP)

๊ทธ ์ค‘ File descriptor I/O์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. 

 

2. System Calls & Library Calls for File I/O

ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์„ ํ†ตํ•œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

  • System Calls for File descriptor I/O
    • open(); close(); creat(); read(); write();
    • seek();
    • fcntl();
  • Library Calls for File I/O
    • fopen(); freopen(); fclose(); fread(); fwrite();
    • fgetc(); fgetchar(); fputc; putchar(); ....
    • fseek(); fprintf(); fsanf(); ...

3. System Calls vs. Library Calls

์‹œ์Šคํ…œ ์ฝœ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์‹œ์Šคํ…œ ์ฝœ์€ ์šด์˜์ฒด์ œ ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์€ ์šด์˜์ฒด์ œ ๋ฐ–์— ์กด์žฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ž…๋‹ˆ๋‹ค. 

์‹œ์Šคํ…œ ์ฝœ์€ ์ปค๋„์˜ ๋‚ด๋ถ€์— ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €๊ฐ€ ์ปค๋„์— ์ง„์ž…ํ•˜๋Š” entry point๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์€ ์ปค๋„ ๋ฐ–์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €์˜ ์ฝœ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ์‹œ์ผœ์„œ ์ปค๋„์— ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์€ API(application programming interface)๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. 

 

4. Library

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋„ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์„ ๋ถ€๋ฅด๋ฉด, ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ ์ปค๋„์— ์žˆ๋Š” ์‹œ์Šคํ…œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ํ”„๋กœ๊ทธ๋žจํ™” ์‹œ์ผœ์„œ ๋งŒ๋“ค์–ด ๋†“์€ object program๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ผ๋ฐ˜์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์†Œ์Šค์ฝ”๋“œ ํ˜•ํƒœ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๊ณ , ์ปดํŒŒ์ผ๋œ object ํ˜•ํƒœ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

e.g. Grapic Lib, Mathematical Lib, etc...

 

๋ฆฌ๋ˆ…์Šค์—์„œ ๊ฐ์ข… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ "/lib" ๋˜๋Š” "usr/lib"์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์œ ์ €๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API ํ•จ์ˆ˜๋“ค์„ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด callํ•ด์„œ ์ง์ ‘ ์‹คํ–‰์‹œ์ผœ ์ฃผ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. 

์‹ค์ œ๋กœ library function์„ ์œ ์ €๊ฐ€ callํ•˜๋ฉด ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ฝœ์„ ํ•  ๋•Œ link๋˜์–ด์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. 

์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ปดํŒŒ์ผ ํ•˜๋ฉด ์‹คํ–‰ํŒŒ์ผ์ด ๋‚˜์˜ค๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ์‹คํ–‰ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋“ค์„ ๋ถˆ๋Ÿฌ์“ฐ๊ธฐ ์œ„ํ•ด์„œ linker๋ผ๊ณ ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์•ˆ์— ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ library function์„ linking์‹œ์ผœ์ค๋‹ˆ๋‹ค. 

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•œ ๋งˆ๋””๋กœ ์ •๋ฆฌํ•˜๋ฉด "์œ ์ €๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ํ•จ์ˆ˜ํ™” ์‹œ์ผœ์„œ ๋งŒ๋“ค์–ด ๋†“์€ ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” object" ์ž…๋‹ˆ๋‹ค. 

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

  • Shared library (*.so, *.dll)
    • ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -> ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉ. ์‹คํ–‰ ๋ฃจํ‹ด์ด ๋ฉ”๋ชจ๋ฆฌ์— ํ•˜๋‚˜๋งŒ ์กด์žฌ 
    • ํ•จ์ˆ˜์˜ ๋ณต์‚ฌ๋ณธ ํ•˜๋‚˜๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ. ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ„์— ๊ณต์œ  (memory saving)
    • ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋Š” ์‹คํ–‰ํ•˜๋Š”๋™์•ˆ resolve๋จ. (dynamic linking or binding)
    • dynamic linking์„ ์œ„ํ•œ symbol table์ด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์Œ (memory overhead)
    • ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์‹œ์— ๋Œ์•„๊ฐˆ ๋•Œ ์œ ์šฉํ•จ
  • Static library (*.a)
    • ๋™์ผํ•œ ๋™์ž‘์„ ํ•˜๋Š” ์ฝ”๋“œ๋ผ๋„ ๊ฐ๊ฐ์˜ ํ”„๋กœ๊ทธ๋žจ์— ๋ชจ๋‘ ๋…๋ฆฝ์ ์œผ๋กœ staticํ•˜๊ฒŒ ์‹คํ–‰ํŒŒ์ผ์— ๋“ค์–ด๊ฐ
    • ์ปดํŒŒ์ผ ํ•  ๋•Œ, ๊ฐ binary program์— ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ๋”ํ•ด์คŒ
    • ๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜์˜ ๋™์ผํ•œ ๋ณต์‚ฌ๋ณธ ๋ช‡ ๊ฐœ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•จ(memory overhead)
    • embedded systems์—์„œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ
    • ๋งํฌํ•˜๋Š” ๋™์ž‘(jump)์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์€ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋จ. but ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง

5. Standard I/O Library

<staio.h>

 : (์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ˜์†”๊ณผ ํŒŒ์ผ์—์„œ) standard I/O ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ symbol๊ณผ API๋ฅผ ์ •์˜ํ•˜๋Š” ํ—ค๋”ํŒŒ์ผ

file I/O๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์ด ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

6. FILE object in C

<stdio.h> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ด ๋˜๋Š”๋ฐ, ๊ทธ ๊ฐ์ฒด๊ฐ€ I/O stream object์ž…๋‹ˆ๋‹ค. 

  • ํฌ์ธํ„ฐ FILE* ํ˜•ํƒœ๋กœ ๋„˜๊ฒจ๋ฐ›์Œ
  • ํŒŒ์ผ ์ŠคํŠธ๋ฆผ ํฌ์ธํ„ฐ๋Š” open file์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•จ 
  • ํŒŒ์ผ ํฌ์ธํ„ฐ๋Š” open file์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ์Œ

ํŠน๋ณ„ํžˆ shell์˜ ๊ฒฝ์šฐ stdio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ I/O stream์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ 3๊ฐœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 -> stdin, stdout(ํ‘œ์ค€์ž…์ถœ๋ ฅ), stderr(ํ‘œ์ค€ ์—๋Ÿฌ)

 

7. File descriptor

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์˜ ๊ฒฝ์šฐ์—๋Š” iostream ๊ฐ์ฒด์ธ FILE*๋ฅผ ์ด์šฉํ–ˆ๋Š”๋ฐ, ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ์Šคํ…œ ์ฝœ์„ ์ด์šฉํ•  ๊ฒฝ์šฐ FILE* ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  File descriptor๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

  • open file์— ๋Œ€ํ•œ file descriptor๋Š” ํ•˜๋‚˜์˜ integer ์ˆซ์ž์— ๋Œ€์‘ํ•จ
  • descriptors 0, 1, 2๋Š” ๊ฐ๊ฐ stdin, stdout, stderr์— assign๋จ
  • user open file์— ๋Œ€ํ•ด, file descriptor๋Š” 3๋ถ€ํ„ฐ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ํ• ๋‹น๋จ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์ตœ๋Œ€ 1024๊ฐœ์˜ ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์žˆ์Œ

๊ถ๊ทน์ ์œผ๋กœ standard I/O library function(FILE* ๊ฐ์ฒด)์€ library function์ด ์‹ค์ œ ์ปค๋„์— ์ ‘๊ทผํ•ด์„œ system call์„ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, printf, fprintf, puts, ... ๋Š” write()๋ฅผ ๋ถˆ๋Ÿฌ ์ปค๋„์˜ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์™œ Library๋ฅผ ์‚ฌ์šฉํ• ๊นŒ์š”?

๊ทธ ์ด์œ ๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๋” ํŽธ๋ฆฌํ•˜๊ณ , formatting์ด ์žˆ๊ณ , ์„ฑ๋Šฅ์ ์ธ ์ธก๋ฉด์—์„œ๋Š” user level buffering์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 

8. File stream & File Descriptor

file stream์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ , file descriptor๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋Š” 1:1๋กœ mapping ๋ฉ๋‹ˆ๋‹ค.

(๋˜ํ•œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜ ์ด๋Š” ๋“œ๋ฌธ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. )

 

๋”ฐ๋ผ์„œ, ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์˜ ํ•จ์ˆ˜๋“ค์„ ์ด์šฉํ•ด ๊ฐ๊ฐ์˜ ๋Œ€์‘๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

#include <stdio.h>
int fileno(FILE *stream);

์ด๋Š” open๋œ FILE stream์— ๋Œ€ํ•œ file descriptor number์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

#include <stdio.h>
FILE *fdopen(int fildes, const char *mode);

์ด๋Š” argument๋กœ file descriptor number๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ , ํŒŒ์ผ์˜ ๋ชจ๋“œ(์ฝ๊ธฐ/์“ฐ๊ธฐ)๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด 

์ด์— ๋Œ€์‘๋˜๋Š” FILE* ๊ฐ์ฒด(file stream object)๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

9. Library buffering

stdio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (FILE*)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” FILE I/O์—์„œ๋Š” library buffering์ด๋ผ๋Š” ๊ฐœ๋…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์—์„œ buffer๋ž€, ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. 

๊ทธ๋ž˜์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„ํผ๋ž€, ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ ์ „์— ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•ด๋†“๊ณ  ์ž„์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์„ ๋งํ•ฉ๋‹ˆ๋‹ค. 

 

FILE*๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ์„ ์—ด์–ด์„œ file์— ๋ฐ์ดํ„ฐ๋ฅผ writeํ•  ๋•Œ, ์ง์ ‘์ ์œผ๋กœ ํŒŒ์ผ์— ์“ฐ์ง€ ์•Š๊ณ  ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ ์ฝœ์„ ๋ถ€๋ฅด๋Š” ํšŸ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

๋ฐ์ดํ„ฐ๋ฅผ file์— ์“ฐ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปค๋„์— ์“ฐ๊ธฐ ์š”์ฒญ์„ ํ•ด์„œ (์‹œ์Šคํ…œ ์ฝœ์„ ๋ถˆ๋Ÿฌ์„œ) ๋ฐ์ดํ„ฐ๋ฅผ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

์ด ๋•Œ ์‹œ์Šคํ…œ ์ฝœ์„ ๋งŽ์ด ๋ถ€๋ฅด๋ฉด ์‹œ์Šคํ…œ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํผ์— ๋ชจ์•„์„œ ์ด๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์“ฐ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

stdio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฒ„ํผ๋ง์„ ํ•˜๋Š” ๋ฐฉ์‹์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

  • Full buffering
    • lib-level buffer
    • disk block๋‹จ์œ„๋กœ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ์žก์Œ(multiple KBs... 4KB, 8KB...) 
    • ์‹œ์Šคํ…œ ์ฝœ ํšŸ์ˆ˜๋ฅผ ์ƒ๋‹นํžˆ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
    • ๋ฒ„ํผ๋ฅผ ์ฒด์šฐ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์จ์•ผํ•˜๋Š” ๊ฒฝ์šฐ, fflush()๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์„ ํ†ตํ•ด ๋ฒ„ํผ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒด์›Œ์ง€์ง€ ์•Š๋”๋ผ๋„ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • Line buffering
    • shell์˜ console I/O์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•จ
    • keyboard์— "enter"๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ ๊นŒ์ง€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ bufferingํ•จ
    • getchar() problem : enter์„ ์น˜์ง€ ์•Š๊ณ  ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ
    • full buffering์— ๋น„ํ•ด ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ compactํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
  • Unbuffering
    • ๋ฒ„ํผ๋ง์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ•„์š”๊ฐ€ ์—†์Œ
    • ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ๋งˆ๋‹ค(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์„ ํ•  ๋•Œ ๋งˆ๋‹ค) ์‹œ์Šคํ…œ ์ฝœ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š์Œ
    • ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ์œ ์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ

Linux Library Buffering

 - stderr : ํ•ญ์ƒ unbuffering -> ํ•ญ์ƒ reporting๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ

 - stdin/stdout : line buffering -> console์— ์ถœ๋ ฅํ•  ๋•Œ๋Š” ๋ผ์ธ ๋‹จ์œ„์˜ ๋ฒ„ํผ๋ง์„ ์‚ฌ์šฉ

 - anything else : full buffering (by default)

 

10. Set Buffering Type

#include <stdio.h>
//set a buffer address that user provides
void setbuf(FILE *stream, char *buf);
		buf : non-NULL address for normal buffering
        		NULL if unbuffering
    return : none
    
//set a buffer address and buffering type
int setvbuf(FILE *stream, char *buf, int type, size_t size);
		buf : same as the above
        type : the type of buffering
        size : buffer size
    return 0 for success, or nonzero for an error

 

type ๋ณ€์ˆ˜์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

type meaning
_IOFBF Full buffering
_IOLBF Line buffering
_IONBF Unbuffering

 

11. Kernel Buffering

์ปค๋„ ์˜์—ญ์—์„œ๋„ ์ปค๋„ ๋ฒ„ํผ๋ง ๊ฐœ๋…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์œ ์ € ๋ ˆ๋ฒจ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ์„ ์ด์šฉํ–ˆ์„ ๋•Œ์˜ ๋ฒ„ํผ๋ง๊ณผ๋Š” ๋ณ„๋„๋กœ, ์šด์˜์ฒด์ œ ๋‚ด์˜ ์ปค๋„์—์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฒ„ํผ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

buffer๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ์ ์œผ๋กœ ๋ชจ์•„๋†“๊ณ  ์ „์†กํ•˜๋Š” ๊ฐœ๋…์ด๋ผ๋ฉด,

cach๋Š” ์ค‘๊ฐ„ ๋งค๊ฐœ์ฒด ์—ญํ• ๋กœ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ๋ฐ์ดํ„ฐ์˜ ์œ ๋ฌด๋ฅผ ์ฒดํฌํ•˜๋Š” ์—ญํ• ๋กœ ๋ฒ„ํผ๋ง์˜ ๊ธฐ๋Šฅ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ฆฌ๋ˆ…์Šค ์ปค๋„์—๋Š” page cach๋ผ๋Š” I/O๋ฅผ ์œ„ํ•œ ๋ฒ„ํผ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 

์ฃผ๊ธฐ์ ์œผ๋กœ disk์™€ ๊ฐ™์€ storage์— data๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cach๋Š” ์“ฐ๊ธฐ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ์ฝ๊ธฐ์—๋„ ์ ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค. storage์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ๋˜๋ฉด ๋จผ์ € buffer cach์— ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ผ์˜จ ๋‹ค์Œ์— user์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด ์ค๋‹ˆ๋‹ค. 

 

12. fflush

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„ํผ๋“ , ์ปค๋„ ๋ฒ„ํผ๋“  ๋ฒ„ํผ๋ฅผ ํŠน์ •ํ•œ ์‹œ๊ธฐ์— ์‹ค์ œ ๋งค์ฒด์— ์“ฐ๋„๋ก ๋™์ž‘์‹œ์ผœ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์ƒ์—๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์‹ค๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐจ์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ์ด๋ฅผ ๊ฐ•์ œ์ ์œผ๋กœ ๋‚ด๋ ค์ฃผ๊ธฐ ์œ„ํ•œ ๋™์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด fflush์ž…๋‹ˆ๋‹ค.

fflush๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฒ„ํผ๋ง ๋œ ๋ฐ์ดํ„ฐ๋ฅผ flushํ•ด์„œ ์ปค๋„๋ ˆ๋ฒจ๋กœ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค. 

#include <stdio.h>
int fflush(FILE *stream);
  return 0 for normal
  	EOF for error

line buffering์„ ์‚ฌ์šฉํ•˜๋Š” printf์˜ ๊ฒฝ์šฐ, system console์—๋Š” ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฅผ file์— ์“ฐ๋ ค๊ณ  ํ•˜๋ฉด(fprintf) ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํผ์—๋งŒ ์กด์žฌํ•˜์—ฌ ํŒŒ์ผ์— ์จ์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ fflush()๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

printf("something");
fflush(stdout);

block device๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, (e.g. disk)

user level์— ์žˆ๋Š” ๋ฒ„ํผ๋ฅผ fflush๋ฅผ ์ด์šฉํ•ด ์จ์ฃผ๋”๋ผ ํ•˜๋”๋ผ๋„ ์ปค๋„๋ ˆ๋ฒจ๊นŒ์ง€๋งŒ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋„์˜ page cach์— ๋ฐ์ดํ„ฐ๊ฐ€ ์จ์ง‘๋‹ˆ๋‹ค. ์‹ค์ œ์ ์œผ๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์“ฐ๋ ค๋ฉด storage device์— ๋ฐ์ดํ„ฐ๊ฐ€ ์จ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ปค๋„ level์˜ ๋ฐ์ดํ„ฐ๋ฅผ disk๋กœ ์™„์ „ํžˆ ๋‚ด๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” sync()๋ผ๋Š” ์‹œ์Šคํ…œ ์ฝœ์„ ๋ถˆ๋Ÿฌ์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. 

 

13. I/O buffering & Sync

๋Œ“๊ธ€