파일 시스템은 파일과 디렉터리를 보조기억장치에 저장하고 접근 할 수 있게 해주는 운영체제 내부 프로그램이다. 파일 시스템에는 다양한 종류가 있고, 한 컴퓨터에서 여러 파일 시스템을 사용할 수 있다.
파일과 디렉터리가 어떻게 보조기억장치에 할당되고 접근할 수 있는지와 FAT파일 시스템, 유닉스 파일 시스템을 알아보자.
우리가 보조기억장치를 사용하기 위해선 파티션을 나누는 작업(파티셔닝)과 포맷 작업이 이루어져야한다.
파티션을 나누는 작업인 파티셔닝은 보조기억장치를 하나 이상의 논리적인 단위로 구성하는 것이다. 파티셔닝 작업을 통해 나뉜 영역을 파티션이라고 한다.
윈도우에서 '하드 디스크 파티션 만들기 및 포맷'을 입력하면 아래 이미지와 같이 컴퓨터 내의 보조기억장치가 어떻게 파티셔닝 되어 있는지 볼 수 있다.
포메팅(formatting)은 파일 시스템을 설정하여 파일을 저장하고 관리할 방법을 결정한다. 또한, 새로운 데이터를 저장하고 사용할 준비를 하는 작업을 뜻한다.
운영체제는 파일과 디렉터리를 보통 블록 블록 블록(block)단위로 읽고 쓴다. 다시 말해, 하나의 파일이 보조기억장치에 저장될 때는 하나 이상의 블록에 걸쳐 저장된다. 하드 디스크에서 가장 작은 저장 단위는 섹터지만, 운영체제는 이 섹터들을 블록이라는 단위로 묶어 파일과 디렉터리를 관리한다.
보조기억장치에 파일을 할당하는 방법은 크게 두가지가 있는데, 연속 할당과 불연속 할당이다. 불연속 할당에는 크게 연결 할당, 색인 할당이 있다.
연속 할당(contiguous allocation)은 가장 단순한 방식이다. 이름에서 알 수 있듯이 보조기억장치 내 연속적인 블록에 파일을 할당하는 방식이다.
파일에 접근하기 위해 연속 할당을 사용하는 파일 시스템에서는 다음과 같이 디렉터리 엔트리에 파일 이름, 첫 번째 블록 주소, 길이를 명시한다.
연속 할당 방식은 단순하기에 구현이 쉽다는 장점이 있지만 외부 단편화를 야기한다는 문제점이 있다.
가령 A, B, C, D라는 네 개의 파일을 연속적으로 보조기억장치에 할당했다가, 파일 C만을 지우면 아래와 같이 빈 블록이 생겨날 것이다. 그리고 새 파일을 할당하려 하는데 해당 파일이 3개 그 이상의 블록을 차지해야한다면 아래 빈 블록에는 들어갈 수 없을 것이다.
연속 할당에는 치명적인 단점이 있다. 이를 해결할 수 있는 방식이 바로 연결 할당(linked allocation)이다. 연결 할당은 각 블록 일부에 다음 블록의 주소를 저장하는 형태이다.
디렉터리에서 파일 a를 보면 각 10, 5, 2 블럭에 저장되어있다. 각 블럭이 어떻게 연결되어 있는지 보자. 디렉터리 엔트리를 통해 파일 a의 첫 번째 블록 주소는 10번 블록인 것을 알 수 있다. 10번 블록은 5번 블록을 가르키고 5번 블록은 13번 블록을, 13번 블록은 2번 블록을 가르킨다.(-1은 어떤 블록도 가르키지 앟는 다는 뜻이다.)
불연속 할당인 연결 할당은 외부 단편화를 해결하지만 다른 단점이 존재한다.
반드시 첫 번째 블록부터 하나씩 차례대로 읽어야한다.
LinkedList 자료구조와 똑같은 단점을 갖고 있다. 파일의 중간 부분부터 접근하고 싶어도 파일의 첫 번째 블록부터 접근해야하기 때문에 임의 접근(random access)속도가 매우 느리다.
하드웨어 고장이나 오류 발생 시 다른 블록은 접근할 수 없다.
하나의 블록에 파일 데이터와 다음 블록 주소가 포함되있기 때문에 블록에 하나라도 문제가 발생하면 해당 블록 이후의 블록에 접근할 수 없다.
연결 할당은 블록 일부에 다음 블록 주소를 포함하는 방식이다. 색인 할당은(indexed allocation)은 파일의 블록 주소를 색인 블록(index block)이라는 하나의 블록에 모아서 관리하는 방식이다.
파일 시스템은 다양하게 존재한다. 그 중 여러 매체에서 공통적으로 소개 하는 파일 시스템이 두 가지 있는데, 하나는 USB, SD 카드 등 저용량 저장 장치에서 사용되는 FAT 파일 시스템이고, 다른 하나는 유닉스 계열 운영체제에서 사용되는 유닉스 파일 시스템이다.
각 블록에 포함된 다음 블록의 주소를 테이블의 형태로 관리하는 형태를 파일 할당 테이블(FAT;File Allocation Table) 시스템라고 한다.
FAT 파일 시스템은 버전에 따라 FAT12, FAT16, FAT32가 있으며, FAT 뒤에 오는 숫자는 블록을 표현하는 비트 수를 의미한다.
하드 디스크의 파티션을 FAT 파일 시스템으로 포맷하면 다음 이미지와 유사하게 구성된다.
FAT 영역에는 FAT가 저장되고, 루트 디렉터리 영역에는 루트 디렉터리가 저장 된다. 그리고 데이터 영역에는 서브 디렉터리와 파일들이 저장된다.
FAT는 하드 디스크 파티션의 시작 부분에 위치하지만, 실행하는 도중 FAT가 메모리에 캐시될 수 있다. FAT가 메모리에 적재된 채 실행되면 임의 접근의 성능이 개선된다.
FAT의 디렉터리 엔트리에는 파일 이름과 첫 번째 블록 주소가 명시된다. 이 정보 외에도 디렉터리 엔트리에는 다음과 같이 파일 속성과 관련한 다양한 정보들이 있다.
FAT 파일 시스템에선 비연속 할당 중 연결 할당을 개선한 방식이다. 그리고 유닉스 파일 시스템은 색인 할당을 기반한 시스템이다.
색인 할당은 색인 블록을 기반으로 파일의 데이터를 찾는 방식이다. 유닉스 파일 시스템에선 해당 색인 블록을 i-node(index-node)라고 부른다.
i-node에는 파일 속성과 열다섯 개의 블록 주소가 저장될 수 있다. FAT 파일 시스템에선 디렉터리 엔트리 내에 파일 속성 정보가 포함되어있지만, 유닉스 파일 시스템에선 i-node에 포함된다.
i-node들은 다음 이미지와 같이 파티션 내에 i-node 영역에 모여있다. 그리고 데이터 영역에는 디렉터리와 파일들이 담겨있다.
하나의 i-node에는 15개의 블록 주소가 저장될 수 있다고 하였다. 하지만 이렇게 15개로 유한하게 저장할 시 그 이상의 블록, 가령 20개 30개의 블록이 필요한 파일이 존재할 경우 곤란할 수 있다.
유닉스 파일 시스템은 이러한 문제를 다음과 같은 단계로 해결한다.
1. 블록 주소 중 열두 개에는 직접 블록 주소를 저장한다.
i-node내에 열다섯 개의 블록 주소 중 처음 열두개의 블록에는 다음 블록 주소를 가리키는 것이 아닌 파일 데이터가 저장된 블록을 직접적으로 명시한다. 파일 데이터가 저장된 블록을 직접 블록(direct block)이라고 한다. 만약 저장해야할 파일이 12개의 직접 블록만으로 가리킬 수 있다면 추가적으로 작업하지 않는다.
2. 위 단계로 충분치 않다면 열세 번째 주소에 단일 간접 블록 주소를 저장한다.
열두 개의 블록 주소로 파일의 모든 블록을 가리킬 수 없다면 열세 번째 블록을 사용한다. 위와 다르게 열세 번째 블록엔 단일 간접 블록의 주소를 저장한다. 단일 간접 블록(single indirect block)이란 파일 데이터를 저장한 블록들의 주소가 저장된 블록을 의미한다.
3. 위 단계로 충분치 않다면 열네 번째 주소에 이중 간접 블록 주소를 저장한다.
열세 개의 블록으로 파일의 모든 블록을 가리킬 수 없다면 열네 번째 블록 주소를 이용한다.
이중 간접 블록(double indirect block)이란 단일 간접 블록들의 주소를 저장하는 블록을 의미한다.
4. 위 단계로 충분치 않다면 열다섯 번째 주소에 삼중 간접 블록 주소를 저장한다.
열네 개의 블록 주소로 파일의 모든 블록을 가리킬 수 없다면 열다섯 번째 블록을 삼중 간접 블록으로 사용한다. 삼중 간접 블록(triple indirect block)은 이중 간접 블록들의 주소가 저장된 블록이다. 삼중 간접 블록까지 사용한다면 웬만한 크기의 파일은 모두 표현할 수 있다.
파일 시스템을 변경하는 도중에 컴퓨터가 강제로 종료되는 상황이 발생한다면 파일 시스템이 훼손될 수 있다.
저널링 파일 시스템이 생기기 전까진 이런 상황이 발생하면 파일 시스템을 검사하고 복구하는 프로그램을 실행시켰다.
하지만, 해당 프로그램들은 파일 시스템 내의 모든 블록에 대해 검사하기 때문에 오랜 시간이 걸린다는 단점이 있었다.
저널링 파일 시스템(저널링 기법)을 사용하면 작업 로그를 통해 빠르게 복구할 수 있다. 저널링 기법은 다음과 같은 순서로 수행된다.
현대 대부분의 파일 시스템은 이러한 저널링 기능을 지원한다.
마운트는 한 저장 장치의 파일 시스템에서 다른 저장 장치의 파일 시스템에 접근할 수 있도록 파일 시스템을 편입시키는 작업을 의미한다.
유닉스, 리눅스와 같은 운영체제에서 다양한 저장 장치를 컴퓨터에 연결할 때 mount 명령어로 빈번히 마운트한다.
아래 이미지같은 경우 파일시스템의 루트 디렉토리에 USB 메모리 파일 시스템을 마운트한 것이라고 볼 수 있다.
나가는 글
FAT와 유닉스 파일 시스템에 대해서 알아보았다. 이 밖에도 윈도우 운영체제에서 사용하는 NT 파일 시스템(NTFS) 리눅스 운영체제에서 사용하는 ext 파일 시스템 등이 있다.
다음엔 또 다른 파일 시스템에 학습하고 포스팅을 남겨봐야겠다.