파일(File)은 논리적인 저장 단위입니다. 관련된 정보 자료들의 집합에 이름을 붙인 것입니다. 컴퓨터 시스템의 편리한 사용을 위해 정보 저장의 일괄된 논리적 관점을 제공합니다. 일반적으로 레코드(Record) 혹은 블록(Block) 단위로 비휘발성 보조기억장치에 저장됩니다.
파일 속성(File Attribute) 또는 파일의 메타데이터(metadata)는 파일을 관리하기 위한 각종 정보들입니다. 파일 자체의 내용은 아닙니다. 파일 이름, 유형, 저장 위치, 파일 크기, 접근 권한, 소유자, 시간(생성/변경/사용) 등 파일에 대한 전반적인 정보입니다.
파일 시스템(File System)은 운영체제와 모든 데이터, 프로그램의 저장과 접근을 위한 기법을 제공합니다. 시스템 내의 모든 파일에 대한 정보를 제공하는 계층적 디렉터리 구조이고 파일 및 파일의 메타데이터, 디렉터리 정보 등을 관리합니다.
파티션(Partition)은 연속된 저장 공간 하나 이상의 연속되고 독립적인 영역으로 나우어 사용할 수 있도록 정의한 규약입니다. 하나의 물리 디스크 안에 여러 파티션을 두는 게 일반적이지만, 여러 물리 디스크를 하나의 파티션으로 구성하기도 합니다.
순차 접근(Sequential Access)은 가장 단순한 방법으로 파일의 정보가 레코드 순서대로 처리됩니다. 카세트 테이프를 사용하는 방식과 같습니다. 현재 위치에서 읽거나 쓰면 offset이 자동으로 증가하고 뒤로 돌아가기 위해서는 되감기가 필요합니다.
직접 접근(Direct Access)은 임의의 순서로 접근할 수 있습니다. LP 판을 사용하는 방식과 같습니다. 읽기나 쓰기의 순서에 제약이 없으며 현재 위치를 유지할 수 있다면 순차 접근 기능도 구현할 수 있습니다.
색인 접근(Index Access)은 파일에서 레코드를 찾기 위해 색인을 먼저 찾고 대응되는 포인터를 얻습니다. 이를 통해 파일에 직접 접근하여 원하는 데이터를 얻을 수 있습니다. 따라서 크기가 큰 파일에 유용합니다.
디렉터리(Directory)는 파일의 메타데이터 중 일부를 보관하고 있는 일종의 특별한 파일입니다. 해당 디렉터리에 속한 파일 이름과 속성을 포함하고 있고 다음과 같은 기능을 제공합니다.
기본적으로 디렉터리의 파일을 빠르게 탐색할 수 있어야 합니다. 적절한 이름으로 사용자들이 편리하게 사용할 수 있으면 좋을 것입니다. 파일들을 적절한 분류로 그룹화해두면 사용하기 편리할 것입니다.
이를 위해 디렉터리의 논리적 구조를 정의하는 여러 방법이 있습니다.
1단계 디렉터리는 모든 파일들이 디렉터리 밑에 존재하는 형태입니다. 파일은 유일한 이름을 가지고 서로 다른 사용자라도 같은 이름을 사용할 수 없습니다.
지원하기도 쉽고 이해하기도 쉽지만, 파일이 많아지거나 다수의 사용자가 사용하는 시스템에는 적합하지 않습니다.
2단계 디렉터리는 각 사용자별로 별도의 디렉터리를 가지는 형태입니다.
서로 다른 사용자가 같은 이름의 파일을 가질 수 있고 효율적인 탐색이 가능합니다. 하지만 그룹화가 불가능하고 다른 사용자의 파일에 접근해야 하는 경우에는 적합하지 않습니다.
사용자들이 자신의 서브 디렉터리를 만들어서 파일을 구성할 수 있습니다. 하나의 루트 디렉터리를 가지며 모든 파일은 고유한 경로(절대 경로/상대 경로)를 가집니다. 효율적인 탐색이 가능하고 그룹화가 가능합니다.
디렉터리는 일종의 파일이므로 일반 파일인지 디렉터리인지 구분할 필요가 있습니다. bit를 사용하여 bit가 0이면 일반 파일, 1이면 디렉터리로 구분합니다.
디렉터리들이 서브 디렉터리와 파일을 공유할 수 있도록 합니다. 트리 구조 디렉터리를 일반화한 형태입니다.
단순한 트리 구조보다 복잡한 구조이기 때문에 몇 가지 문제가 발생할 수 있습니다. 파일을 무작정 삭제하게 되면 현재 파일을 가리키는 포인터는 대상이 사라지게 됩니다. 따라서 참조되는 파일에 참조 계수를 두어 참조 계수가 0이 되면 파일을 참조하는 링크가 없다는 의미이미로 그 때 파일을 삭제할 수 있도록 합니다.
순환을 허용하는 그래프 구조입니다. 순환이 허용되면 무한 루프에 빠질 수 있습니다. 따라서, 하위 디렉터리가 아닌 파일에 대한 링크만 허용하거나 가비지 콜렉션을 통해 전체 파일 시스템을 순회하고 접근 가능한 모든 것을 표시합니다.
연속 할당(Contiguous Allocation)은 파일을 디스크에 연속되게 저장하는 방식입니다. 디렉터리에는 파일이 시작 부분의 위치와 파일의 길이에 대한 정보를 저장하면 전체를 탐색할 수 있습니다.
연속적으로 저장되어 있으므로 한 번의 탐색으로 많은 양을 전송할 수 있습니다. 그리고 Random Access가 가능합니다. 하지만 외부 단편화가 발생하며 파일의 크기를 키우기가 어렵습니다. 파일의 크기가 커질 가능성을 고려해서 미리 큰 공간을 할당하면 내부 단편화가 발생할 수 있습니다.
연결 할당(Linked Allocation) 연속적으로 할당하지 않고 비어있으면 자유롭게 할당할 수 있습니다. 다음 읽어야 할 위치를 연결 리스트처럼 포인터로 가리킵니다. 따라서 디렉터리에는 파일이 시작하는 위치와 끝나는 위치만 저장합니다.
색인 할당(Indexed Allocation)은 한 블록에 하나의 파일에 대한 데이터의 index들을 모두 저장하는 방식입니다. 디렉터리에는 해당 블록의 위치만 담게 됩니다.
외부 단편화가 발생하지 않고 Random Access가 가능합니다. 하지만 파일이 작은 경우 위치를 저장하는 블록의 공간 낭비가 생기고 파일이 너무 큰 경우 하나의 블록으로 파일의 index들을 모두 저장하기에 부족하다는 단점이 있습니다.