본문 바로가기
CS 공부/컴퓨터 구조, 운영체제

운영체제(7) - 파일 시스템

by 프롭 2026. 2. 18.

 

파일과 디렉터리

 

파일

 

일상적으로 컴퓨터를 이용할 때는 파일 단위로 이용한다. 파일이란 하드 디스크나 SSD와 같은 보조기억장치에 저장된 관련 정보의 집합을 의미한다.

 

모든 파일에는 이름과 파일을 실행하기 위한 정보, 그리고 파일 관련 부가 정보가 있다. 이 부가 정보를 속성 또는 메타데이터라고 부른다.

 

윈도우 운영체제를 사용한다면 파일 속성을 한 번쯤 보았을 것이다. 여기서 파일 형식, 위치, 크기 등 파일과 관련된 다양한 정보가 나타나는데 이것이 파일 속성이다.

 

  • 파일 속성과 유형

운영체제마다 유지하는 파일 속성은 조금씩 차이가 있지만 대표적인 파일 속성의 종류는 다음과 같다.

속성 이름
의미
유형
운영체제가 인지하는 파일의 종류
크기
파일의 현재 크기와 허용 가능한 최대 크기
보호
어떤 사용자가 해당 파일을 읽고, 쓸고 실행할 수 있는지
생성 날짜
파일이 생성된 날짜
마지막 접근 날짜
파일에 마지막으로 접근한 날짜
마지막 수정 날짜
파일이 마지막으로 수정된 날짜
생성자
파일을 생성한 사용자
소유자
파일을 소유한 사용자
위치
파일의 보조기억장치상의 현재 위치

 

파일 유형은 운영체제가 인식하는 파일 종류를 나타낸다. 같은 이름의 파일일지라도 유형이 다르면 실행 양상도 달라진다. 파일 유형을 알리기 위해 가장 흔히 사용하는 방식은 파일 뒤에 붙는 확장자를 이용하는 것이다.

파일 유형
대표적인 확장자
실행파일
없는 경우, exe, com, bin
목적 파일
obj, o
소스 코드 파일
c, cpp, cc, java, asm, py
워드 프로세서 파일
xml, rtf, doc, docx
라이브러리 파일
lib, a, so, dll
멀티 미디어 파일
mpeg, mov, mp3, mp4, avi
백업/보관 파일
rar, zip, tar
  • 파일 연산을 위한 시스템 호출

파일을 다루는 모든 작업은 운영체제에 의해 이뤄진다. 어떠한 응용 프로그램도 임의로 파일을 조작할 수 없으며 운영체제를 통해야 한다. 운영체제는 파일 연산을 위한 다음과 같은 시스템 호출을 제공한다. 파일 생성, 파일 삭제, 파일 열기, 파일 닫기, 파일 읽기, 파일 쓰기

 

디렉터리

 

파일들을 일목요연하게 관리하기 위해 디렉터리를 이용할 수 있다. 윈도우 운영체제에서는 폴더라 부른다.

 

옛날 운영체제에서는 하나의 디렉터리만 존재했다. 모든 파일이 하나의 디렉터리 아래에 있어 이를 1단계 디렉터리라고 부른다.

 

하지만 1단계 디렉터리로는 많은 파일을 관리하기 어렵기 때문에 여러 계층을 가진 트리 구조 디렉터리가 생겨났다.

 

트리 구조 디렉터리는 최상위 디렉터리가 있고 그 아래에 여러 서브 디렉터리(자식 디렉터리)가 있을 수 있다. 최상위 디렉터리는 흔히 루트 디렉터리라고 부르고 슬래시로 표현한다.

 

그러다 보니 자연스레 생긴 개념이 경로다. 경로는 디렉터리를 이용해 파일 위치, 나아가 파일 이름을 특정 짓는 정보다.

 

  • 절대 경로와 상대 경로

같은 디렉터리에는 동일한 이름의 파일이 존재할 수 없지만 서로 다른 디렉터리에는 동일한 이름의 파일이 존재할 수 있다. 이는 루트 디렉터리부터 파일까지 경로가 다르기 때문에 동일한 이름임에도 공존할 수 있는 것이다. 그래서 모든 파일은 루트 디렉터리에서 자기 자신까지 이르는 고유한 경로를 가지고 있고, 이러한 경로를 절대 경로라고 부른다.

 

운영체제에서 슬래시 기호는 루트 디렉터리를 표시할 뿐만 아니라 디렉터리와 디렉터리 사이의 구분자로도 사용한다.

 

경로를 나타내는 또 다른 대중적인 방식으로 상대 경로가 있다. 절대 경로가 루트 디렉터리부터 시작하는 경로라면 상대 경로는 현재 디렉터리부터 시작하는 경로다.

 

