티스토리 뷰
File Structure & I/O
파일 구조체와 I/O
[ File ]
File
: Byte들의 Sequence.
: 모든 I/O Device도 File로 취급.
: File은 Position(Offset) 정보를 가지고 있음.
· Regular File
: 임의의 데이터가 포함된 파일.
: Text File과 Binary File로 구분한다.
( Binary File의 경우 Object File이나 Image File 등을 말한다. Kernel은 이 둘의 차이를 인지하지 못함 )
· Directory
: 파일을 구분하기 위해 사용되는 이름공간(namespace).
: File Name과 Inode Number로 구성되어 있다.
( inode는 index node라는 뜻 )
: .은 현재 디렉토리, ..은 부모 디렉토리를 표시한다.
: opendir(), readdir(), closedir()로 이용 가능.
File Metadata
: 파일에 대한 모든 정보. → File Data에 대한 Data.
: File Data에 대한 위치를 포인터로 저장.
: Kernel Data Structure에 존재.
: File Data는 Disk Sector에 비연속적으로 저장되어 있을 수 있음.
: stat() 또는 fstat()으로 보고자 하는 Metadata를 불러올 수 있음.
[ Unix I/O ]
Unix I/O
: System-Level I/O
: 사용하기에 편리하다는 장점이 있음.
: System Call(Trap)이므로 Overhead 발생.
: Kernel-Level.
· open()
: File Struct가 생성되고 Current File Position이 0으로 세팅됨. → 파일 내에 있는 위치.
: Main Memory에서 Metadata를 읽어오고, Location 정보를 받아와 원하는 위치에 접근.
: File Contents는 크기가 클 수 있기 때문에 처음에 Open하지 않음.
: Return값이 File Descriptor Number(fd값)인 Integer 값이다.
: Open을 할 때 데이터의 전체 경로를 지정하는 Pathname을 인자로 하면 다 열어야 하므로 많은 Disk I/O 발생.
→ 이를 방지하기 위해 이후에는 fd값(File Descriptor Number)으로 간단히 접근.
: 옵션으로 Read-Only, Write-Only, Read and Write를 줄 수 있음.
· close()
: fd값을 인자로 close.
: 정상 종료는 0을 Return, 에러는 -1을 Return.
· read()
: fd, buf, buf_size를 인자로 갖는다.
: Current File Position부터 시작해서 Read를 시작.
: read의 결과가 음수 값이 나오면 에러가 발생한 것으로 본다.
: fd값으로 0을 주면 stdin이 되므로, 키보드로부터 입력 받게 된다.
: 이때 읽으려는 값의 크기보다 실제 값이 더 작은 경우를 read하는 경우는 에러로 처리하지 않는다.
· write()
: fd, buf, buf_size를 인자로 갖는다.
: Current File Position부터 시작해서 Write를 시작.
: write의 결과가 음수 값이 나오게 되면 에러가 발생한 것으로 본다.
: fd값을 1 또는 2로 주면 stdout, stderr이므로 해당 스크린에 출력이 되게 된다.
· seek()
: File의 Position 정보를 변경.
[ Split file struct & inode struct ]
: 동일한 파일을 Open할 때 동일한 Metadata를 또 가져올 필요는 없으므로, 공용 부분과 아닌 부분을 나눔.
file struct
: Private한 부분. → 하지만 공유될 수 있음.
: 프로세스마다 가짐.
: Position, Pointer to Inode Structure, Counter
inode struct
: 기본적으로 공유되는 부분.
: 대부분의 Metadata.
: Disk에 존재하는 File Block의 Location 정보.
[ File System ]
File System : 컴퓨터에서 파일이나 자료를 쉽게 접근할 수 있도록 보관하는 체제.
· Bootblock : 부팅 관련 정보가 있는 Block.
· Superblock : 메모리 사용 정보가 존재하는 Block.
· Inode list : Inode의 집합. Inode는 File에 상관 없이 크기가 같아 배열로 관리된다.
· Data block : 실제 Data Content가 있는 Block.
File Descriptor Table
: Open 될 때 마다 File Struct의 주소가 추가됨.
: Process마다 존재.
: 0, 1, 2번 인덱스는 stdin, stdout, stderr로 각각 매핑되며 사용되지 않음. → File이 Open되면 3번 인덱스부터 사용.
[ Standard I/O & FILE structure ]
Buffered I/O
: 한 번 Unix I/O가 일어날 때 마다 Mode Switch가 발생해 Overhead가 발생하므로, 한 번에 여러 정보를 가져오는 방법.
: 입력의 경우도 한 번에 입력할 내용 전부를, 출력의 경우에도 개행 문자(\n)가 나올 때까지 기다렸다가 한 번에 출력.
Standard I/O
: Bufferd I/O 방식을 채택.
: Buffer Pointer를 Return.
: Low-Level의 I/O System Call을 기반으로 만들어져 있다.
: User-Level.
FILE structure
: File Descriptor와 Buffer를 가지고 있다.
: User-Level Struct.
: File마다 존재.
[ I/O Redirection ]
: 입력과 출력의 방향을 바꾸는 방법.
( stdout이었던 것을 file로 save하도록 하는 등. )
: 대표적으로 Linux의 0<, 1>, 1>>, 2>, &>가 있다.
: File Descriptor Table 내부의 값을 바꿔준다.
( dup2(old_fd, new_fd)로 수행 가능 )
$ls > foo.txt
[ Kernel Data Structure ]
· No Sharing일 때 Kernel Data Structure
· File Sharing 중일 때 Kernel Data Structure
· Fork 수행 시 Kernel Data Structure
: fork()의 경우 file structure도 공유하게 되기 때문에 서로 Position 정보에 영향을 줄 수 있다.
· I/O Redirection 수행 시 Kernel Data Structure
'컴퓨터 공학 이론 > 시스템 프로그래밍' 카테고리의 다른 글
[시스템 프로그래밍] Calling Convention과 Stack (0) | 2022.12.04 |
---|---|
[시스템 프로그래밍] Status Register (0) | 2022.12.04 |
[시스템 프로그래밍] Signal (0) | 2022.12.03 |
[시스템 프로그래밍] Process의 생성과 종료 (0) | 2022.12.02 |
[시스템 프로그래밍] Process와 Context Switching (0) | 2022.11.30 |