OS 입장에서는 file은 사용자가 만들어놓은 data에다가 이름을 붙여놓은 것이다.
data들은 쪼개서 storage 장치에 저장한다.
file은 abstract한 data type이다.
어느 파일이 몇개나 열려있는지,위치,permission등등을 관리한다.
open file들은 fd로 표시된다.
윈도우에서는 folder 라고도 하지만,원래는 directory이다. directory의 사전적 의미는 어디에 뭐가 있는지 방향을 알려주는 것이다. directory는 사실 folder안에 파일을 담는게 아니라, file이 어디있는지 알려주는 것이다.
directory도 파일이고 이 파일이 다른 파일들의 meta data의 정보를 가지고 있는 것이다. 즉 파일의 이름의 위치나 사이즈 등을 가지고 있는 것이다. 실제 파일 데이터는 디스크 상의 데이터 블록에 저장되고, file descriptor를 통해서 파일의 데이터 블록에 접근하여 파일의 내용을 읽거나 쓸 수 있다.
위 그림에서 예를 들자면,
root directory에는 directory 형태의 file 3개가 있고, spell이라는 파일을(file id 2) 열어보면 3개의 파일의 meta data가 들어 있다. mail은 directory 형태이고 나머지 2개는 file 형태이다. stat이라는 file을 들어가보면 43번 file id로 찾아가게 되고 이 file id는 file descriptor에 맵핑되어 있어서 해당 fd로 찾아가면 거기에 file data가 저장되어 있다. 그러면 이제 file descriptor를 가지고 write나 read를 하는것이다.
file id -> inod
directory entry -> dentry
directory 하나하나를 dircetory entry라고 하는데 이 directory entry가 file data를 poining 할 수 있다. directory entry에서 해당하는 file id로 link를 건다. 이걸 hard link
라고 한다. 한 file을 많은 directory entry가 pointing할 수 있기 때문에 한 file id에 대해 hard link는 여러개일 수 있다.
파일의 경로를 가지고 링크를 건다. directory entry가 hard link 처럼 file id 번호로 링크를 거는게 아니라, 다른 파일의 파일 이름(경로)으로 링크를 건다.
그래서, 해당 경로에 있는 파일이 지워지면 symbolic link로 들어가도 파일을 찾을 수가 없다.
그렇다면 이 파일들을 storage에는 어떻게 저장할 수 있을까??
위 그림처럼 a.out이나 peng.jpg의 크기가 한 block에 저장하기가 힘들기 때문에 몇개로 나눠서 저장한다. 각 파일의 meta data들은 directory에 저장되어 있고 그 meta data는 실제 파일의 block을 찾아가도록 쓰여있다.
File Allocation Table
directory entry가 16bit면 FAT16
directory entry가 32bit면 FAT32
file directory에 실제 파일의 block들이 어디있는지 적어놔야 하는데, file이 클경우 그걸 다쓸 수 없다. 그래서 FAT에는 해당 file의 시작 Cluster만 적어놨다.
만약, 12,3,11 block에 file data가 나눠서 담겨져 있다면 directory entry에서는 FAT 12번으로 가라고 써있고, FAT 12번으로가면 3이 써져 있어서 3으로 이동하고 11로가면 EOF가 써져있어서 file의 마지막 부분임을 알려준다.
그러면 파일을 저장할때는??
text.c라는 파일을 저장하려고 할때도 FAT을 뒤져본다. 아무것도 저장되어 있지 않은 entry(00)이 있으면 거기에 저장하고 다음번으로 갈 entry 번호를 적어 놓는다. 마지막이면 EOF를 적는다.
파일을 지울때는, FAT은 hard link를 지원하지 않는다. 따라서 지울때도 똑같이 번호를 따라가서 00으로 만든다.
FAT은 간단한 임베디드 시스템에 많이 사용된다. (디지털 카메라, 블랙박스...)
unix 계열에서 많이 사용된다.
SSD 파일 시스템에 맞춰서 만들어졌다.