+ 대부분의 운영체제는 현재 작업 디렉터리를 마침표(.)로 나타내고 현재 작업 디렉터리의 상위 디렉터리를 마침표 두 번(..)로 나타낸다. 그리고 흔히 이 기호를 이용해 상대 경로를 표현한다.

 

  • 디렉터리 연산을 위한 시스템 호출

운영체제가 파일 연산을 위한 시스템 호출을 제공하는 것처럼 운영체제는 디렉터리 연산을 위한 시스템 호출을 다음과 같이 제공한다. 디렉터리 생성, 디렉터리 삭제, 디렉터리 열기, 디렉터리 닫기, 디렉터리 읽기

 

  • 디렉터리 엔트리

많은 운영체제에서는 디렉터리를 그저 특별한 형태의 파일로 간주한다. 즉, 단지 포함된 정보가 조금 특별한 파일이다.

 

디렉터리는 내부에 해당 디렉터리에 담겨 있는 대상과 관련된 정보를 담고 있다. 그리고 이 정보는 보통 보조기억장치에 테이블 형태의 정보로 저장된다.

 

각각의 엔트리(행)에 담기는 정보는 파일 시스템마다 차이가 있다. 다만 파일 시스템을 막론하고 디렉터리 엔트리가 공통으로 포함하는 정보가 바로 디렉터리에 포함된 대상의 이름과 그 대상이 보조기억장치 내에 저장된 위치를 유추할 정보가 담긴다는 것이다.

 

파일 시스템

 

파일 시스템은 파일과 디렉터리를 보조기억장치에 일목요연하게 저장하고 접근할 수 있게 하는 운영체제 내부 프로그램이다. 파일 시스템에는 다양한 종류가 있고 하나의 컴퓨터에서 여러 파일 시스템을 사용할 수 있다.

 

파티셔닝과 포매팅

 

새 하드 디스크 또는 SSD가 있다 해보자. 이곳에 바로 파일을 생성하거나 저장할 수 없다. 왜냐하면 이곳을 사용하려면 파티션을 나누는 작업(파티셔닝)과 포맷 작업(포매팅)을 거쳐야 하기 때문이다.

 

파티셔닝은 저장 장치의 논리적인 영역을 구획하는 작업을 의미한다. 하드 디스크나 SSD처럼 용량이 큰 저장 장치를 하나 이상의 논리적인 단위로 구획하는 것이다. 파티셔닝 작업을 통해 나누어진 영역 하나하나를 파티션이라 한다.

 

포맷하는 작업, 즉 포매팅은 파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지를 결정하고, 새로운 데이터를 쓸 준비를 하는 작업을 의미한다. 즉, 어떤 종류의 파일 시스템을 사용할지는 이때 결정된다.

 

포매팅의 종류에는 저수준 포매팅논리적 포매팅이 있다. 전자는 저장 장치를 생성할 당시 수행되는 물리적인 포매팅이고, 후자는 파일 시스템을 생성하는 포매팅이다. 이 절에서 설명하는 포매팅은 후자다.

 

파일 할당 방법

 

운영체제는 파일과 디렉터리를 블록 단위로 읽고 쓴다. 즉, 하나의 파일이 보조기억장치에 저장될 때 하나 이상의 블록에 걸쳐 저장된다. 하드 디스크의 가장 작은 저장 단위는 섹터이지만, 운영체제는 하나 이상의 섹터를 블록이라는 단위로 묶은 뒤 블록 단위로 파일과 디렉터리를 관리한다. 파일 시스템이 모든 섹터를 관리하기에는 개수가 너무 많고 크기도 작기 때문이다.

 

파일을 보조기억장치에 할당하는 방법으로 연속할당 불연속 할당이 있다. 그리고 불연속 할당에는 연결 할당색인 할당이 있다.

 

  • 연속 할당

연속 할당은 이름 그대로 보조기억장치 내 연속적인 블록에 파일을 할당하는 방식이다. 연속으로 할당된 파일에 접근하기 위해 파일의 첫 번째 블록 주소와 블록 단위의 길이만 알면 된다. 그렇기에 이 파일 시스템은 디렉터리 엔트리에 파일 이름과 첫 번째 블록 주소와 블록 단위의 길이를 명시한다. 하지만 그저 연속으로 저장하기에 구현이 단순하지만 외부 단편화를 야기한다는 문제가 있다.

 

  • 연결 할당

