File I/O
File
리눅스는 SW/HW 자원부터 키보드, 프린터 등의 디바이스나 소켓을 하나의 file로 관리한다.
파일은 크게 3가지로 구분되며, 텍스트나 바이너리와 같은 일반 파일, 디렉토리, 디바이스 및 소켓 등의 특수 파일로 나뉜다.
1. Low-Level File
저수준 파일은 파일 서술자(file descriptor)로 구분되고, 시스템 호출을 이용하여 파일을 다룬다. 특수 파일도 다룰 수 있으며, Byte 단위로 입출력을 수행한다.
2. High-Level File
고수준 파일은 파일 포인터(file pointer)를 사용하고, C 표준 라이브러리를 사용한다. 프로세스 내부의 버퍼 크기 단위로 입출력을 수행한다.
System call vs. C Standard Library
시스템 콜은 커널에게 자원을 이용할 수 있도록 서비스를 요청하는 OS에서 지원하는 api이다. 그런데 자원을 접근하기 위해서는 User mode에서 Kernel mode로 전환되어야 하는데, 이때 Context Switching이 일어나고, 작업이 끝난 후 다시 User mode로 복구된다. 또한 입출력 시에 Byte 단위로 I/O가 진행된다.
그러나 C 표준 라이브러리는 프로세스 내부에 존재하는 buffer을 생성하고, 해당 buffer가 다 차기 전 까지 데이터를 커널로 옮기지 않는다. 이 이유로 Buffered I/O라고 불리고, 오버헤드가 큰 system call 횟수를 줄여 성능을 개선할 수 있으며, 표준 라이브러리 I/O는 시스템 콜의 wrapper 함수라고 한다. 또한 표준 라이브러리 함수 내부에서도 system call을 하게 된다.
Low-Level File I/O
https://github.com/Merry-Berry/LearningNote/blob/main/TLPI/20220501.md
GitHub - Merry-Berry/LearningNote
Contribute to Merry-Berry/LearningNote development by creating an account on GitHub.
github.com
https://github.com/Merry-Berry/LearningNote/blob/main/TLPI/20220504.md
GitHub - Merry-Berry/LearningNote
Contribute to Merry-Berry/LearningNote development by creating an account on GitHub.
github.com
TLPI를 읽고 github에 간단히 정리해두었다.