파일 시스템 (File System)
한눈에 보기
저장 장치 위에 파일과 디렉터리라는 추상화를 만드는 파일 시스템을 다룬다. 슈퍼블록과 아이노드 구조, 연속과 연결과 색인 할당 비교, 저널링과 쓰기 시 복사, VFS 계층까지 정리한다.
최종 업데이트 2026.09.17
파일 시스템(File System)은 운영체제가 디스크 같은 저장 장치 위에 파일과 디렉터리를 만들고 읽고 쓰는 방식을 정의한 체계다. 저장 장치는 본질적으로 번호가 붙은 블록의 나열일 뿐이므로, 파일 시스템이 그 위에 이름, 계층 구조, 권한, 메타데이터 같은 추상화를 얹어 준다. 어떤 블록에 데이터를 배치하고 어떻게 찾아가는지가 파일 시스템 설계의 핵심이다.
파일과 디렉터리라는 추상화
파일은 연속된 바이트의 논리적 묶음이고, 운영체제는 파일마다 이름 외에 크기, 소유자, 접근 권한, 생성과 수정 시각 같은 메타데이터(metadata)를 함께 관리한다. 디렉터리는 파일 이름과 그 파일의 메타데이터 위치를 잇는 일종의 표이며, 디렉터리가 디렉터리를 담을 수 있으므로 트리(tree) 형태의 계층 구조가 만들어진다. 유닉스(Unix) 계열에서는 하드 링크(hard link)로 한 파일이 여러 이름을 가질 수 있어 엄밀히는 비순환 그래프에 가깝다. 응용 프로그램은 open, read, write, close 같은 시스템 콜을 통해 이 추상화를 사용하며, 실제 블록 배치는 전혀 알 필요가 없다.
디스크 위의 구조: 슈퍼블록과 아이노드
유닉스 계열 파일 시스템의 파티션은 대체로 다음 요소로 구성된다. 부트 블록(boot block)은 부팅 코드를 담고, 슈퍼블록(superblock)은 전체 블록 수, 아이노드 수, 빈 공간 현황 같은 파일 시스템 전역 정보를 담는다. 아이노드(inode)는 파일 하나의 메타데이터와 데이터 블록 위치 정보를 담는 고정 크기 구조체이고, 나머지 영역이 실제 데이터 블록이다. 중요한 점은 아이노드에 파일 이름이 없다는 것이다. 이름은 디렉터리 항목이 갖고, 디렉터리 항목은 이름과 아이노드 번호의 쌍이다. 그래서 하드 링크는 같은 아이노드 번호를 가리키는 서로 다른 디렉터리 항목일 뿐이다.
경로 /home/dev/note.txt 를 여는 과정(개념)
1. 루트 디렉터리의 아이노드를 읽는다
2. 루트의 데이터 블록에서 "home" 항목을 찾아 아이노드 번호를 얻는다
3. home 디렉터리에서 "dev" 항목을 찾는다
4. dev 디렉터리에서 "note.txt" 항목을 찾는다
5. note.txt의 아이노드가 가리키는 데이터 블록을 읽는다
블록 할당 방식 비교
파일 데이터를 어느 블록에 두는지에 따라 세 가지 고전적 방식이 있다.
| 방식 | 동작 | 장점 | 단점 |
|---|---|---|---|
| 연속 할당(Contiguous) | 파일을 이어진 블록에 저장 | 순차와 임의 접근 모두 빠르다 | 외부 단편화가 심하고 파일 확장이 어렵다 |
| 연결 할당(Linked) | 각 블록이 다음 블록 번호를 가리킨다 | 단편화가 없고 확장이 자유롭다 | 임의 접근이 느리고 포인터 하나만 깨져도 뒷부분을 잃는다 |
| 색인 할당(Indexed) | 블록 번호들을 색인 블록에 모아 둔다 | 임의 접근이 빠르고 확장이 쉽다 | 작은 파일에도 색인 블록 오버헤드가 든다 |
실제 ext4 계열은 색인 할당을 발전시킨 형태를 쓴다. 아이노드가 직접 블록 포인터 몇 개와 간접, 이중 간접, 삼중 간접 포인터를 가져 작은 파일은 빠르게, 큰 파일은 단계적으로 처리한다. 최신 파일 시스템은 개별 블록 대신 연속 구간을 통째로 기록하는 익스텐트(extent) 방식으로 메타데이터를 줄인다. FAT(File Allocation Table)는 연결 할당의 포인터를 별도 표에 모아 둔 변형으로, 표를 메모리에 올려 임의 접근 문제를 완화한다.
저널링과 무결성
파일 하나를 쓰는 작업도 아이노드 갱신, 빈 블록 비트맵 갱신, 데이터 기록 등 여러 블록 쓰기로 이루어진다. 도중에 전원이 꺼지면 메타데이터가 서로 어긋난 상태가 될 수 있다. 저널링(journaling) 파일 시스템은 변경 내용을 먼저 저널이라는 로그 영역에 기록하고 나서 본 위치에 반영한다. 장애가 나면 저널을 재생(replay)해 일관성을 복구하므로 전체 디스크 검사 없이 빠르게 복구된다. ext4와 NTFS가 이 방식이고, APFS와 Btrfs는 데이터를 제자리에 덮어쓰지 않고 새 위치에 쓴 뒤 포인터를 바꾸는 쓰기 시 복사(copy-on-write) 전략으로 무결성과 스냅샷(snapshot) 기능을 함께 얻는다.
가상 파일 시스템 계층
하나의 시스템에는 ext4, FAT32 기반의 USB, 네트워크 파일 시스템 등 여러 파일 시스템이 동시에 마운트될 수 있다. 운영체제는 가상 파일 시스템(VFS, Virtual File System) 계층을 두어 응용에는 동일한 시스템 콜 인터페이스를 보여 주고, 내부에서 각 파일 시스템 구현으로 호출을 분기한다. 덕분에 응용 프로그램은 파일이 어떤 파일 시스템 위에 있는지 신경 쓰지 않고 같은 코드로 접근할 수 있다. 성능을 위해 커널은 읽고 쓴 블록을 페이지 캐시(page cache)에 보관하므로, write가 성공해도 데이터는 아직 메모리에만 있을 수 있다. 데이터베이스처럼 내구성이 중요한 소프트웨어가 fsync 호출로 디스크 반영을 강제하는 이유가 여기에 있으며, 파일 시스템을 이해하면 이런 실무 동작의 근거를 설명할 수 있게 된다.
면접에서 이렇게 물어본다
- 아이노드에는 어떤 정보가 들어 있고 파일 이름은 왜 아이노드가 아니라 디렉터리에 있는가.
- 하드 링크와 심볼릭 링크의 차이를 아이노드 관점에서 설명해 보라.
- 연속, 연결, 색인 할당의 장단점을 비교하고 ext4가 큰 파일을 다루는 방식을 설명해 보라.
- 저널링이 해결하려는 문제는 무엇이고 쓰기 시 복사 방식과는 어떻게 다른가.
- 경로 /a/b/c.txt를 열 때 파일 시스템 내부에서 일어나는 일을 순서대로 말해 보라.
운영체제에서 같이 읽기
- CPU 스케줄링 (CPU Scheduling)운영체제가 준비 상태의 여러 프로세스 중 다음에 CPU를 쓸 프로세스를 고르는 CPU 스케줄링을 다룬다. 선점과 비선점, FCFS부터 라운드 로빈과 MLFQ까지 알고리즘 비교, 리눅스 CFS와 EEVDF까지 정리한다.
- 교착 상태 (Deadlock)둘 이상의 프로세스가 서로가 점유한 자원을 기다리며 영원히 멈추는 교착 상태를 다룬다. 네 가지 필요조건, 예방과 회피와 탐지 회복 전략, 기아와 라이브락의 구분, 데이터베이스 데드락 실무 사례까지 정리한다.
- 인터럽트 (Interrupt)CPU가 하던 일을 멈추고 긴급한 사건을 먼저 처리하게 하는 인터럽트를 다룬다. 폴링과의 비교, 하드웨어 인터럽트와 예외와 트랩의 구분, 처리 절차와 상반부 하반부, 타이머 인터럽트와 멀티태스킹의 관계를 정리한다.
- 프로세스 간 통신 (IPC, Inter Process Communication)독립된 주소 공간을 가진 프로세스들이 데이터를 주고받는 IPC를 다룬다. 메시지 전달과 공유 메모리 모델, 파이프와 메시지 큐와 소켓 등 기법 비교, 파이프 코드 예시와 실무 선택 기준까지 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기