[운영체제(OS)] 12장. File System Implementation(2)

kothe·2022년 12월 6일
0

운영체제

목록 보기
17/17

Linux와 Unix가 file system을 어떻게 관리하는지 알아보자

Unix File System


하나의 partition을 아래그림처럼 4개의 영역으로 구분해 관리한다.Block size = 1KB, Block number = 32bit(4B), Inode size = 64B라고 가정해보자. 한 블록에 16개의 inode가 들어갈 수 있고 만약 inode list에 block이 100개 있다면 총 1600개의 파일을 저장할수있다.

  • Inodes
    • Disk에 static하게 존재

    • 필요할 때 memory로 load한다.

    • Contents of the disk inode

      • File owner

      • File type

      • File access permissions

      • File access time(마지막 modified, 마지막 access, 마지막 inode 수정시간)

      • Number of links to the file

      • File size

      • file data의 disk block 주소목록
        disk block number 13개를 저장하는 disk address부분이 총 52B로 inode에서 가장 큰 영역을 차지하고있다.
        총 13개의 block number pointer밖에 없는데 14번째 block은 어떻게 접근할까? Unix에서는 10개의 direct number와 single indirect 1개, double indirect 1개, triple indirect 1개로 많은 수의 block에 접근할 수 있도록한다.

        Block size == 1KB라고 할때 이 방식을 사용해 max file size를 구해보자
        Max file size
        = 10 * 1KB (direct) + 2^8 * 1KB(single) + 2^8*2^8*1KB(double) + 2^24*1KB(triple)
        = 약 2^24KB + α
        = 약 16GB + α

  • Directory structure

    /a/d/x 에 있는 x를 찾는 과정은 이렇다.
    1. 루트 디렉토리에 접근
    2. 루트 디렉토리의 inode에서 directory a 찾기
    3. a의 inode에서 directory d 찾기
    4. d의 inode에서 x찾기

Linux File System

Ext2/Ext3/Ext4 중 Ext2를 위주로 알아보자

Inode list와 data block을 나눠두는 Unix의 UFS에는 두 가지 문제점이 있었다.
Inode List와 Data block이 멀리 떨어져있어서 찾는데 시간이 오래걸리고, data block끼리도 거리가 멀리 떨어져있다.

long distance to seek 문제를 개선하기 위해 cylinder group을 만드는 방법인 FFS가 있다.이런식으로 cylinder group으로 묶어줘서 seek distance를 최소화해주는 방법이 있었고 이를 본따서 Linux의 EXT2가 만들어졌다.

Ext2

제일 첫번째는 boot block이고 unix와는 다르게 같은 크기의 block group이 쭉 있다. 하나의 block group엔 super block,group descriptors,data bitmap,inode bitmap,inode table,data blocks들이 있다.

Block group이란? 한 파일에 속하는 데이터 블록들을 모아두는 단위. 흩어질수도 있지만 가급적 한 group에 넣는다.

  • Boot block : 부팅할 때 필요한 bootstrap code를 저장하는 영역

  • Superblock : file system의 metadata 저장 (1 block)
    file system의 block size, 빈 블록의 개수, 사용중인 블록의 개수, 현재 파일의 status(crash 정보 등), timestamps 등등 저장돼있다.

    Block group마다 Superblock이 있는데 모두 같은 내용이므로 kernel은 첫번째 그룹의 superblock만 사용한다.

  • Group descriptors : 자기 block group에 대한 metadata
    해당 그룹의 free block 개수, inode 개수에 대한 정보가 있다. 특이한 점은 한 그룹의 group descriptor에 모든 그룹에 대한 group descriptor 정보가 모두 있다.
    superblock과 마찬가지로 커널은 첫번재 그룹의 group descriptor만을 사용한다.

  • Data block bitmap / Inode bitmap (1 block)
    Data block bitmap : group에 block이 n개 있으면 총 n bit를 사용해서 각각 block이 사용여부를 저장한다. 한 block의 크기가 4KB(4096Bytes)면 총 32768 bit이므로, 한 그룹에 들어갈 수 있는 최대 block개수는 32768개가 된다.

    Inode bitmap : Inode tables의 사용여부를 bitmap으로 저장한 block이다. 마찬가지로 한 block의 크기가 4KB(4096Bytes)면 총 32768 bit이므로, Inode table에 들어갈 수 있는 최대 Inode개수는 32768개가 된다.

  • Inode table : 각 파일마다의 inode를 저장해둔 테이블

  • Data block : 파일데이터가 저장된 block들

Max file size

Unix와 비슷한 구조로 12개의 direct와 각각 한개의 single, double, triple block pointer 총 15개의 block pointer가 있다
Unix에서의 예시와 같은 방식으로 계산해보면 block size = 1KB일때 16GB, 2KB일때 256GB의 max file size를 갖는다.

4KB일때 계산해보면 max file size = 4TB가 나와야하는데 실제 max size는 2TB로 제한된다. 이유는 Inode table을 보면 알 수 있다.i_block 필드를 보면 32bit unsigned integer로 파일의 총 datablock개수를 저장한다. 512Byte 기준으로 몇 개의 data block을 가지는지 저장되기 때문에 최대 2^32 * 512Byte = 2TB로 최대 크기가 이 필드로 인해서 제한된다.

Block group size

위에서 한 번 알아본 내용이다.

block size = b bytes라고 할 때, data block bit map과 inode bitmap은 각각 1블록이기 때문에, 8 x b개의 file을 가질 수 있다.
block size가 작아지면 block group의 개수는 늘어난다.


EXT3

EXT2와의 차이는 journaling의 유무다.
왼쪽처럼 캐시에서 write-back할 때 일부만 Disk에 쓰여지고 끊기면 안된다. EXT3에서는 이 문제를 해결하기위해서 Journal area를 만들어 commit -> checkpoint 두 단계로 write-back한다.

UFS & EXT2 는 비정상적으로 종료되는 event가 발생하면 fsck같은 유틸리티로 파일 시스템을 검사해줘야하는데 긴 시간이 걸린다. -> journaling 기법을 통해 해결

  • Commit
    • journal 영역에 data 씀
    • 기본 5초 주기
  • Checkpoint
    • 5분주기로 또는 journal area가 1/4 찼을 때 Disk에 써준다.
profile
천천히 꾸준히

0개의 댓글