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
'시스템프로그래밍' 카테고리의 다른 글
| 시스템프로그래밍(14) - vm (0) | 2024.12.14 |
|---|---|
| 시스템프로그래밍(12) - ecf-signals (0) | 2024.12.14 |
| 시스템프로그래밍(11) - ecf-procs (0) | 2024.12.14 |
| 시스템 프로그래밍(10) - Linking (1) | 2024.12.14 |