파일 시스템(File System)은 저장매체(보조기억장치: HDD 등)의 데이터를 효율적으로 관리하기 위해 만들어진 운영체제 관시 시스템의 한 종류이다.
블록(Block)은 운영체제가 저장장치의 데이터에 접근하기 위한 가장 작은 단위이다. 블록의 크기는 사용자의 선택에 따라 달리 지정할 수 있다.
운영체제는 하드디스크의 데이터에 접근할 때 블록(Block) 단위로 접근하지만, 하드디스크의 최소 저장 단위는 섹터(sector)이다. 그렇다면 왜 운영체제는 섹터 단위로 접근하지 않을까???
하드디스크에는 수많은 섹터가 존재한다. 이 많은 섹터를 운영체제가 접근하기에는 큰 부담이 있기 때문에 섹터를 하나의 블록으로 묶어 사용한다.
블록의 크기를 작게 할 경우
블록의 크기를 크게 할 경우
파일 테이블(File Table)은 다른 말로 "블록 테이블"이라고도 한다. 파일의 항목들과 각 파일이 기록된 하드디스크 내 블록의 위치정보를 저장/관리하고 있다.
디스크(Disk)는 비어있는 블록들의 집합으로 "pool of free blocks" 이라고 부른다.
그렇다면 운영체제는 데이터를 효율적으로 관리하기 위해서 어떻게 디스크를 할당해야 할까??
연속 할당 (Contiguous Allocation)은 각 파일에 대해 디스크 상의 연속될 블록을 할당하는 방식이다. 즉, 순서대로 블록에 파일을 할당하는 방식이다. 또한 연속 할당은 파일을 순차적으로 읽을 수 있고, 특정 부분을 바로 읽을 수도 있다.
연속 할당의 장점으로는 디스크 헤더의 이동이 최소화되기 때문에 빠른 i/o 성능이다.
단점으로는 단편화 문제가 발생한다는 점이 있다. 파일을 할당하고 삭제하는 과정에서 생겨나는 빈 공간 때문에 디스크의 공간 낭비가 심해진다.
또 다른 단점으로는 파일을 생성할 때 파일의 크기를 알 수 없다는 점이다. 파일의 기능이 추가되어 파일의 크기가 커질 수 있기 때문에 연속적인 할당이 불가능해 질수 있다.
연결 할당 (Linked Allocation)은 연속 할당의 단점을 해결하기 위해 나온 방법이다. 연속적으로 할당하는 방식이 아니라 연결 리스트(linked list)와 비슷한 방식으로 파일을 할당한다.
비어있는 임의의 블록을 첫 블록으로 선택하여 할당받고, 파일이 커지면 다른 블록을 할당 받아 연결하는 방식을 가지고 있다. 각각의 블록의 마지막에는 주소를 저장해야 하는 포인터 공간(4 bytes)이 존재한다. 이러한 특징 때문에 연결 할당은 외부 단편화가 없다는 장점을 가지고 있다.
단점으로는
1. 순서대로 읽는 것이 불가능하다.
2. 포인터 저장을 위해 4 bytes 이상을 손실해야 한다.
3. 중간 블록 포인터가 끊어지면 그 이후의 모든 블록은 접근이 불가능하다.
4. 블록들이 서로 근접해 있으면 빠르지만, 흩어져 있으면 디스크 헤더의 움직임이 많이 발생함으로 속도가 느려진다.
색인 할당 (Indexed Allocation)은 비어있는 임의의 블록을 첫 블록으로 선택하여 할당받고, 할당받은 블록 번호를 하나의 블록(포인터 모음)에 따로 저장한다. 번호가 저장된 블록을 인덱스 블록이라 부르며, 파일당 1개의 인덱스 블록을 가지고 있다.
색인 할당의 장점은 직접 접근이 가능하다는 점과 외부 단편화가 없다는 장점을 가지고 있다.
단점으로는 작은 크기의 파일을 할당할 때도 1개의 인덱스 블록을 가져야 하므로 공간 손실의 단점을 가지고 있다. 또한 인덱스 블록의 크기는 한정적이기 때문에 크기가 큰 파일을 저장할 수 없다는 단점을 가지고 있다. 이 문제를 해결하는 방법으로는 Linked, Multilevel index, Combined 등이 있다.