이번 포스팅은, 실제 파일 시스템에서 어떤 할당 방법을 어떻게 사용하는지에 대해 알아보겠습니다.
1. UNIX 파일 시스템 구조
UNIX는 역사가 오래된 OS 입니다. 아래의 그림은 가장 기본적인 파일 시스템 구조입니다. UNIX나 Linux의 파일 시스템이 기본적인 파일 시스템에서 발전해 FAT, Ext 등이 생겨났습니다. 그림은 하나의 논리적 디스크(파티션)에 파일 시스템을 설치해놓은 모습입니다. 유닉스의 파일 시스템은 저장되는 구조가 크게 네 가지로 Boot, Super, Inode, Data block 순서대로 저장됩니다.
Boot Block
우선 Boot Block을 살펴보겠습니다. UNIX 뿐 아니라, 어떤 파일 시스템이건 Boot Block이 가장 맨 처음에 있습니다. 컴퓨터를 부팅하면 어떤 파일 시스템이 저장되어 있는지 모르는 상태로 시작되기 때문입니다. 그래서 부팅에 필요한 기본 정보인 bootstrap loader를 실행해야합니다. 그 위치를 0번 블록에 저장해서, 어떤 시스템을 실행해도 bootstrap loader의 위치를 찾지 않고 0번 블록을 먼저 실행합니다. 이후 파일 시스템에서 운영체제 커널의 위치를 찾아 메모리에 올리고 정상적인 부팅이 이루어지도록 합니다.
Super block
Super block은 파일 시스템에 관한 총제척인 정보를 담고 있습니다. 어떤 블록이 빈 블록인지, 어떤 블록이 사용중인지, 어떤 블록에 실제 파일이 저장되어 사용 중인지, inode list와 Data block이 어디까지인지를 총체적으로 관리합니다.
Inode list
Inode list는 메타 데이터를 보관하는 곳입니다. 이전 포스팅에서 파일의 메타데이터는 그 파일을 갖고 있는 Directory에 가면 저장되어 있다고 했습니다. 그런데 실제 파일 시스템에서는 Directory가 메타데이터를 다 갖고 있지는 않습니다. 특히 유닉스 파일 시스템에서는 Directory는 아주 일부분만 가지고 있습니다. 실제 파일의 메타데이터는 Inode list에서 보관하고 있습니다.
Inode(Index node)는 파일 하나당 하나씩 할당이 되어 있습니다. 위 그림에서 빨간색 박스 하나가 파일입니다. 그리고 그 Inode는 그 파일의 메타 데이터를 가지고 있는 구조입니다. 메타데이터는 파일의 소유주, 접근 권한, 최종 수정 시간, 위치 정보등을 갖고 있습니다. UNIX 파일 시스템에서는 파일 이름을 제외한 파일의 모든 메타 데이터를 Inode에 저장합니다. 파일 이름은 Directory가 가지고 있습니다.
Directory
Directory에는 그 Directory 밑에 있는 파일의 메타 데이터들이 저장되어있다고 말씀드렸는데, 메타 데이터에서 파일의 이름은 Directory가 직접 가지고 있고 나머지 메타 데이터들은 inode에 저장되어 있습니다. Directory는 이름(메타 데이터)들과 inode 번호를 갖고 있습니다.
그래서 만약 Directory 밑에 있는 파일의 아이노드 번호가 10번이라고 할 때, 아이노드 리스트의 10번에 가면 해당 메타데이터가 저장이 되어 있는 것입니다.
Inode를 통해 파일의 메타 데이터를 저장하는 것이 UNIX 운영체제의 핵심적인 부분 중 하나입니다.
그럼 파일의 위치 정보를 어떻게 저장하고 있을까요?
우선, UNIX 운영 체제에서는 Indexed Allocation을 조금 변형해서 사용하고 있습니다. 그리고 각 파일당 Inode는 미리 할당된 크기로 고정되어있습니다. 그래서 위치 정보를 표현하기 위한 포인터 갯수도 유한합니다.
그렇기 때문에, 가능한 작은 아이노드를 가지고 용량이 큰 파일도 표현할 수 있어야합니다.
유닉스는 Direct Index, Single, Double, Triple Indirect 네 가지로 파일의 위치 정보를 구성합니다.
파일의 크기가 작으면 Direct Index 포인터로만 그 파일의 위치를 표현할 수 있지만, 굉장히 큰 파일의 경우 Indirect blocks를 이용해야합니다. 그림에서 보이듯 각각의 block의 이름에 맞게 단계별 인덱스 구조가 다른 것을 볼 수 있습니다.
2. FAT File System
FAT(File Allocation Table) 파일 시스템은 주로 Windows 운영 체제나 모바일 환경에서 사용됩니다.
이 시스템은 Boot Block, FAT, Root Directory, 그리고 Data Block으로 구성되어 있습니다.
- Boot Block: 파일 시스템이 시작될 때 필요한 정보를 포함하고 있는 영역. 주로 부트로더와 같은 초기화 코드가 포함.
- FAT: 파일이 저장된 블록들의 할당 정보를 담고 있는 테이블. 각 파일에 할당된 데이터 블록의 순서와 위치를 추적.
- Root Directory: 디스크의 최상위 디렉터리를 나타내는 디렉터리. 디렉터리와 파일의 메타데이터(이름, 크기, 권한 등)를 저장.
- Data Block: 실제 파일 데이터가 저장되는 영역.
파일의 위치 정보는 FAT에 저장되고, 파일의 이름, 접근 권한, 크기, 소유주 등의 나머지 메타데이터는 Directory File에 저장됩니다. 그래서 FAT 파일 시스템에서 Directory는 파일 관리의 핵심이 됩니다. 심지어 파일의 첫 번째 위치부터 끝까지의 정보도 전부 Directory가 갖고 있습니다.
FAT 배열은 데이터 블록의 위치 정보를 포함하고 있습니다. 이 배열의 크기는 디스크에 관리되는 데이터 블록의 개수와 같습니다. 예를 들어, 첫 번째 블록의 위치가 217번지에 있다면, FAT에서 217번 Entry에는 다음 블록의 위치 정보가 기록되어 있습니다. 이를 통해 파일의 연속적인 데이터 블록을 찾아가는 것이 가능합니다.
파일의 끝을 나타내는 EOF(End of File)는 Linked Allocation을 활용하여 나타내며, FAT를 통해 직접 접근할 수 있습니다.
FAT 파일 시스템은 Linked Allocation 방식을 사용하고 있어 Bad Sector가 발생해도 FAT과 데이터 블록이 분리되어 있어 문제가 발생하지 않습니다.
또한, FAT은 매우 중요한 정보이기 때문에, 보통 두 개 이상의 복사본을 저장하여 안정성을 높였고, Linked Allocation을 변형하여 단점을 극복하였습니다.
3. Free-space Management(디스크 공간 관리)
파일 시스템에서는 디스크 공간을 효율적으로 관리하는 여러 방법이 있습니다. 파일을 저장하고 삭제하는 과정에서 비어있는 블록을 효율적으로 관리하기 위해 주로 사용되는 Free-space Management 방법들을 살펴보겠습니다.
(1) Bit map
Bit Map 방식은 유닉스와 같은 운영 체제에서 사용됩니다.
여기서는 Super block에 비어있는 블록의 상태를 나타내는 Bit 배열을 저장합니다. 각 비트는 해당 블록이 사용 중인지 여부를 0과 1로 나타냅니다. 파일을 생성하거나 삭제할 때마다 해당 비트를 설정 또는 해제하여 블록의 사용 상태를 업데이트합니다. 블록 하나 당 1 bit로 디스크에 많은 공간을 차지하지는 않지만, 부가적인 공간이 필요합니다.
이 방식은 디스크 헤드를 최대한 적게 이동하여 많은 양을 읽어오는 것이 시간적으로 효과적이기 때문에, 파일은 가능한 연속 할당을 해주는 것이 좋습니다. 그래서 Bit Map 방식은 연속적인 빈 블록을 찾는데 효과적입니다.
+ (디스크 헤드를 최대한 적게 이동하여 많은 양을 읽어오는 것이 시간적으로 효과적인 이유는 디스크의 물리적 특성 때문입니다. 디스크는 회전하는 원판 위에 여러 개의 헤드가 있고, 이러한 헤드가 디스크의 표면을 이동하며 데이터를 읽고 쓰게 됩니다. 디스크 헤드의 이동은 오버헤드가 큰 작업이기 때문에, 가능한 한 이동을 최소화해야합니다.)
(2) Linked List
Linked List 방식은 비어있는 블록들을 연결하여 관리합니다. 각 빈 블록은 다음 빈 블록의 위치를 가리키는 포인터를 가지고 있습니다. 따라서 연속적인 빈 공간을 찾기 위해서는 포인터를 따라가야 합니다. 이 방식은 추가적인 공간을 필요로하지 않지만, 연속적인 빈 공간을 찾기 위해서는 디스크 헤드로 일일히 찾아야 하기 때문에 시간이 많이 소요될 수 있습니다.
(3) Grouping
Grouping 방식은 빈 블록들을 그룹으로 관리합니다. 처음 비어있는 위치가 인덱스 역할을 하며, 이후에는 비어있는 블록들의 포인터들이 연속적으로 저장됩니다. 하지만 연속적인 빈 공간을 찾는 데에는 효과적이지 않을 수 있습니다.
(4) Counting
Counting 방식은 연속적인 빈 블록들을 표시하는 방식입니다. 첫 번째 빈 블록과 연속적으로 비어있는 블록의 개수를 쌍으로 관리합니다. 이 방식은 연속적인 빈 공간을 효과적으로 찾을 수 있습니다.
참고자료
[KOCW 이화여대 반효경 교수님 - File Systems Implementation 1]
https://core.ewha.ac.kr/publicview/C0101020140520134614002164?vmode=f
[ Operating System Concepts - Abraham Silberschatz ]
https://www.yes24.com/Product/Goods/89496122
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 10. 파일 시스템 : VFS와 NFS (File System Implementations 1) (0) | 2024.02.01 |
---|---|
[운영체제] 10. 파일시스템 : 디렉터리 구현 방법과 메타 데이터 보관 위치 (File System Implementations 1) (0) | 2024.02.01 |
[운영체제] 10. 파일 시스템 : 파일을 디스크에 할당하는 여러가지 방법 (File Systems Implementation 1) (0) | 2024.01.28 |
[운영체제] 10. 파일 시스템 : File System (File Systems) (0) | 2024.01.26 |
[운영체제] 9. 가상 메모리 : Working Set, PFF 알고리즘 (Virtual Memory 2) (0) | 2024.01.25 |