1. 파일 시스템이란?
1) 파일이란?
- 관련된 정보의 논리적 집합
- 사용자는 파일을 논리적으로 다루지만, 운영체제는 물리적으로 저장 장치에 맵핑함
2) 파일 시스템이란?
- 운영체제의 구성요소로서 두 가지 주요 기능을 담당함
- 파일 관리 기능 제공
- 생성, 삭제, 읽기, 쓰기, 공유, 보호 등
- 저장 장치에 파일 저장
- ex) FAT, NTFS, ext2/3, NFS 등 다양한 파일 시스템 존재
2. 파일의 구성 요소
1) 파일의 종류
- 프로그램 파일: 소스 코드, 오브젝트 파일 등
- 데이터 파일: 텍스트, 이미지, 음성 등 바이너리 데이터
2) 파일의 구조
- 바이트 나열 (비구조적)
- 고정/가변 크기 레코드 (간단 구조)
- 포맷화된 문서 (복잡 구조)
💡 운영체제는 대부분 파일을 바이트 나열로 처리
3) 파일의 속성 (Attributes)
- 이름, 확장자, 위치, 크기, 생성/수정 시간, 사용자, 접근 권한 등
- 보통 디렉토리에 메타데이터 형태로 저장됨
4) 파일 조작 연산
- create(), read(), write(), open(), close(), seek(), truncate(), delete()
예시 코드
int wfd, rfd;
char buf[256];
rfd = open("./readme", O_RDONLY, S_IRUSR);
wfd = open("./outfile", O_WRONLY, S_IWUSR);
read(rfd, buf, sizeof(buf));
write(wfd, buf, sizeof(buf));
close(wfd);
close(rfd);
3. 디렉토리 (Directory)
1) 디렉토리란?
- 파일 정보를 관리하는 구조체
- 사용자 파일 관리, 보호, 공유 기능 제공
2) 디렉토리 조작 연산
- mkdir, rmdir, opendir, closedir, readdir, stat
4. 디렉토리 구조의 유형
1) 단일 디렉토리 구조 (Single-Level Directory)

구조
- 모든 파일이 하나의 디렉토리에 존재
- 시스템 전체에 하나의 전역 디렉토리만 존재함
특징
- 매우 단순한 구조
- 파일 검색이 빠르고 간단함
단점
- 이름 충돌(Name Conflict) 발생: 같은 이름의 파일을 만들 수 없음
- 파일 그룹화 불가능: 관련 파일을 분류하거나 관리하기 어려움
예시
/
├── file1.txt
├── file2.txt
└── program.c
2) 2단계 디렉토리 구조 (Two-Level Directory)

구조
- 각 사용자마다 고유한 디렉토리를 가짐
- 사용자 디렉토리 아래에 각자의 파일을 보관
특징
- 사용자 간 파일 이름 충돌 없음 (각 사용자 영역이 독립적)
- 사용자가 자신의 디렉토리 내에서 자유롭게 파일을 생성
단점
- 사용자 내에서 이름 충돌 가능
- 파일을 공유하거나 그룹화하기 어려움
예시
/
├── userA
│ ├── report.doc
│ └── code.c
└── userB
├── report.doc
└── image.jpg
3) 트리 구조 디렉토리 (Tree-Structured Directory)

구조
- 루트 디렉토리를 중심으로 서브 디렉토리를 계층적으로 확장
- 파일과 디렉토리는 유일한 경로를 가짐
특징
- 효율적인 파일 검색 가능
- 파일과 디렉토리를 그룹핑 및 정리 가능
- 동일한 파일 이름을 서로 다른 디렉토리에서 허용
단점
- 파일 간 공유 불가 (같은 파일을 두 위치에서 동시에 접근 불가)
예시
/
├── home
│ ├── userA
│ │ └── project
│ │ └── report.doc
│ └── userB
│ └── image.jpg
└── etc
└── config.txt
4) 비순환 그래프 구조 디렉토리 (Acyclic Graph Directory)

구조
- 트리 구조를 확장한 형태로, 파일이나 디렉토리를 여러 사용자와 공유 가능
- 파일 또는 디렉토리에 대해 **링크(하드 링크, 심볼릭 링크)**를 허용
특징
- 파일 공유 가능: 협업, 라이브러리 공유 등 유용
- 공간 낭비 없이 동일 파일을 여러 디렉토리에서 참조 가능
단점
- 순환(Cycle) 발생 가능 → 이를 방지하기 위해 **비순환(Acyclic)**을 유지해야 함
- 삭제 처리 복잡성: 참조 카운트(reference count)를 이용하여 마지막 참조가 제거될 때 실제 삭제
예시
/
├── userA
│ └── shared -> /common/lib/tool.jar
├── userB
│ └── shared -> /common/lib/tool.jar
└── common
└── lib
└── tool.jar
5. 디스크 공간 할당 방식
- 운영체제는 파일을 논리 블록 단위로 나누고, 이를 디스크의 물리 블록에 매핑함
- 이를 위한 대표적인 3가지 방식은 다음과 같음
1) 연속 할당 (Contiguous Allocation)

- 파일을 디스크의 연속된 블록에 저장
- 디렉토리에 시작 블록과 길이 정보 저장
장점: 빠른 순차/직접 접근
단점: 외부 단편화 발생, 공간 부족 시 파일 확장 어려움
해결책: 공간 압축
2) 연결 할당 (Linked Allocation)

- 블록이 디스크에 흩어져 있고, 포인터로 연결
- 디렉토리에는 시작/끝 블록만 저장
- 각 블록은 다음 블록 번호를 포함
장점: 외부 단편화 없음
단점: 직접 접근 비효율적, 포인터 공간 소모
대표 예시: FAT(File Allocation Table)
3) 색인 할당 (Indexed Allocation)

- 파일마다 색인 블록을 생성하여 모든 블록 번호 저장
- 디렉토리는 색인 블록 번호만 관리
장점: 순차/직접 접근 모두 효율적, 외부 단편화 없음
단점: 작은 파일은 색인 블록이 공간 낭비 발생 가능(색인 블록에서 -1로 표시된 공간은 사용 x)
'OS' 카테고리의 다른 글
| [운영체제] 보조 기억 장치란? (0) | 2025.06.04 |
|---|---|
| [운영체제] 스레싱과 지역성이란?? (0) | 2025.05.28 |
| [운영체제] 페이지 교체 알고리즘이란? (0) | 2025.05.26 |
| [운영체제] 가상 기억장치란?? (0) | 2025.05.21 |
| [운영체제] 페이지 테이블 구조 란?? (0) | 2025.05.19 |