연속 할당의 문제를 해결할 수 있는 방식이 연결 할당이다. 연결 할당은 각 블록 일부에 다음 블록의 주소를 저장하여 각 블록이 다음 블록을 가리키는 형태로 할당하는 방식이다. 즉, 파일을 이루는 데이터를 연결 리스트로 관리한다. 연결 할당은 불연속 할당의 일종이기에 파일이 여러 블록에 흩어져 저장되어도 무방하다. (C언어의 포인터와 같은 개념이다.) 이 파일 시스템에서는 디렉터리 엔트리에 연속 할당과 마찬가지로 파일 이름과 함께 첫 번째 블록 주소와 블록 단위의 길이를 명시한다.

 

하지만 외부 단편화를 해결한 연결 할당 또한 단점이 있다.

 

첫째, 반드시 첫 번째 블록부터 하나씩 차례대로 읽어야 한다.

중간 부분부터 접근하고 싶어도 반드시 파일의 첫 번째 블록부터 접근하여 하나씩 차례대로 읽어야 한다는 단점이다. 파일 내 임의의 위치에 접근하는 속도(임의 접근) 속도가 매우 느리다. 크기가 큰 파일들에서 성능이 더욱 비효율적이다.

 

둘째, 하드웨어 고장이나 오류 발생 시 해당 블록 이후 블록은 접근할 수 없다.

하나의 블록 안에 파일 데이터와 다음 불록 주소가 모두 포함되어 있다. 하나라도 문제가 발생하면 이후의 블록에 접근할 수 없다는 것이다.

 

이를 변형하여 구현한 파일 시스템이 FAT 파일 시스템이다.

 

  • 색인 할당

색인 할당은 파일의 모든 블록 주소를 색인 블록이라는 하나의 블록에 모아 관리하는 방식이다. 색인 할당은 연결 할당과 달리 파일 내 임의의 위치에 접근하기 쉽다. 파일의 n 번째 데이터 블록에 접근하고 싶다면 색인 블록의 n번째 항목이 가리키는 블록에 접근하면 되기 때문이다.

 

색인 블록 안에 파일을 구성하는 데이터 블록 주소가 있으므로 색인 블록만 알면 해당 파일 데이터에 접근할 수 있다. 이 파일 시스템에서는 디렉터리 엔트리에 파일 이름과 더불어 색인 블록 주소를 명시한다.

 

이를 기반으로 만든 파일 시스템이 유닉스 파일 시스템이다.

 

파일 시스템 살펴보기

 

  • FAT 파일 시스템

연결 할당의 단점을 보완한 파일 시스템이 FAT 파일 시스템이다. 각 블록에 포함된 다음 블록의 주소들을 한데 모아 테이블 형태로 관리하면서 앞서 언급한 단점들을 상당부 해소할 수 있다. 이러한 테이블을 파일 할당 테이블(FAT : File Allocation Table)이라 한다. 디렉터리 엔트리에는 파일 이름과 더불어 파일의 첫 번째 블록 주소가 명시된다. FAT 파일 시스템은 버전에 따라 FAT12, FAT16, FAT32가 있으며 뒤에 오는 숫자는 블록을 표현하는 비트 수를 의미한다.

+ 윈도우에서는 블록이라는 용어 대신 클러스터라는 용어를 사용한다.

 

FAT 파일 시스템에서 FAT는 파티션의 앞부분에 만들어진다. FAT 파일 시스템으로 포맷하면 해당 파티션이 다음과 같이 구성된다. FAT 영역에 FAT가 저장되고 뒤이어 루트 디렉터리가 저장되는 영역과 그 뒤에 서브 디렉터리와 파일들을 위한 영역이 온다.

예약 영역
FAT 영역
루트 디렉터리 영역
데이터 영역

 

FAT는 하드 디스크 파티션의 시작 부분에 있지만, 실행하는 도중 FAT가 메모리에 캐시될 수 있다. FAT가 메모리에 적재되면 기존 연결 할당보다 다음 블록을 찾는 속도가 매우 빨라지고 임의 접근에도 유리해진다.

 

FAT 파일 시스템의 디렉터리 엔트리에는 파일 이름과 더불어 파일의 첫 번째 블록 주소가 명시된다 했다. 이것 외에도 파일 속성(이름, 확장자, 속성, 크기 등등)과 관련한 다양한 정보들이 있다.

 

  • 유닉스 파일 시스템

색인 할당 기반의 유닉스 파일 시스템이다. 색인 할당은 색인 블록을 기반으로 파일의 데이터 블록들을 찾는 방식이다. 유닉스 파일 시스템에서 이 색인 블록은 i-node라 부른다.

 

i-node에는 파일 속성 정보와 열다섯 개의 블록 주소가 저장될 수 있다. 유닉스 파일 시스템에서 파일 속성 정보는 i-node에 표현된다. 유닉스 파일 시스템에는 파일마다 이러한 i-node가 있고 i-node마다 번호가 부여되어 있다. i-node들은 다음과 같이 파티션 내 특정 영역에 모여 있다. i-node 영역에 i-node들이 있고, 데이터 영역에 디렉터리와 파일들이 있다.

