10.1 Unix I/O
- 리눅스 파일은 B0, B1, ..., Bk, ..., Bm-1과 같이 m바이트의 시퀀스이다.
- 모든 I/O 장치(네트워크, 디스크, 터미널 등)는 파일로 모델링되며, 모든 입력과 출력은 적절한 파일을 읽고 쓰는 것으로 수행된다.
- 이러한 파일과 장치 간의 우아한 매핑으로 인해 리눅스 커널은 Unix I/O라고 하는 간단하고 low-level의 응용 프로그램 인터페이스를 내보낼 수 있다. 이 인터페이스를 통해 모든 입력과 출력이 일관되고 균일하게 수행된다.
- 파일 열기. 응용 프로그램은 커널에 해당 파일을 열 것을 알리고, 커널은 파일을 식별하는 작은 양의 양의 정수인 디스크립터를 반환한다. 커널은 열린 파일에 대한 모든 정보를 추적하며, 응용 프로그램은 디스크립터만 추적한다.
- 리눅스 셸에 의해 생성된 각 프로세스는 세 개의 열린 파일을 가지고 시작된다: 표준 입력(디스크립터 0), 표준 출력(디스크립터 1) 및 표준 오류(디스크립터 2). <unistd.h> 헤더 파일은 명시적 디스크립터 값 대신에 사용할 수 있는 상수 STDIN_FILENO, STDOUT_FILENO 및 STDERR_FILENO을 정의한다.
- 현재 파일 위치 변경. 커널은 각 열린 파일에 대해 초기 값이 0인 파일 위치 k를 유지한다. 파일 위치는 파일의 시작부터의 바이트 오프셋이다. 응용 프로그램은 seek 작업을 수행하여 현재 파일 위치 k를 명시적으로 설정할 수 있다.
- 파일 읽기 및 쓰기. 읽기 작업은 현재 파일 위치 k에서 시작하여 n > 0바이트만큼 파일에서 메모리로 복사한 다음 k를 n만큼 증가시킨다.(오프셋 연산) 크기가 m 바이트인 파일에서 k ≥ m인 상태에서 읽기 작업을 수행하면 종료 조건인 EOF(End-Of-File)이 트리거된다. 이는 응용 프로그램에서 감지될 수 있다. 파일 끝에 "EOF character"라는 것이 명시되어 있는 것은 아니다.
- 마찬가지로, 쓰기 작업은 현재 파일 위치 k에서 시작하여 n>0바이트만큼을 메모리에서 파일로 복사한 다음 k를 업데이한다.
- 파일 닫기. 파일에 대한 접근이 끝난 후에는, 해당 파일을 닫아야 한다. 파일을 닫는 것은 해당 파일에 대한 접근을 마치고, 커널에게 파일을 닫으라고 요청하는 것이다. 커널은 파일이 열릴 때 생성한 데이터 구조를 해제하고, 파일 디스크립터를 사용 가능한 디스크립터 상태로 되돌린다. 프로세스가 종료될 때도 마찬가지로, 커널은 열려있는 모든 파일을 닫고 메모리 리소스를 해제한다.
- 파일 열기. 응용 프로그램은 커널에 해당 파일을 열 것을 알리고, 커널은 파일을 식별하는 작은 양의 양의 정수인 디스크립터를 반환한다. 커널은 열린 파일에 대한 모든 정보를 추적하며, 응용 프로그램은 디스크립터만 추적한다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[CSAPP] 10.3 Opening and Closing Files (0) | 2023.03.18 |
---|---|
[CSAPP] 10.2 File(파일) (1) | 2023.03.18 |
[CSAPP] Chapter 10. System-Level I/O (0) | 2023.03.18 |
[CSAPP] 9.9 Dynamic Memory Allocation(동적 메모리 할당) (0) | 2023.03.08 |
[CSAPP] 4.5 Pipelined Y86-64 implementations (0) | 2023.03.01 |