파일이나 파일시스템을 관리하기 위해 사용되는 정보
슈퍼블럭 : 파일시스템을 관리 (크기,블럭 사이즈,아이노드 위치, 루트 디렉토리 위치 , 이용률) : 파일시스템에 하나만
아이노드 : 파일의 속성(읽기 가능, 쓰기 가능, 사이즈) 관리 - 파일마다 하나씩 만들어짐
비트맵 : 사용가능한지 사용중인지 구분 , 관리 (데이터를 위한 or inode를 위한 비트맵)
EXT2(그룹 디스크립터), EXT3(저널) FAT(FAT), LFS-(segment) // 파일시스템(메타데이터)
간단한 파일을 관리하기 위한 메타데이터
mode : read / write / 실행
uid : 생성한 사용자가 누구?
size : 파일 크기
time : 시간 정보
gid : 그룹 id
link.count : 하드링크, 소프트링크 개수
blocks : 얼마나 많은 디스크 블럭이 할당?
flags : 여러 플래그들
block : 파일에 속해있는 디스크블럭들의 포인터
Direct blocks vs Indirect Block
Direct bloack 개수 x 4K x 1024
InDirect block = 개수 x 1024 x N x 4K ( N = Index )
작은 파일 , 큰 파일 모두 효과적으로 지원 가능
작은 파일 : 다이렉트 => 성능 향상 (인덱스 필요X)
큰 파일 : 인다이렉트
ex) hello.c를 root dir 아래에 만들었다. file size = 7K
==> root라는 dir와 hello.c 라는 2개의 파일이 만들어진다.
아이노드 0번(root) , 데이터노드 8번 (아이노드가 포인팅함)
아이노드 1번(hello.c), 디스크블록 9,10번 (7K = 4K + 3K)
. : 자기자신 ( 0 - 아이노드0번)
.. : 부모 디렉토리 (부모도 동일)
if) 만약에 hello.c를 컴파일한다면?
Issue 1) hello.o의 inode를 어떻게 찾을 것인가? root부터 찾기
Issue 2) 오프셋이 5000이라면 어느 디스크 블럭을 이 상태에서 읽어오게 될까?
5000 % 4096 = 몫 1(Index역할) 나머지 904
==> 0부터 4096은 첫 번째 디스크 블럭 , 그 후는 두 번째 디스크 블럭 + 904만큼 => 5000
조건 ) /foo/bar size 12KB open , read data and close it
파일시스템은 어떻게 접근하게 될까?
세로 : 시간 , 가로 : 파일시스템 구조
Open : 1)루트의 아이노드 찾아감 , 2) 루트 데이터 읽음
Read : bar의 크기 =>12KB (디스크 블럭 3개 ==> read 가 3번 진행됨)
Close : 관련된 자료 구조의 fd 할당 해제
지연 쓰기를 하면 bar inode 쓰기의 마지막만 수행해도 된다.
data bitmap도 마지막만 ==> 총 5회의 write를 안해도 됨
캐싱, read를 처음만 읽고 나머지 소거 => 총 5회의 I/O 줄임
==> 중간에 전원결함 발생시 데이터 로스 발생
===> fsync() 사용으로 해결