카테고리 없음

[운영체제] VSFS(Very small file system) 파일 크기에 따른 저장 방식 및 파일 변형

맛난과자 2025. 6. 10. 23:02

기본 구조

- 블록 크기 : 일반적으로 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가 초과되었을 때는 이중 간접 포인터까지 나타난다는 것을 알 수 있다.

즉, 각 단계에서 파일 시스템이 더 큰 파일을 수용할 수 있도록 변형될 때는 메타데이터 블록을 새로 할당하고 포인터 구조를 재구성한다!