디스크 공간할당 방식과 파일 시스템의 블록 관리
디스크 공간할당의 연속·연결·인덱스 방식과 FAT, inode, 수퍼블록의 역할을 비교해 파일 시스템의 블록 관리 구조를 정리한다.
2026-08-14 · 최초 발행 2026-01-02
블록 배치 방식이 파일 접근 특성을 결정한다
파일 시스템은 파일 데이터를 어느 디스크 블록에 둘지 결정하고, 이후 그 위치를 다시 찾을 수 있어야 한다. 이 배치 방식은 디스크 공간 활용도뿐 아니라 순차 읽기, 임의 위치 접근, 파일 확장, 메타데이터 관리 방식에 직접 영향을 준다.
공간할당에서 다루는 기준은 저장 효율성, 접근 성능, 파일 크기 변경의 유연성, 관리와 복구의 편의성이다. 외부·내부 단편화를 줄이면서 디스크 공간을 활용하고, 순차 접근과 직접 접근을 지원하며, 파일의 삭제·재할당·확장을 감당해야 한다.
연속된 블록에 두는 연속할당
연속할당은 파일을 이어진 블록 구간에 저장한다. 파일 위치는 시작 블록 번호와 블록 개수, 즉 파일 크기로 표현할 수 있다.
예를 들어 파일 A가 시작 블록 10에서 길이 5를 차지하면 블록 10, 11, 12, 13, 14에 저장된다. 파일 B가 시작 블록 20에서 길이 3이면 블록 20, 21, 22를 사용한다.
이 방식은 디스크 헤드 이동을 줄여 순차 접근이 매우 빠르다. 시작 위치에 오프셋을 더하면 되므로 직접 접근도 단순하고, 메타데이터 구조 역시 간결하다.
대신 파일을 삭제한 자리에 빈 공간이 남아 외부 단편화가 생긴다. 파일 크기를 늘리려면 바로 뒤에 연속 공간이 있어야 하며, 파일 크기를 미리 알아야 하는 제약도 있다. 단편화를 해소하려면 오버헤드가 큰 압축(Compaction)이 필요하다.
블록을 연결하는 FAT 방식
연결할당은 파일의 블록을 연결 리스트처럼 이어 저장한다. 각 블록은 다음 블록을 가리키며, 파일 메타데이터에는 시작 블록만 기록한다.
FAT(File Allocation Table)는 이 연결 정보를 별도 테이블에서 관리한다. 테이블은 각 블록 번호에 대응하는 다음 블록 번호를 보관하고, 메모리에 캐싱해 접근 속도를 높인다. 파일 A가 블록 10에서 시작한다면 FAT에는 [10] → 15, [15] → 23, [23] → EOF처럼 연결 관계가 저장될 수 있다.
연속 공간이 필요하지 않아 외부 단편화가 없고, 파일 크기를 동적으로 늘릴 수 있다. 파일의 최종 크기를 미리 정할 필요도 없다. 반면 임의 위치를 읽으려면 앞선 링크를 따라가야 해 직접 접근이 매우 느리다. 블록 일부가 포인터에 쓰여 저장 효율이 줄고, 포인터가 손상되면 파일을 잃을 수 있다. 모든 블록의 연결 정보를 담는 FAT 자체도 커진다.
inode가 블록 위치를 관리하는 인덱스할당
인덱스할당은 인덱스 블록에 파일을 구성하는 데이터 블록의 주소를 기록한다. 파일 데이터는 인덱스 블록을 통해 찾아가므로 직접 접근을 지원한다.
UNIX/Linux 파일 시스템에서 inode(Index Node)는 파일 메타데이터와 블록 포인터를 함께 관리한다. 직접 포인터뿐 아니라 간접 포인터, 이중 간접 포인터, 삼중 간접 포인터를 사용해 파일 크기 변화에 대응한다.
- 직접 블록 포인터(Direct): 12개, 소용량 파일에 사용
- 단일 간접 포인터(Single Indirect): 1개 블록 포인터 테이블
- 이중 간접 포인터(Double Indirect): 2단계 테이블
- 삼중 간접 포인터(Triple Indirect): 3단계 테이블
inode:
- Direct[0] = 100
- Direct[1] = 105
- Direct[2] = 200
- ...
- Direct[11] = 350
- Single Indirect = 500 (블록 500에 포인터 리스트)
인덱스 블록을 참조해 직접 접근이 빠르고, 연속 공간이 필요하지 않아 외부 단편화도 없다. 파일 크기를 동적으로 키울 수 있으며 간접 포인터로 공간을 활용한다. 다만 인덱스 블록은 메타데이터 오버헤드가 되고, 작은 파일에서는 블록 전체를 사용하지 않아 낭비가 생길 수 있다. 다단계 간접 포인터를 거쳐야 하는 경우에는 접근이 느려지고 구현도 복잡해진다.
파일 시스템 전체와 파일별 정보를 나누어 관리한다
수퍼블록(Superblock)은 파일 시스템 전체의 정보를 담는 메타데이터 블록이다. Magic Number로 파일 시스템 유형을 식별하고 마운트 시 검증하며, Revision Level로 파일 시스템 버전과 호환성을 확인한다. Mount Count는 마운트 횟수를 기록해 파일 시스템 체크 주기 결정에 사용된다.
수퍼블록에는 블록 크기, 총 블록 수, 여유 블록 수, inode 개수, 여유 inode 수 같은 정보도 들어간다.
inode는 개별 파일마다 하나씩 할당되는 관리 객체다. 일반 파일·디렉토리·심볼릭 링크 같은 파일 타입, rwx 권한, 소유자 UID/GID, 파일 크기, 생성·수정·접근 타임스탬프를 보관한다. 여기에 직접·간접·이중/삼중 간접 블록 포인터와 하드 링크 개수도 기록한다. 링크 카운트가 0이 되면 파일은 삭제된다.
접근 방식과 저장 환경에 따른 차이
| 항목 | 연속할당 | 연결할당 (FAT) | 인덱스할당 (inode) |
|---|---|---|---|
| 순차 접근 | 매우 빠름 | 빠름 | 빠름 |
| 직접 접근 | 빠름 | 매우 느림 | 빠름 |
| 외부 단편화 | 발생 | 없음 | 없음 |
| 파일 크기 변경 | 어려움 | 쉬움 | 쉬움 |
| 메타데이터 | 최소 | FAT (큼) | inode (중간) |
| 구현 복잡도 | 낮음 | 중간 | 높음 |
| 대표 파일 시스템 | - (거의 사용 안 함) | FAT12/16/32 | ext2/3/4, XFS |
연속할당은 CD-ROM, DVD처럼 읽기 전용이거나 파일 크기가 고정된 환경과 맞는다. FAT 기반 연결할당은 USB 플래시 드라이브, SD 카드, 이동식 저장장치와 Windows의 FAT32, exFAT에서 사용된다. inode 기반 인덱스할당은 ext4, XFS, Btrfs를 쓰는 UNIX/Linux 파일 시스템, APFS를 쓰는 macOS, 서버와 고성능 요구 시스템에서 볼 수 있다.
Extent와 Copy-on-Write로 보완하는 현대 파일 시스템
Extent-Based Allocation은 연속할당과 인덱스할당을 결합한 방식이다. 여러 연속 블록 그룹인 Extent를 인덱스로 관리해 연속할당의 순차 접근 성능을 활용하면서 단편화와 메타데이터 크기를 줄인다. ext4, XFS, Btrfs, NTFS가 이 방식을 사용한다.
Copy-on-Write(CoW)는 데이터를 수정할 때 기존 블록을 덮어쓰지 않고 새 블록에 기록한 뒤 포인터를 갱신한다. 원본 데이터를 보존하므로 스냅샷 지원, 데이터 무결성, 파일 시스템 일관성에 활용된다. Btrfs, ZFS, APFS가 사용한다.