The Way To Think
UNIX의 전형적인 File system 형태인 VSFS(Very Simple File System)을 다룰 것이다.
또한 data structures와 access methods 두 가지 관점에서 file system을 다룰 것이다.
block: 4KB, Sector: 512B (atomic)
Overall Organization
디스크를 4KB block 단위로 나눌 수 있다.
vsfs에서는 아래 그림처럼 64개의 block이 있다고 하자.
User Data(Data Region): (8~63) user가 쓸 수 있는 Data block
Inode table: (3~7) file의 metadata가 저장되는 블럭. i-node size는 256B 이고 한 블럭에 16개의 i-node가 들어간다. 3~7에 5개의 블럭이 있으므로 80개의 i-node를 표현할 수 있다. 따라서 80개의 파일 또는 디렉토리를 관리할 수 있다.
Bitmap: (1~2) 한 블럭이 사용 중인지 비어있는지 1비트로 나타낼 수 있다. i-node는 256B 단위로 표현(inode bitmap)하고 Data block은 한 블럭 단위(data bitmap)로 표현한다.
Superblock: (0) file system의 metadata가 저장되는 블럭
File Organization: The Inode
inode table의 iblock은 다음과 같다.
256B 크기의 inode 16개가 한 블럭에 들어간다.
다음은 inode에 저장되는 metadata이다.
이 중 pointer들이 블럭을 가리키고 있다. (포인터는 10개 12개 또는 15개)
파일과 디렉토리는 head가 block들을 가리키는 구조이다.
보통 마지막 3개를 indirect pointer로 사용한다. (Indirect, Double, Triple)
pointer 크기가 32비트라고 하면 한 블럭에 1024개의 포인터가 저장된다. 따라서 Single indirect pointer는 4K, double indirect는 4M의 데이터를 가리키는 포인터(개수는 1/4)를 저장할 수 있다.
이런 방식을 multi-level index라고 한다.
file들의 크기나 개수는 다음과 같은 특징을 갖는다.
대부분의 파일들은 크기가 작으며, "작다"의 기준은 매년 커진다.
또 용량의 대부분은 크기가 큰 소수의 파일들이다.
따라서 크기가 작은 파일들은 빠르게 접근하고, 큰 파일들은 indirect로 접근하는 것이 효율적이다.
Directory Organization
directory: (entry name, inode number)
reclen는 아래처럼 전체 길이
Free Space Management
free space는 bitmap으로 관리한다.
Access Paths: Reading and Writing
- Reading A File From Disk
"/foo/bar"파일을 읽는다고 가정하자.
"/foo/bar"파일을 쓴다고 가정하자.
foo data를 읽은 뒤 bitmap을 읽고 쓴다. 그리고 foo data를 쓰고 난 뒤에 bar를 쓰기 위해 bar inode를 읽고 쓴다.
그다음 foo inode write는 bar에 접근했으므로 수정시간 등을 쓴 것이다.
Caching and Buffering
mkdir("/g");
a: 가리키는 블럭의 주소(data의 주소를 찾을 때 사용)
데이터의 (A, B)에서 A는 ls하면 나오는 것들이고, B가 inode의 인덱스.
inode bitmap 11000000
inodes [d a:0 r:3] [d a:1 r:2] [] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (g,1)] [(.,1) (..,0)] [] [] [] [] [] []
create()는 빈 파일 헤더 생성. open()하고 써야 address도 생기고 data bitmap도 채워진다.
Uploaded by Notion2Tistory v1.1.0