운영체제는 저장 장치(디스크)를 관리하기 위해 두 가지 핵심 추상화 개념을 제공한다. 바로 파일(File)과 디렉터리(Directory)다. 이들은 사용자가 데이터를 쉽게 저장하고, 이름을 붙이고, 정리할 수 있게 해준다.
1. 파일 (Files)
1.1. 파일의 개념
- 정의: 파일은 단순히 바이트들의 선형 배열(Linear array of bytes)이다.
- 특징: 운영체제는 파일의 내용(텍스트인지, 이미지인지 등)을 알지 못하며, 단지 데이터를 영구적으로 저장하고 요청 시 돌려주는 역할만 수행한다.
- 저수준 이름 (Low-level Name): 각 파일은 아이노드 번호(inode number)라는 고유한 번호를 가진다. 사용자는 보통 파일 이름(예: foo.txt)을 사용하지만, OS 내부적으로는 이 번호를 통해 파일을 식별한다.
1.2. 파일 관련 시스템 콜 (API)
파일을 다루기 위해 OS는 다음과 같은 인터페이스를 제공한다.
- open(): 파일을 생성하거나 연다. 성공 시 파일 디스크립터(File Descriptor)라는 정수를 반환한다.
- 파일 디스크립터: 프로세스마다 비공개로 가지는 정수로, 파일을 조작할 수 있는 권한(Capability)을 의미한다.
- read() / write(): 파일 디스크립터를 이용해 데이터를 읽거나 쓴다. 읽고 쓴 만큼 현재 오프셋(Offset)이 자동으로 업데이트되어 순차적인 접근이 가능하다.
- lseek(): 파일 내의 현재 오프셋을 특정 위치로 이동시킨다. 이를 통해 파일의 임의 위치에 접근(Random Access)할 수 있다. 주의할 점은 이 함수가 디스크 헤드를 물리적으로 움직이는 것이 아니라, OS 메모리 내의 변수 값만 변경한다는 점이다.
- fsync(): 성능을 위해 메모리에 버퍼링된 쓰기 작업(Dirty Data)을 즉시 디스크로 강제 전송하여 지속성을 보장한다.
2. 디렉터리 (Directories)
2.1. 디렉터리의 개념
- 정의: 디렉터리 또한 하나의 파일이다. 하지만 그 내용은 (사용자가 읽을 수 있는 이름, 아이노드 번호) 쌍의 리스트로 구성된다.
- 계층 구조 (Directory Tree): 디렉터리는 다른 디렉터리를 포함할 수 있어, 루트 디렉터리(/)로부터 시작하는 트리 구조를 형성한다.
- 경로 (Path): 파일의 위치는 절대 경로(예: /foo/bar.txt)로 표현된다.
2.2. 디렉터리 관련 연산
- 생성: mkdir() 시스템 콜을 사용한다. 디렉터리는 생성될 때 기본적으로 자기 자신을 가리키는 .과 부모를 가리키는 .. 두 개의 항목을 가진다.
- 읽기: 디렉터리는 일반 파일처럼 열 수 없고, opendir(), readdir(), closedir()이라는 별도의 라이브러리 함수를 사용해야 한다.
- 삭제: rmdir()을 사용하지만, 디렉터리가 비어 있을 때( .과 ..만 있을 때)만 삭제할 수 있다.
3. 링크 (Links): 파일에 이름 붙이기
파일 시스템에서는 하나의 파일(아이노드)에 여러 개의 이름을 붙일 수 있다. 이를 링크라고 한다.
3.1. 하드 링크 (Hard Link)
- 명령어: ln file file2
- 원리: 새로운 파일 이름을 생성하고, 원본 파일과 동일한 아이노드 번호를 가리키게 한다. 즉, file과 file2는 이름만 다를 뿐 완전히 같은 파일이다.
- 삭제 (unlink): 파일을 삭제할 때 rm 명령어를 쓰지만, 실제 시스템 콜은 unlink()이다. 이는 디렉터리에서 이름과 아이노드 연결을 끊고 참조 카운트(Reference Count)를 1 줄인다. 참조 카운트가 0이 되어야만 실제 파일 데이터가 디스크에서 해제된다.
3.2. 심볼릭 링크 (Symbolic Link / Soft Link)
- 명령어: ln -s file file2
- 원리: 하드 링크와 달리, 완전히 새로운 파일(새로운 아이노드)을 생성한다. 이 파일의 내용물은 원본 파일의 경로(Pathname)다.
- 특징:
- 원본 파일이 삭제되면 심볼릭 링크는 가리키는 대상이 없는 '댕글링 포인터(Dangling Reference)'가 된다.
- 디렉터리에 대해서도 링크를 걸 수 있으며, 다른 파일 시스템에 있는 파일도 가리킬 수 있다 (하드 링크는 불가능).
4. 메타데이터 (Metadata)
파일의 내용(데이터) 외에 파일 자체에 대한 정보도 중요하다. 이를 메타데이터라고 한다.
- 정보 확인: stat() 시스템 콜을 사용하면 파일의 크기, 소유자, 권한, 수정 시간, 아이노드 번호 등의 정보를 볼 수 있다.
- 저장 위치: 이러한 정보는 파일 시스템의 아이노드(inode) 구조체 안에 저장된다.
요약
- 파일은 바이트의 배열이며 아이노드 번호로 식별된다.
- 디렉터리는 (이름, 아이노드 번호) 쌍을 저장하는 파일이다.
- 하드 링크는 같은 아이노드를 가리키는 다른 이름이고, 심볼릭 링크는 경로를 저장한 별도의 파일이다.
- OS는 open, read, write 등의 시스템 콜을 통해 이러한 추상화된 객체들에 접근할 수 있도록 한다.
'Deep Dive > OS' 카테고리의 다른 글
| [OSTEP] 스터디 15주차 Part.1 파일과 디렉터리 (1) | 2025.12.09 |
|---|---|
| [OSTEP] 스터디 15주차 - 영속성 Redundant Array of Inexpensive Disk (RAID) (0) | 2025.12.09 |
| [OSTEP] 스터디 14주차 - 영속성 1 Part.1 (0) | 2025.12.02 |
| [OSTEP] 스터디 13주차 - 병행성 3 Part.2 (0) | 2025.11.25 |
| [OSTEP] 스터디 12주차 - 병행성 3 Part.1 (0) | 2025.11.25 |
