1. 생각하는 방법
파일 시스템에 대해 학습할 때, 두 가지 측면에서 접근할 것을 권장한다.
첫 번째는 파일 시스템의 자료 구조
이다.
즉, 파일 시스템이 자신의 데이터와 메타데이터를 관리하기 위해 디스크 상에 어떤 종류의 자료 구조가 있어야 하겠는가?
두 번째는 접근 방법(access method)
이다.
프로세스가 호출하는 open(), read(), write() 등의 명령들은 파일 시스템의 자료 구조와 어떤 관련이 있는가?
2. 전체 구성
이제 vsfs파일 시스템의 자료 구조에 대해 디스크 상의 전체적인 구조를 개발해 보자.
가장 먼저 해야 할 것은 디스크를 블록(block)
들로 나누는 것이다.
일반적으로 사용되는 크기는 4KB
이다.
파일 시스템을 생성하기 위해서 이들 블럭에 어떤 것을 저장할지 생각해 보자.
가장 먼저 떠오르는 것은 사용자 데이터
이다.
사실, 파일 시스템의 대부분의 공간은 사용자 데이터로 이루어져 있다.
사용자 데이터가 있는 디스크 공간을 데이터 영역(data region)
이라고 한다.
파일 시스템은 메타데이터(metadata)를 아이노드(inode)
라고 부르는 자료 구조에 저장한다.
아이노드들의 저장을 위해 디스크 공간이 필요하다.
이 영역을 아이노드 테이블(inode table)
이라 한다.
아이노드 테이블에는 아이노드들이 배열형태로 저장된다.
데이터 영역에 있는 블록들의 사용여부를 표현하기 위해서 데이터 비트맵(data bitmap)
을, 아이노드 테이블에 있는 아이노드들이 사용 중인지를 나타내기 위해서 아이노드 비트맵(inode bitmap)
을 사용한다.
비트맵은 비트들의 배열이다.
슈퍼블럭(superblock)
은 파일 시스템 전체에 대한 정보를 담고 있다.
3. 아이노드
아이노드는 인덱스 노드(index node)
의 줄임말이다.
각 아이노드는 숫자(i-number)
로 표현된다.
앞에서는 이것을 파일의 저수준 이름(low-level name)
이라고 불렀었다.
vsfs에서는 이 숫자를 사용하여 해당 아이노드가 디스크 상에 어디에 있는지를 직접적으로 계산할 수 있다.
아이노드에는 파일에 대한 정보가 다 들어있다.
파일의 종류
, 크기
, 할당된 블럭 수
, 보호 정보
, 시간 정보
, 포인터
와 같은 정보들이다.
이와 같은 파일에 대한 정보를 메타데이터(metedata)
라고 한다.
아이노드를 설계 시 가장 중요한 결정 중 하나는 데이터 블럭의 위치를 표현하는 방법이다.
간단한 방법은 아이노드 내에 여러 개의 직접 포인터(direct pointer)
를 두는 것이다.
각 포인터는 파일의 디스크 블럭 하나를 가리킨다.
큰 파일을 지원하기 위해서 파일 시스템 개발자들은 아이노드 내에 다른 자료 구조를 추가해야 했다.
일반적으로 사용되는 방법 중 하나는 간접 포인터(indirect pointer)
라는 특수한 포인터를 사용하는 것이다.
간접 포인터는 데이터 블럭을 가리키지 않는다.
간접 포인터가 가리키는 블럭에는 데이터 블럭을 가리키는 포인터들이 저장된다.
직접 포인터와 간접 포인터를 결합해서 사용할 수 있다.
아이노드에는 정해진 수의 직접 포인터(12개)와 하나의 간접 포인터가 있다.
이를 멀티 레벨 인덱스 기법
이라고 한다.