본문 바로가기

운영체제

11. 운영체제 - Persistence(1)

File and Directories

  • File System : 디스크의 block 단위 인터페이스를 파일, 디렉토리 등의 인터페이스로 변환해주는 것
  • 파일 시스템 특징
    1. Disk Management : 디스크 블록을 파일로 모아 관리해줌.
    2. Naming : 이름을 이용해 파일을 찾을 수 있도록 해줌.
    3. Protection : 권한을 이용해 데이터를 보호함.
    4. Reliability/Durability : 파일을 영속적으로 저장함.

파일은 이름이 있는 영속적인 저장소로, 각 파일은 inode number라는 하위수준의 이름을 갖고있다. 그리고 유저는 상위레벨의 파일 이름만을 알고 inode number는 유저에게 노출되지 않는다.

파일은 디스크의 블록을 가리키는 데이터와 파일의 추가적인 정보들을 담고있는 메타데이터로 이루어진다. 

파일 시스템은 전원이 꺼지더라도 데이터를 HDD나 SSD 등의 저장공간에 영속적으로 보존해놓아야한다.

사용자가 데이터를 접근할 때 디스크의 블록을 통해 접근하는 대신 파일시스템이라는 추상화된 인터페이스로 접근할 수 있도록 하기 위해 중요한 두가지 abstraction은 파일디렉토리이다.

 

디렉토리는 계층형 구조로, 디렉토리의 각 entry는 파일과 디렉토리들의 집합으로 이루어져있다.

File system Implementation

우선 디스크는 블록 단위로 나뉜다. 블록의 사이즈는 4KB라고 하자.

파일시스템에는 유저의 데이터를 저장하기 위한 공간과, 이 데이터 블록들에 대한 추가적인 정보를 담아두는 inode table을 위한 공간이 필요하다.

inode table은 inode의 배열로 이루어져있다. 

Allocation structures

파일시스템에서 어떤 데이터 블록이나 inode가 할당된 상태인지 free상태인지 빠르게 확인하기 위해 bitmap 을 사용한다.

data region을 위한 비트맵과 inode 를 위한 비트맵을 따로 가지고 있어 어느 부분이 비어있는지를 빠르게 확인하여 할당할 수 있다.

Superblock

Super block은 특정 파일 시스템에 대한 메타데이터들을 담고있다. 위 그림에서 하얀색으로 되어있는 맨 첫 블락이 슈퍼블록이다.

inode의 개수나 inode table의 시작주소 등을 담고있어 매우 중요한 블록이다. 파일시스템을 마운팅할 때 OS는 먼저 슈퍼블록에서 여러가지 정보들을 읽어와 초기화를 수행한다.

 

Inode

각 inode는 inode number에 의해 식별된다.

inode number가 주어지면 파일시스템은 inode table의 시작주소와 inode의 사이즈를 바탕으로 디스크에서 원하는 inode의 위치를 계산할 수 있다.

inode number가 32인 inode를 접근하는 경우

Multi-Level Index

위와 같이 inode 포인터가 직접 데이터블록을 가리키도록 하면 파일시스템의 크기가 제한된다.

더 큰 파일을 지원하고자 한다면 indirect pointer를 사용하여 여러 레벨로 인덱싱을 하도록 할 수 있다.

indirection pointer는 직접 데이터블록을 가리키는 대신 다른 포인터들을 담고있는 블록을 가리킨다.

  • Double indirect pointer : indirect block을 담고있는 블록을 가리키는 포인터
  • Triple indirect pointer : double indirect block을 담고있는 블록을 가리키는 포인터

(한 블록의 크기가 4KB라고 하면)

어떤 Multi-Level index에서 12개의 direct pointer + 1개의 single indirect block + 1개의 double indirect block 가 있으면,

12개의 direct pointer로는 12개의 block을 가리킬 수 있고,

single direct pointer으로는 1024개의 block, double indirect pointer으로는 1024*1024개의 block을 가리킬 수 있으므로

(12+1024+1024^2) * 4KB = 4GB정도의 메모리를 커버할 수 있다.

Directory

디렉토리는 (entry name, inode number) 쌍의 리스트로 이루어져있다.

각 디렉토리는 두개의 추가적인 파일을 갖고있는데, 현재 디렉토리를 가리키는 '.' 과 부모 디렉토리를 가리키는 '..' 이다.