시스템프로그래밍

시스템프로그래밍(13) - io

gilola 2024. 12. 14. 05:53

I/O

-> main memory와 external device 사이 data 이동

 

Unix I/O

-> file은 byte sequence

-> open, close, read, write, lseek 함수가 있음

 

File type

1. regular file 

-> 임의의 data 포함

-> text file 또는 binary file

-> kernel은 text와 binary 구분 x

-> text line은 \n으로 종료

2. directory

-> file group의 index를 포함

-> kernel은 각 process마다 cwd 유지

-> absolute pathname 과 relative pathname이 있음

3. socket

-> 다른 machine의 process와 통신

 

Open files

-> fd는 file descriptor

-> fd 가 -1 이면 오류 발생

-> fd 0 이면 stdin, 1이면 stdout, 2면 stderr

 

Close files

-> closed file을 다시 close 하는 것은 thread 에서 위험

 

Read files

-> 현재 file에서 buf로 n byte 복사, file 위치 update

-> 0을 return하면 EOF

-> -1은 error

-> short count

 

Write files

-> mem에서 file로 n byte 복사, file 위치 update

-> short count

 

Short count 발생

-> EOF 읽기

-> \n 읽기

-> network socket 읽기/쓰기

 

Robust I/O

-> short count를 최대한 억제하고 사용성을 늘리기 위해서 사용

-> Unbuffered I/O, Buffered I/O

 

** Unix read/write 는 interleave x

 

Unbuffered I/O

-> rio_readn: EOF 에서만 short count

-> rio_writen: short count 없음

-> unix file => user buffer

 

Buffered I/O

-> rio_readlineb: EOF, EOL에서 short count

-> rio_readnb: EOF에서 short count 

-> unix file => 내부 mem =>  user buffer

 

File buffering

-> rio_readlineb 과 rio_readb 는 병렬 호출 가능

-> rio_read와는 병렬 호출 불가능

-> buffer은 file에서 읽힌 data중 아직 처리되지 않은 byte를 보관

-> rio_bufptr: 마지막 read 위치

-> rio_cnt: unread 한 부분

 

File data

->file position은 process마다 독립적으로 관리

Metadata

-> file size, type, rwe 권한

-> 동일한 file에 대해 모든 process는 같은 metadata 공유

-> stat, fstat 함수를 사용하여 접근

 

Redirection

-> dup2(oldfd, newfd) 함수 사용

-> oldfd가 참조하는 file을 newfd도 참조하도록

 

Standard I/O

-> file 구조체 사용

-> byte 단위가 아니라 stream 단위로 처리

-> 한 문자씩 읽고 쓰기는 매우 expensive

-> 따라서 buffer에 data 미리 채우기

-> strace 를 사용해 system call tracing

 

Unix I/O 장점

1. overhead 적음

2. async-signal-safe 여서 안전

3. file metadata 접근 가능

Unix I/O 단점

1. 단축 읽기/쓰기를 다루는 것이 까다롭고 오류 발생 가능

2. 버퍼링 필요

 

Standard I/O 장점

1. 효율성 증가

2. short count가 자동으로 처리

Standard I/O 단점

1. file metadata 접근 불가능

2. 안전하지 않음

3. network socket 입출력에 적합하지 ㅇ낳음

 

언제 어떤 I/O

1. standard

-> disk file, terminal file 작업

2. unix

-> signal handler

3. rio

-> network socket