Inode는 file에 대한 전체적인 metadata를 저장하는 struct
Inode table은 한 블럭당 대략 16개의 inode에 대한 데이터를 저장하고 있다(256KB).
Inode가 저장하는 metadata list
우리가 모든 block을 일일이 접근하면서 이 inode가 사용중인지 저 data block이 사용중인지를 일일이 검사하는 건 너무 비효율적이니까...
개별적인 bit를 이용해서 해당 block, inode를 사용중인지 아닌지를 표기하는 bitmap을 할당해 놓는다.
<starting block #, length>
Metadata: <starting block #>
장점: Continuous의 단점이 장점이 된다.
단점
Linked Allocation과 거의 유사하지만, pointer가 block 내부에 저장되어있는 방식이 아니라 FAT라는 별개의 table에 따로 저장한다.
윈도우에서 사용했던걸로 유명하다. e.g. FAT12, FAT16, FAT32...
FAT를 따로 main memory에 caching할 수 있기 때문에 속도면에서는 다소 이득을 볼 수 있다.
한개의 블럭을 할당하고 해당 블럭에 다른 모든 block의 포인터를 저장한다.
<indexed block pointer>
장점: 뭐 사실 전체적으로 좋다.
단점
파일 시스템이 커지니까 한개의 블록으로 안되는 경우가 종종생겼다...
파일의 최대 크기:
<starting block #, extent size>
<file name, inode number>
e.g. read 3 block from /foo/bar
root에서 부터 차례대로 읽어간다...(이건 18장에서 path에서 이미 설명했으니까...)
그렇게 최종적으로 bar의 위치를 찾으면 bar의 inode로 부터 block의 위치를 찾고 data block에서 실재로 읽어온다.
write는 무엇인가?: access time(필요할 떄도 있지만, 실재로 필요한가는 잘 모르겠다...)
e.g. create and write 3 block at /foo/bar
path를 찾아가는 과정은 동일하니까 skip.
일단 foo data에서 bar라는 이름이 있는지를 검사해야해서... data를 read한다.
이제 bar 파일을 생성하기 위해서는 총 4개의 data에 write를 해야한다.
<filename, inode #>
data를 기록해야 한다.이제 bar 내부에 data를 쓰는 과정을 보면 마찬가지로 파일 찾는 건 동일하므로 skip.
bar 내부에 쓰기 위해서는 3개를 변경해야한다.