[운영체제 7] 파일 시스템(File System)
파일과 디렉터리(File & Directory)
컴퓨터를 할 때마다 만지는 것이 파일과 폴더(디렉토리)다. 이 파일과 디렉터리에 대한 것은 어디서 컨트롤하고 어떻게 이뤄져있을까?
파일(file)은 보조기억장치에 저장된 정보의 집합을 의미한다. 실행 파일, 코드 파일, 미디어 파일 등등..
디렉터리(directory; 윈도우에서는 ‘폴더’:folder)는 파일을 담는 관리 도구로, 이 역시 파일의 일종으로 볼 수 있다. 디렉터리는 보조기억장치에 테이블 형태의 정보로 저장되며, 각 파일의 이름과 위치 정보 등을 디렉터리 엔트리에 갖는다.
이러한 파일들은 각자의 속성(attribute; 또는 메타데이터:metadata)과 경로(path)를 갖는다.
파일 및 디렉터리의 연산은 운영체제의 시스템 콜로 동작한다.
파일 속성
파일의 속성으로는 유형(확장자로 알 수 있음), 크기, 날짜 및 생성자와 소유자, 위치 등이 있다.
이중 파일 유형은 실행/목적/소스 코드/워드 프로세서/라이브러리/멀티미디어/백업 파일 등의 유형이 있으며, .exe나 .obj, .cpp, .py, .mp3, .zip 등의 확장자가 붙는다.
파일 경로
크게 절대 경로(absolute path)와 상대 경로(relative path)가 있는데, 절대 경로는 최상위 디렉터리인 루트 디렉터리(root directory)로부터 슬래시(/; 윈도우의 경우 역슬래시:’')로 따라 들어간다.
상대 경로는 이와 달리 현재 디렉터리가 있다고 할 때, .은 자기 자신, ..은 부모 디렉터리, 슬래시(/)를 통해 자식 디렉터리로 이동한다. 또한 명령 프롬프트에서 cd(change directory) 명령어를 통하여 절대/상대 경로를 지정해 파일에 접근할 수 있다.
파일 시스템(File System)
파일 시스템은 말 그대로 파일과 딕레터리를 저장하고 접근할 수 있게 하는 운영체제 내부의 프로그램이다.
파티셔닝과 포매팅(Partitioning & Formatting)
파일 시스템이 갓 생성된 HDD나 SSD 등에 적용되기 위해선 파티션을 나누고 포맷 작업을 거쳐야 한다.
파티셔닝(partitioning)은 말 그대로 저장 장치 내에 구획, 즉 파티션(partition)을 짓는 작업이다. 사진처럼 Disk0이 파티셔닝되어있는 것을 볼 수 있다.
포매팅은 크게 두 부류로 나뉘는데, 저장 장치를 생성할 떄 공장에서 수행되는 ‘저수준 포매팅(low-level formatting)’과 흔히 저장 장치를 리셋하는 걸로 생각하는 ‘논리적 포매팅(logical formatting)’이 있다. 여기서 말하는 포매팅은 후자다.
(논리적) 포매팅은 어떤 종류의 파일 시스템을 사용할지 결정하는 단계로, 각 파티션마다 다른 파일 시스템을 설정할 수 있다. 즉 파티션마다 다른 포매팅을 진행할 수 있다. 파티셔닝과 포매팅이 끝나면 비로소 파일 시스템이 사용 가능해진다.
파일 할당 방법(File Allocation)
운영체제에서 파일과 디렉터리는 블록(Block, Cluster) 단위로 읽고 쓰는 작업이 진행된다. 그런데 각 블록을 충분히 크게 잡는 것은 내부 단편화(internal fragmentation)가 발생할 수 있다. 따라서 작은 블록 여러개에 걸쳐서 파일을 저장한다.
이 파일 할당 방법으로는 연속 할당과 불연속 할당이 있고, 불연속 할당은 연결 할당, 색인 할당 등의 방식이 있다. 이 연결 할당이 발전한 것이 FAT 파일 시스템, 색인 할당이 발전한 것이 UNIX 파일 시스템이다. 차근차근 알아보자.
도식과 관련해서는 이 사이트에서 많이 참고하고 또 이해했다.
연속 할당(Contiguous Allocation)
말 그대로 연속적인 블록에 파일을 저장하는 방식이다. 디렉터리 엔트리에는 파일 이름과 첫 번째 블록의 주소(이름) 및 길이 등이 저장된다.
하지만 그림의 3번 블록처럼 중간의 파일이 담긴 블록이 삭제되면 외부 단편화(external fragmentation)가 발생한다는 문제점이 있다. 이를 해결하기 위한 방식이 불연속 할당이다.
연결 할당(Linked Allocation)
불연속 할당 중 가장 기초적인 연결 할당이다. 앞선 분류 도식에서 linked list allocation이라고 적혀있듯, 이 할당 방식은 C언어의 pointer를 통한 연결 리스트 구현과 매우 비슷하다.
디렉터리 엔트리에는 각 파일의 이름과 첫 블록 주소 및 마지막 블록 주소(혹은 길이를 명시)가 적혀있다. 이 경우 9번 블록으로부터 시작해서 25번 블록으로 끝나는 길이 5짜리 형식이다.
각 블록은 파일의 일부 내용과 함께, 블록의 일부 공간에 다음 블록의 주소를 기록해두고 있다. 다음 블록의 주소가 -1로 표기되는 경우는, 파일이 해당 블록에서 저장이 끝난 상황. 즉 포인터를 따라가며 -1(EOF: End of File)이 나올때까지 쭉 읽다보면 파일 전체를 읽어들일 수 있다.
하지만 linked list의 고질적 문제와 같이, 연결 할당 방식도 반드시 첫 번째 블록부터 차례대로 읽어야 해서 시간이 많이 소요된다는 문제, 중간 블록이 망가지면 다음 블록으로 넘어갈 수 없다는 문제가 발생한다.
그냥 코드를 짜는 것과 달리, 이 파일 시스템은 헤드와 플래터라는 실제 보조기억장치와 결부되기 때문에, 헤드와 플래터 사이의 물리적 문제가 파일 시스템의 문제로 연결될 수 있다. 따라서 연결 할당 방식 그 자체는 손상에 취약하다는 단점도 있다.
색인 할당(Indexed Allocation)
색인 할당은 이 연결 할당의 방식을 더 편하고 안전하게 변형한 꼴이다.
각 파일이 저장된 블록들의 주소만을 따로 저장하는 색인 블록(index block)을 두어서, 그 블록 안에 각 블록들의 주소와 EOF를 한데 저장하는 방식이다. 이렇게 되면 디렉터리에는 파일 이름과 색인 블록만 저장함으로써 모든 파일의 위치를 알 수 있게 된다.
색인 할당의 또 다른 장점은 (앞서 말한 연결 할당의 문제점인) 임의 접근(random access)가 매우 쉬워진다는 것이다. i번째 파일 블록을 읽기 위해 색인 블록의 i번째 항목을 읽기만 하면 되기 때문이다. 또한 색인 블록만 멀쩡하면 파일을 온전히 읽는 데에 문제가 없다.
단일 수준 연결 색인 할당(Single level Linked Index Allocation)
이거는 교재에 없다. 그냥 내가 더 찾아보다가 발견했다.
연결 색인 할당(linked index allocation)이 탄생한 이유는, 색인 블록 하나만으로 파일이 다 가리켜지지 않는 경우 때문이다. 파일 크기가 너무 커서 색인 블록이 여러 개가 필요한 경우.
단일 수준의 경우는 각 색인 블록의 마지막 칸에 ‘그 다음 연속된 색인 블록의 주소’를 저장하는 방식이다. 즉 색인 블록을 따라 파일을 쭉 읽다가, 마지막에 저장된 포인터를 따라 그 다음 색인 블록으로 넘어가는 방식
이렇게 되면 파일의 크기는 무제한으로 늘릴 수 있지만, 여전히 linked allocation 방식이기때문에 큰 파일을 접근하는 경우 끝없이 들어가야해서 복잡도가 증가하게 된다.
다중 연결 색인 할당(Multilevel Linked Index Allcation)
번역이 이게 맞나? 딱히 한국어 블로그에서 한글로 쓴 걸 못 찾겠다..
다중의 경우, 바깥 색인 블록(outer-level index block)에는 해당 파일의 실제 주소를 갖고 있는 안쪽 색인 블록(inner-level index block)의 주소만을 빼곡히 담고 있는 방식이다. 즉 색인 블록 저장용 색인 블록을 따로 두는 것
이렇게 되면 앞선 ‘단일 수준 연결 색인 할당’(뭐 이렇게 이름이 길어..)에 비해 더 빠른 속도로 파일에 접근할 수 있게 된다. 이게 조금 더 발전한 방향이 뒤이어 다룰 유닉스 파일 시스템의 i-node이다.
FAT 파일 시스템(FAT File System)
FAT는 파일 할당 테이블(File Allocation Table)을 의미한다. 연결 할당에서 각 블록의 pointer를 빼고, 대신 FAT가 추가된 형태가 FAT 파일 시스템이다.
FAT라는 테이블을 보며 다음 블록 주소를 읽어들이는 동시에, 각 블록(윈도우에서는 ‘클러스터’라 표현)의 내용을 읽어들이는 방식이다. FAT 뒤에는 FAT12, FAT16, FAT32 등의 비트 수가 붙는다.
FAT는 메모리에 캐시해서 더 빠르게 사용할 수도 있다.
유닉스 파일 시스템(UNIX File System)
앞서 본 ‘다중 연결 색인 할당’의 심화 버전이자, 다단계(?)의 끝판왕.
유닉스에서는 색인 블록을 i-node(index-node)라 부르는데, 이 i-node의 16칸 중 13칸에는 실제 데이터를 직접 저장하는 ‘직접 블록(direct block)’을, 14번째 칸에는 또 다른 데이터 16칸의 주소를 갖고 있는 ‘단일 간접 블록(single indirect block)’을 저장한다.
같은 방식으로 15번째 칸에는 단일 간접 블록 16개를 가리키는 ‘이중 간접 블록(double indirect block)’을, 16번째 칸에는 이중 간접 블록 16개를 가리키는 ‘삼중 간접 블록(triple indirect block)’을 저장한다.
물론 각 i-node에 이 모든 블록이 반드시 있는 것은 아니고, 공간이 부족한 만큼 간접 블록들을 채워넣어 최대한 크기를 부풀린다. 최대 16GB의 파일까지 저장할 수 있다고?
이 i-node들은 루트 디렉터리의 i-node를 포함하여 파티션 내의 i-node 영역에 따로 저장된다.
출처: [혼자 공부하는 컴퓨터구조+운영체제 Chapter 15]
이렇게 혼공컴운 책거리!!!!!