기본 구조
- 블록 크기 : 일반적으로 4KB
- inode 구조: direct pointer 12개 + indirect pointer 1개 + double indirect pointer 1개
VSFS는 Multi level index를 가진다.

파일 크기별 저장 방식 변화
작은 파일의 경우,
직접 포인터만 사용(12*4KB = 48KB)
I/O 특성: 1번의 inode 읽기 + 직접 데이터 블록 접근
성능: 가장 빠름
중간 파일의 경우,
직접 + Single indirect 포인터 사용
간접 블록 존재: 1024개 포인터 (4KB/4바이트 = 1024)
최대 크기: 48KB + (1024*4KB) = 48KB + 4MB
I/O 특성: inode 읽기 + 간접 블록 읽기 + 데이터 블록 접근
성능: 추가 I/O 1회 필요
큰 파일의 경우,
직접 + Single indirect + double indirect 포인터 사용
최대크기: 48KB + 4MB + 4GB
I/O 특성: inode + 이중/단일 간접 블록 + 데이터 블록
성능: 최대 3번의 추가 I/O 필요
파일 크기별 I/O 오버헤드를 표로 나타내자면 이러하다.
파일 크기 | 메타데이터 I/O | 데이터 I/O | 총 I/O |
4KB | 1 (inode) | 1 | 1+1 = 2 |
48KB | 1 (inode) | 12 | 12+1 = 13 |
1MB | 2 (inode + indirect) | 256 | 256+2 = 258 |
4GB | 4 (inode + double indirect) | 1024*1024 | 1024^2 + 2^2 |
VSFS 파일 크기가 증가할 때마다 내부 구조 변형되는 과정
1단계: 매우 작을 때
Inode 구조:
[직접포인터0] → 데이터블록1 // 첫번째 직접 포인터만 사용
[직접포인터1] → NULL
[직접포인터2] → NULL
...
[간접포인터] → NULL
I/O는 inode 한 번, 데이터 블록 한 번, 총 2회 실행된다.
2단계: 작은 파일 확장
파일이 8KB로 증가:
[직접포인터0] → 데이터블록1
[직접포인터1] → 데이터블록2 ← 새로 할당
[직접포인터2] → NULL
...
파일이 48KB로 증가:
[직접포인터0] → 데이터블록1
[직접포인터1] → 데이터블록2
...
[직접포인터11] → 데이터블록12 ← 마지막 직접포인터
[간접포인터] → NULL
직접 포인터들이 하나씩 채워지게 된다.
입출력은 inode 한 번, 데이터 블록들 n번, 총 n+1회 실행된다.
3단계: 중간 파일로 변형(48KB -> 52KB로 가정)
48KB에서 52KB로 증가할 때:
[직접포인터0~11] → 데이터블록1~12 (기존)
[간접포인터] → 간접블록 ← 새로 생성!
간접블록 내용:
[포인터0] → 데이터블록13 ← 새 데이터
[포인터1] → NULL
[포인터2] → NULL
...
간접 블록이 처음으로 생성될 것이다.
IO는 inode 1, 간접 블록 1, 데이터 블록 13개 총 15회 실행된다.
4단계: 중간 파일 확장 (52KB -> 4MB)
파일이 계속 증가하면서:
[포인터0] → 데이터블록13
[포인터1] → 데이터블록14 // 간접블록 내용이 채워짐
...
[포인터1023] → 데이터블록1036 ← 간접블록 가득참
direct block 내 포인터들이 순차적으로 채워지게 된다.
위에서 말했듯이 최대 1024개 포인터*4KB = 4MB가 추가 가능하게 된다.
5단계: 큰 파일로 변형 (4MB+48KB -> 4MB+52KB)
간접블록이 가득 찬 상태에서 더 증가:
[직접포인터0~11] → 데이터블록1~12
[간접포인터] → 간접블록 (가득참)
[이중간접포인터] → 이중간접블록 ← 새로 생성!
이중간접블록:
[포인터0] → 새로운간접블록1
[포인터1] → NULL
...
새로운간접블록1:
[포인터0] → 데이터블록1037 ← 새 데이터
[포인터1] → NULL
...
으어어어 이중 간접 구조가 처음으로 생성될 것이다.
입출력은 inode 1, 이중 간접 1, 간접1, 데이터블록1 총 4회 실행된다.
결론
파일 크기가 4KB 단위일때는 직접 포인터만 추가하고 데이터 블록만 생성되지만,
48KB에서 52KB가 되었을 때는 간접 포인터가 나타나고, 4MB+48KB가 초과되었을 때는 이중 간접 포인터까지 나타난다는 것을 알 수 있다.
즉, 각 단계에서 파일 시스템이 더 큰 파일을 수용할 수 있도록 변형될 때는 메타데이터 블록을 새로 할당하고 포인터 구조를 재구성한다!