fd reference chain

fd 번호는 데이터가 아니라 커널 객체를 따라가는 참조다

프로세스는 fd table의 정수 인덱스를 사용하고, 커널은 그 인덱스를 open file entry, inode/vnode, disk blocks로 이어서 실제 파일 데이터를 찾는다.

Process fd table

Process A
fd 3 → open file #17
fd 4 dup(fd 3) → #17
Process B after fork
fd 3 parent와 같은 #17
Process C new open
fd 5 별도 open file #32

Open file entries

#17 shared offset, flags, refcount 공유
A.fd3 A.fd4 B.fd3

하나가 read하면 같은 entry의 offset이 움직인다.

#32 separate 같은 파일을 다시 open

inode는 같아도 offset과 flags는 별도 entry에 저장된다.

inode / vnode

inode #8842 파일의 정체성과 메타데이터

권한, 크기, 링크 수, 블록 주소 같은 파일 시스템 정보를 가진다.

vnode 커널의 추상 파일 객체

파일 시스템 종류가 달라도 같은 인터페이스로 접근하게 한다.

Disk blocks

4 KB blocks 실제 데이터 위치

파일 시스템이 inode의 블록 포인터를 따라 읽기와 쓰기를 수행한다.

dup / dup2

fd 번호만 늘어나고 같은 open file entry를 공유한다.

fork

자식 프로세스 fd table이 부모의 entry 참조를 물려받는다.

open 다시 호출

같은 inode를 보더라도 open file entry는 새로 생긴다.