이번 포스팅에서는 디스크 같은 보조기억장치 위 데이터를 파일 단위로 저장하고 관리하는 방식인 파일 시스템(File System)을 정리해보겠습니다.
먼저 디스크는 파티션으로 나눠 파일 시스템을 위한 저장 공간으로 쓰이거나, 메모리가 부족할 때를 대비한 Swapping(backing store) 용도로 사용됩니다. 본격적으로 파일 시스템을 설명하기 전에, 파일 시스템에서 계속 나오는 기본 용어부터 정리하고 넘어가겠습니다.
-
File(파일): 파일 시스템에 저장되는 이름을 가진 데이터의 모음입니다. 디스크에 저장되며, 이름을 통해 접근합니다. -
File attribute(metadata): 파일 크기, 위치, 권한, 소유자, 시간 정보 등 파일을 관리하기 위한 정보입니다. -
디렉터리(
Directory): 파일의 이름을 실제 파일 객체(메타데이터)와 매핑해주는 목록(테이블)을 담고 있는 파일입니다. -
Partition(=Logical Disk): 운영체제가 하나의 디스크 단위로 다루는 논리적인 단위입니다.
Open()
운영체제가 파일을 사용하려면 이름(경로)으로 파일을 찾아서, 해당 파일을 프로세스가 접근할 수 있는 형태로 열어(open) 주는 과정이 필요합니다.

open()은 파일 내용을 바로 읽는 연산이 아니라, 파일 접근에 필요한 메타데이터(metadata)를 디스크에서 메모리로 가져오는 연산입니다.

예를 들어 open("/a/b/c")를 호출하면, 운영체제는 루트 디렉터리(/)부터 시작해 a → b → c 순서로 디렉터리를 따라가며 각 디렉터리의 내용을 확인하고, 다음 엔트리의 위치를 찾아 최종적으로 파일 c의 메타데이터에 도달합니다.
open()이 끝나면 운영체제는 메모리에 open file table을 갱신합니다.
시스템 전체 관점의 open file table에는 열린 파일의 메타데이터가 저장되고, 디스크 메타데이터 외에도 현재 열린 횟수, 현재 접근 위치를 나타내는 file offset 같은 정보가 함께 관리됩니다.
또한 프로세스마다 file descriptor table이 있고, open()의 반환값인 fd(file descriptor)는 이 테이블의 엔트리입니다.
파일에 접근할 때마다 read를 한다면 많은 비용이 들어가기 때문에, 한 번 open()을 한다면 read/write시 directory search가 불필요 합니다.
정리하면 open()은 경로 탐색으로 파일의 메타데이터를 메모리에 올리고, 그 항목(fd)을 반환합니다.
이후 read(fd, ...), write(fd, ...)는 fd를 통해 바로 접근하므로 경로 탐색을 반복하지 않습니다.
File Protection
파일 시스템은 여러 사용자와 프로세스가 같은 저장 장치를 공유하므로, 파일마다 누가 어떤 연산을 할 수 있는지를 제한하는 보호 기능이 필요합니다.
대표적인 파일 보호 방법 Access Control Matrix, Grouping, Password가 있습니다.
Access Control Matrix

Access Control Matrix는 주체(사용자/프로세스)와 객체(파일)의 관계를 행렬 형태로 두고, 각 칸에 접근 권한을 기록하는 방식입니다. 개념적으로는 명확하지만, 실제로는 0이 많은 희소 구조가 되기 때문에 행렬 전체를 그대로 쓰기 어렵습니다. 그래서 보통은 ‘권한이 있는 항목’만 따로 연결 리스트 형태로 관리하는데, 이때 권한 외에도 주체/객체를 식별하기 위한 부가 정보가 필요해 오버헤드가 커질 수 있습니다.
Grouping
Grouping은 대부분의 운영체제가 사용하는 방식으로, 사용자를 owner / group / public의 세 그룹으로 나누고 각 그룹에 대한 접근 권한을 표시합니다.
파일마다 소유자(owner)와 그룹(group)을 두고, 나머지는 public(others)로 처리합니다.
표현이 단순하고 관리 비용이 낮아서 실제 시스템에서 널리 사용됩니다.
Password
파일마다 비밀번호를 두고, 접근 시 비밀번호를 확인하는 방식입니다. 구현은 직관적이지만 파일마다 비밀번호를 관리해야 하고 공유/변경 관리가 번거로울 수 있어 일반적인 파일 시스템 권한 관리 방식으로는 잘 쓰이지 않습니다.
Mounting
지금까지는 파일을 열고(open), 권한을 통해 접근을 제한하는 방식(File Protection)을 살펴봤습니다.
하지만 이런 동작들이 가능하려면, 운영체제가 먼저 ‘어느 디스크(파티션)에 어떤 파일 시스템이 있고, 그 파일 시스템을 어떤 경로에서 사용할지’를 알고 있어야 합니다.

즉, 파티션(논리 디스크) 위에 있는 파일 시스템을 디렉터리 트리에 연결해서, 하나의 통합된 경로 이름 공간으로 보이게 만드는 과정이 필요합니다. 이 과정을 Mounting이라고 합니다.
Access Methods
마지막으로 파일 접근에 대해 알아보겠습니다.
파일 접근은 open()으로 열린 파일을 어떤 방식으로 읽고/쓸 것인지를 의미합니다.
파일 접근 방식은 대표적으로 다음과 같습니다.
Sequential Access(순차 접근)은 파일을 처음부터 순서대로 읽고/쓰는 방식입니다.
파일 A, B, C가 있다고 가정하겠습니다.
순차접근은 A → B → C 순서대로 접근합니다.
즉, read()를 3번 호출하면 A를 읽고, 다음에 B, 그 다음에 C를 읽습니다.
Direct Access(임의 접근)은 파일의 임의 위치를 바로 접근하는 방식입니다.
파일 A, B, C가 있다고 가정하겠습니다.
임의 접근은 A, B, C 중 원하는 위치로 바로 이동해 접근합니다.
즉, seek(C) 후 read()를 호출하면 바로 C를 읽고, 이후 seek(A)로 이동해 A를 읽을 수 있습니다.
Conclusion
이번 포스팅에서는 파일 시스템, 파일 보호 기법, 마운팅 등에 대해 알아보았습니다. 다음 포스팅에서는 파일 시스템 구현에 대해 알아보겠습니다.
References
[2] Operating System Concepts(Silberschatz, Galvin and Gagne)