[CS] 파일 시스템 & 블록 그룹

최민길(Gale)·2023년 8월 3일
1

CS 탐구

목록 보기
5/13

안녕하세요 오늘은 파일 시스템과 블록 그룹에 대해서 포스팅해보도록 하겠습니다.

먼저 파일 시스템이란 디스크에 사용자의 데이터를 효율적으로 저장하기 위한 파일과 디렉터리를 조직화한 체계입니다. 쉽게 말해 보조기억장치에 파일과 폴더를 구성하는 방법을 결정하는 시스템이라고 볼 수 있습니다. 사용자의 데이터는 파일 단위로 관리되며, 디스크에 저장할 때는 레코드 단위 혹은 블록 단위로 저장됩니다. 이 때 각 파일은 디렉터리에 속하여 그룹을 형성하기 때문에 많은 파일을 체계적으로 관리할 수 있습니다. 또한 파일 입출력 시 발생하는 오류 복구 기능, 디스크 입출력 속도 향상을 위한 캐시 기능 등을 제공합니다.

이렇게 파일 시스템은 여러 개의 작은 블록 단위로 분할하여 디스크에 저장하게 되는데, 파일 시스템의 크기가 커지면 블록 수도 늘어나기 때문에 블록을 모두 한 그룹으로 관리하는 것은 비효율적입니다. 따라서 파일 시스템으로 분할한 블록들을 그룹으로 묶어 관리하는 것이 블록 그룹입니다. 블록 그룹으로 나뉘어진 각 그룹들은 일정 개수의 블록을 포함하며 한 파일이 여러 블록에 나누어서 저장되어야 하는 경우 단편화를 최소화, 즉 기억 장치의 빈 공간 발생을 최소화하기 위해 같은 블록 그룹에 위치시킵니다.

블록 그룹은 크게 슈퍼 블록, 그룹 디스크립터 테이블, 블록 비트맵, 아이노드, 아이노드 비트맵, 아이노드 테이블 등으로 이루어져 있습니다.

슈퍼 블록은 각 블록 그룹이 속한 파일 시스템의 전체 내용을 담고 있는 블록입니다. 블록 내에 여유 공간이 있더라도 1KB만을 사용하며, 블록의 크기, 총 블록의 개수, 블록 그룹 개수, 아이노드의 개수 등의 정보를 저장합니다.

그룹 디스크립터 테이블은 각 블록 그룹에 대한 정보를 저장하는 블록입니다. ext 파일 시스템에서 주로 사용되며 블록 비트맵, 아이노드 비트맵, 아이노드 테이블, 그룹의 크기와 위치 정보 등을 저장합니다.

블록 비트맵은 블록의 할당 여부를 비트로 표현합니다. 사용중이라면 1을, 아니라면 0을 할당받습니다.

아이노드는 실제 파일과 디렉터리의 데이터 위치를 알고 있는 자료구조입니다. 파일의 데이터는 실제로 데이터 블록에 저장되며 아이노드는 파일의 메타데이터 정보, 즉 파일의 크기, 파일의 소유자 등의 정보를 저장합니다. 모든 파일은 해당 파일의 아이노드 포인터를 가지고 있어 파일 시스템은 파일의 메타데이터 정보를 빠르게 읽을 수 있습니다. 마찬가지로 아이노드에는 데이터 블록 포인터, 즉 파일의 데이터가 저장된 데이터 블록의 위치를 가리키는 포인터를 가지고 있어 아이노드의 주소를 알고 있다면 해당 아이노드가 가리키는 블록 그룹을 찾아갈 수 있습니다.

아이노드 비트맵은 블록 비트맵과 마찬가지로 아이노드 할당 여부를 비트로 표현합니다.

아이노드 테이블은 파일 시스템에서 모든 파일과 디렉토리의 아이노드들을 저장하는 데이터 구조입니다. 즉 파일 시스템은 아이노드 테이블을 통해 모든 파일의 메타데이터 정보를 관리하고 파일의 데이터는 데이터 블록에 저장되는 방식으로 운영됩니다.

그럼 리눅스의 파일 시스템에 대해 간단히 알아보겠습니다. 리눅스는 ext 방식으로 현재까지 ext4 까지 확장되었습니다. ext 파일 시스템은(ext2) 부트 섹터, 즉 디스크의 첫 번째 섹터(0번 섹터)와 뒤따르는 여러 개의 블록 그룹들로 구성되며 블록 그룹은 마지막 블록 그룹을 제외하고 모두 같은 블록 개수를 가집니다. 각 블록 그룹 내에는 15개의 포인터가 존재하며 처음부터 12번까지는 직접 블록, 13번부터는 차례대로 간접 블록, 이중 간접 블록, 삼중 간접 블록을 위한 포인터입니다.

직접 블록과 간접 블록은 각각 직접 블록 매핑 방식과 간접 블록 매핑 방식에서 사용됩니다.

직접 블록 매핑 방식이란 각 파일의 데이터 블록을 직접적으로 관리하는 방식입니다. 파일 시스템이 파일의 데이터 블록을 순차적으로 연결하여 직접적으로 해당 블록의 위치를 알아내는 방식입니다. 하지만 직접 블록 매핑 방식의 경우 파일의 크기가 커질수록 블록 번호가 증가하여 메타데이터의 크기가 커지고, 이로 인해 파일 시스템의 성능에 영향을 미칠 수 있습니다.

간접 블록 매핑 방식이란 파일 시스템에서 파일의 데이터를 저장할 때 간접적으로 여러 블록을 참조하는 방법입니다. 파일의 데이터 블록들을 일련의 간접 블록을 통해 간접적으로 찾습니다. 이 방식에서는 간접 블록들이 추가적으로 필요하며, 간접 블록들은 데이터 블록 자체가 아닌 데이터 블록의 주소를 가리킵니다. 이로 인해 파일의 크기가 커져도 추가적인 간접 블록만 할당하면 되기 때문에 메타데이터의 크기를 줄일 수 있습니다. 여기서 사용되는 간접 블록이 2개일 경우 이중 간접 블록 매핑, 3개일 경우 삼중 간접 블록 매핑이 됩니다. 하지만 하나의 블록을 가리키기 위해선 하나의 엔트리, 즉 하나의 블록을 가리키는 포인터가 필요하기 때문에 포인터 할당에 따른 오버헤드가 발생할 수 있습니다.

이를 개선한 것이 Extents 방식입니다. Extents 방식이란 파일의 연속적인 데이터 블록들을 하나의 extent로 묶어 저장하는 방법입니다. 물리적으로 연속된 블록들의 묶음을 사용하여 하나의 엔트리로 여러 블록을 가리키게 되어 엔트리를 그룹하함으로서 메타데이터를 줄여 오버헤드가 감소됩니다. 하지만 일부 블록이 지워질 경우 빈 공간이 발생할 수 있어 이를 해결하기 위한 블록 단편화 관리를 해야 합니다.

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글