예약 영역
i-node 영역
데이터 영역

 

여기서 한 가지 문제가 있는데 i-node의 크기가 열다섯 개의 블록 주소로 유한하다는 것이다. 이러한 문제를 다음과 같이 해결한다.

 

첫째, 블록 주소 중 열두 개에는 직접 블록 주소를 저장한다.

i-node가 가리킬 수 있는 열다섯 개의 블록 주소 중 처음 열두 개에는 파일 데이터가 저장된 블록 주소가 직접 명시된다. 파일 데이터가 저장된 블록을 직접 블록이라 한다. 이것만으로 파일 데이터 블록은 모두 가리 킬 수 있다면 추가적인 작업이 필요하지 않는다.

 

둘째, 첫째 내용으로 충분하지 않다면 열세 번째 주소에 단일 간접 블록 주소를 저장한다.

열두 개의 블록 주소로 파일의 모든 블록은 가리킬 수 없다면 i-node의 열세 번째 블록 주소를 이용한다. 열세 번째 블록 주소는 단일 간접 블록의 주소를 저장한다. 단일 간접 블록이란 파일 데이터가 저장된 블록이 아닌 파일 데이터를 저장한 블록 주소가 저장된 블록을 의미한다.

 

셋째, 둘째 내용으로 충분하지 않다면 열네 번째 주소에 이중 간접 블록 주소를 저장한다.

열세 개의 블록 주소로 파일의 모든 블록은 가리킬 수 없다면 i-node의 열네 번째 블록 주소를 이용한다. 열네 번째 블록 주소는 이중 간접 블록의 주소를 저장한다. 이중 간접 블록이란 데이터 블록 주소를 저장하는 블록 주소가 저장된 블록을 의미한다. 즉, 단일 간접 블록들의 주소를 저장하는 블록이 이중 간접 블록이다.

 

넷째, 셋째 내용으로 충분하지 않다면 열다섯 번째 주소에 삼중 간접 블록 주소를 저장한다.

열네 개의 블록 주소로 파일의 모든 블록은 가리킬 수 없다면 i-node의 열다섯 번째 블록 주소를 이용한다. 열다섯 번째 블록 주소는 삼중 간접 블록의 주소를 저장한다. 삼중 간접 블록이란 이중 간접 블록 주소가 저장된 블록을 의미한다.

 

이로써 i-node만 알면 파일 속성뿐만 아니라 파일 크기가 크더라도 파일 데이터를 모두 가리킬 수 있다. 유닉스 파일 시스템의 디렉터리 엔트리는 파일 이름과 i-node 번호로 구성된다.

 

저널링 파일 시스템

 

컴퓨터를 이용해 작업을 하던 도중 갑자기 전원이 나가거나 치명적인 오류로 인해 컴퓨터가 강제로 종료된 상황을 가정하자. 파일 시스템을 변경하는 도중 이러한 상황(시스템 크래시)이 발생하면 파일 시스템이 훼손될 수 있다.

 

이런 상황이 발생하면 부팅 직후 파일 시스템을 검사하고 복구하는 프로그램을 실행시킨다. 모든 블록에 대해 파일 시스템을 검사하기 때문에 시간이 매우 오래 걸린다는 문제가 있다. 그래서 저널링 기법을 이용하는 저널링 파일 시스템이 등장했다. 저널링 기법이란 작업 로그를 통해 시스템 그래시가 발생했을 때 빠르게 복구하기 위한 방법이다. 이는 다음과 같은 순서로 수행된다.

 

  1. 작업 직전 파티션의 로그 영역에 수행하는 작업에 대한 로그를 남긴다.
  2. 로그를 남긴 후 작업을 수행한다.
  3. 작업이 끝났다면 로그를 삭제한다.

 

이 경우 작업 도중 시스템 크래시가 발생하여 재부팅을 해도 전체를 검사할 필요 없이 로그 영역에 남긴 로그만 검사해도 된다. 즉 저널링 파일 시스템은 시스템 크래시가 발생한 직후에 로그 영역을 읽어 크래시가 발생한 당시 어떤 작업을 실행 중이었는지 알아낸 다음 해당 작업을 완료한다.

 

마운트

 

마운트는 한 저장 장치의 파일 시스템에서 다른 저장 장치의 파일 시스템에 접근할 수 있도록 파일 시스템을 편입 시키는 작업을 의미한다. USB와 같은 메모리의 파일 시스템을 컴퓨터에 mount 명령어로 연결해 사용할 수 있다.