File
개요
파일(File)은 논리적인 저장 단위
로 관련된 정보 자료들의 집합에 이름을 붙인 것이다. 이는 레코드(record) 혹은 블록(block) 단위로 비휘발성 보조기억장치(예컨대 HDD나 SSD 등과 같은)에 저장된다.
여기서 레코드와 블록은 물리적인 단위를 말하는 것으로, 특히 물리적 레코드(혹은 저장 레코드, stored record) 파일 시스템에서 파일을 구성하는 논리적 레코드(logical record)와는 개념적으로 서로 다르다.
여기서 잠시 자료의 구성 단위를 크기별로 간단히 살펴보면 다음과 같이 정리할 수 있다.
비트(Bit) → 니블(Nibble) → 바이트(Byte) → 워드(Word) → 필드(Field) → 레코드((Logical) record) → 파일(File)
- 비트(Bit) : 자료 표현의 최소 단위로서 0 또는 1로 구성
- 니블(Nibble) : 4개의 비트가 모인 것(4bit)
- 바이트(Byte) : 문자 표현의 최소 단위로서 8개의 비트가 모인 것(8bit)
- 워드(Word) : 컴퓨터가 한 번에 처리할 수 있는 명령 단위이며, OS에 따라 크기가 다름
- 필드(Field) : 파일의 최소 구성 단위로서 특정한 의미를 지닌 하나 이상의 바이트
레코드(Record) : 하나 이상의 필드가 모여 구성된 것
파일(File) : 하나 이상의 레코드가 모여 구성된 것
File attribute
파일의 속성(File attribute) 혹은 파일의 메타데이터(metadata)는 파일을 관리하기 위한 각종 정보들을 말한다(파일 자체의 내용이 아니다). 여기에는 파일의 이름과 유형, 저장된 위치, 파일의 크기, 접근 권한, 파일의 소유자, 시간(생성/변경/사용) 등 파일의 전반적인 정보가 포함된다.
Directory
개요
디렉토리는 파일 시스템 내부에 존재하는 것으로, 효율적인 파일의 사용을 위해 디스크 내에 존재하는 파일에 대한 여러 정보를 가지고 있는 특수한 형태의 파일
이다. 디렉토리는 하위 파일들의 메타데이터 중 일부(이름, 위치, 크기, 할당 방식, 형태, 소유자, 계정 정보 등)를 보유한다.
디렉토리의 기능
디렉토리는 다음과 같은 기능을 제공한다.
- Efficiency : 파일을 빠르게 찾을 수 있도록 한다.
- Naming : 파일의 이름을 정할 때 제약조건이 없도록 한다.
- Grouping : 유사한 성격의 파일을 그룹핑할 수 있도록 한다.
디렉토리의 유형
-
Single-Lvevel Directory
- 모든 파일을 하나의 디렉토리 내에 위치하도록 관리하는 구조
- 모든 파일이 고유한(unique) 이름을 가져야 함
- 모든 파일이 동일한 디렉토리 내에서 관리되므로 사용자가 파일에 대해 쉽게 이해할 수 있다.
- 파일이나 사용자의 수가 증가하면 파일의 관리가 복잡해진다.
→ Naming 및 Grouping 관련 문제 발생
-
Two-Level Directory
- 중앙에 Master File Directory(MFD)가 존재하고, 그 아래에 각 사용자별로 서로 다른 User File Directory(UFD)가 존재하는 구조
- MFD
- 각 사용자별 이름과 계정 번호, UFD를 가리키는 포인터 등을 보유
- UFD를 관리하기 위한 디렉토리
- UFD
- 오직 하나의 사용자가 가지고 있는 파일에 대한 정보만을 보유(해당 사용자의 파일을 관리)
- 하나의 UFD에서는 고유한 파일 이름을 사용해야 하나, 서로 다른 UFD 간에는 동일한 이름의 파일이 존재 가능함
- 이 방식은 서로 사용자가 다른 사용자의 UFD를 검색할 수 없으므로 파일 공유가 어려움
- 특정 파일 저장 시 "사용자명+파일명"의 형태로 지정해야 하므로 파일의 이름이 길어짐
-
Tree-Structured directory
- 하나의 Rood Directory 아래에 여러 개의 Sub Directory로 구성된 구조
- DOS, Window, UNIX 등 현대의 OS에서 많이 사용되는 구조
- 각 디렉토리는 서브 디렉토리나 파일을 가질 수 있음
- 서로 다른 디렉토리 내에서는 동일한 이름의 파일 혹은 디렉토리의 생성이 가능
- 디렉토리의 생성과 이동이 편리함
- 디렉토리의 탐색에는 포인터(Pointer)를 사용하고, 경로명은 절대경로(Absolute)와 상대경로(Relative)를 사용
- 절대경로 : 루트 디렉토리로부터의 경로
- 상대경로 : 현재 위치한 디렉토리로부터의 경로
-
Acyclic-Graph Directory
- 하위 파일이나 디렉토리를 공동으로 사용할 수 있으며, cycle이 허용되지 않는 구조
- 디스크 공간의 절약이 가능한 구조
- 하나의 파일이나 디렉토리가 여러 개의 경로를 가질 수 있어 디렉토리가 복잡함
- 공유된 하나의 파일 탐색 시 서로 다른 경로로 여러 번 찾아갈 수 있어 시스템 성능 저하 가능
- 공유된 파일 삭제 시 Dangling pointer 문제 발생 가능
Dangling pointer : 해제되어 데이터가 존재하지 않는 메모리 영역을 가리키는 포인터로 메모리 접근 시 예측 불가능한 동작이 일어나거나 잠재적인 보안 위험을 발생시키는 등의 문제가 있을 수 있다.
- General Graph Directory
- 트리 구조에 Link를 추가하여 cycle을 허용하는 구조
- 디렉토리와 파일 공유에 완전한 융통성
- 탐색 알고리즘이 간단하여 파일 및 디렉토리에 대한 access가 쉬움
- 사용되지 않는 디스크 공간을 되찾기 위한 Garbage collector가 필요
- 불필요한 파일을 제거해 사용 공간을 늘리기 위한 Reference counter가 필요
File system
개요
파일 시스템(File system)이란 이러한 파일의 이름을 정하고 저장 혹은 검색하기 위해 논리적으로 파일을 어디에 위치시켜야 하는지에 대한 방법을 구성한 시스템을 말한다. 시스템 내의 모든 파일에 대한 정보를 제공하는 계층적 디렉토리 구조를 이루고 있으며, 파일과 파일의 메타데이터, 디렉토리 정보 등을 관리한다.
파일 시스템의 목적
- 하드디스크와 메모리의 속도 차 감소
- 파일의 효율적인 관리
- 하드디스크 용량의 효율적인 이용
파일 시스템의 기능 및 역할
- 사용자가 파일을 생성, 삭제, 수정 가능
- 여러 사용자 간 파일 공유 가능
- 주기억장치와 보조기억장치 간 파일 전송
- 파일에 대한 백업 및 복구 가능
- 각 응용프로그램에 적합한 구조로 파일 구성
- 파일에 대한 접근 방법 제공
파일 시스템의 구조
- Logical File System
- 메타데이터 정보를 관리
- 디렉토리 구조를 관리하며 FCB를 보유
- File-Organization Module : 논리 주소를 물리 주소로 변경
- Basic File System : 장치 드라이버에 물리 블록을 읽고 쓰도록 명령
- I/O Control
- device driver와 interrupt handler로 구성
- 고수준 언어의 명령을 device에 맞는 저수준 언어로 변경
Access methods
파일 시스템이 제공하는 파일 정보에 대한 접근 방식은 주로 순차 접근, 직접 접근, 색인 접근의 세 가지로 구분된다.
순차 접근(Sequestial access)
- 파일의 정보가 레코드 순서대로 처리됨
- 현재 위치에서 읽거나 쓸 경우 offset이 자동으로 증가하고, 뒤로 돌아가기 위해서는 되감기가 필요함
- 가장 일반적인 방식으로 편집기 혹은 컴파일러가 사용하는 방식
- 파일 연산의 대부분이 읽기와 쓰기 연산
- 읽기 연산 : 파일의 다음 부분부터 읽어 나가며 자동적으로 입출력 위치를 추적하는 파일 포인터를 증가시킴
- 쓰기 연산 : 파일의 끝 부분에 내용을 추가하며 새로운 파일의 끝으로 파일을 이동시킴. 오프셋을 시작점 혹은 종점으로 이동시킬 수 있으며 정수 n만큼 건너뛰는 것도 가능
여기서 오프셋(Offset)이란 새로운 주소를 만들기 위해 기존의 주소에 더해지는 값을 의미한다. 예를 들어 현재 주소가 100이고 새로운 주소가 109라면 9가 오프셋이 된다. 오프셋을 이용해 주소를 나타내는 것을 상대 주소 지정 방식이라고 한다.
직접 접근(Direct access/Random access)
- 파일의 레코드에 대해 임의의 순서로 접근 가능(디스크 모델에 기반을 두며, 이는 무작위 파일 블록에 대한 임의 접근을 허용하기 때문)
- 파일을 번호를 가지고 있는 블록 또는 레코드로 간주하는 방식
- 대규모 정보에 대해 즉각적인 접근을 할 때 유리하여 DB에 주로 이용됨
색인 접근(Index access)
- 파일에서 레코드를 찾기 위해 색인을 먼저 찾은 뒤 그에 대응되는 포인터를 얻어 그 포인터를 이용해 파일에 접근하는 방식
- 크기가 큰 파일에 대한 입출력 탐색에 유용함
디스크 파일 할당(Allocation of file data in disk)
파일 데이터를 디스크에 할당하는 방법은 크게 세 가지로 구분할 수 있다.
연속 할당(Contiguous allocation)
- 말 그대로 파일을 디스크에 연속되게 저장하는 방식
- 디렉토리에는 파일의 시작 부분 위치와 파일의 길이에 대한 정보를 저장하여 전체 탐색이 가능하도록 함
- 연속적으로 저장되어 있으므로 한 번의 탐색으로 많은 양을 전송할 수 있으며, 직접 접근(Random access)이 가능
- 외부 단편화가 발생하며, 파일의 크기를 키우는 것이 어려움
- 파일이 커질 가능성을 고려해 미리 큰 공간을 할당할 경우 내부 단편화 발생이 가능
Linked allocation
- 파일을 연속적으로 할당하지 않고 빈 위치에 자유롭게 할당하는 방식
- 다음으로 읽어야 할 위치를 연결 리스트와 같이 포인터로 지정하며, 따라서 디렉토리에는 파일의 시작 위치와 종료 위치만 저장됨
- 외부 단편화가 발생하지 않음
- 직접 접근이 불가능하며, 포인터를 위한 공간이 블록의 일부로 할당되므로 공간 효율성이 저하됨
- 상기 단점의 보완을 위해 FAT(File-Allocation Table)이라는 파일 시스템을 사용하여 포린터를 별도의 위치에 보관(신뢰성 및 공간 효율성 문제 해결)
Indexed allocation
- 한 블록에 하나의 파일에 대한 데이터의 index들을 모두 저장하는 방식
- 디렉토리에는 해당 블록의 위치만 저장됨
- 외부 단편화가 발생하지 않으며 직접 접근이 가능
- 파일의 크기가 작을 경우 위치 저장에 사용된느 블록의 공간 낭비가 심하며, 파일이 너무 클 경우 하나의 블록으로 파일의 index를 모두 저장하기 어려움
참고 자료