파일 시스템

EEEFFEE·2023년 12월 21일

raspberrypi4-kernel

목록 보기
9/12

23.12.18 최초 작성

1. 파일 시스템

  • 저장 장치를 관리하는 운영체제의 한 요소
  • 파일 시스템의 목적
    • 높은 성능
    • 많은 수의 파일과 용량이 큰 파일 지원
    • 내용의 보존
    • 다양한 저장장치와의 호환
    • 낮은 용량 지원

1.1 layer structure for file system

  1. application

    • 사용자가 파일을 사용하기 위한 프로그램
  2. system call

    • 파일에 대한 인터페이스 지원 (open(), read(), write())
  3. file system

    • 각 디스크 블록을 file로 추상화
    • 각 파일과 디스크 블록을 연결
  4. device driver

    • device를 디스크 블록(disk block)의 집합으로 추상화
    • 디스크 블록의 크기는 페이지 프레임과 동일하며 실제 디스크와 매핑 됨
  5. device

    • 실제 물리적 장치를 말하며 platter, track, sector, cylinder, spindle로 구성 됨
    • head, arm을 통해 특정 구역의 데이터 읽음
    • seek time, rotational latency, transmission time등의 성능 지표가 있음

1.2 file system structure (UFS)

  • file systemdata/metadata로 이루어져 있음

1.2.1 metadata

  • 파일, 파일 시스템을 관리하기 위한 데이터
  1. Super block

    • 파일 시스템을 관리하기 위한 메타데이터
    • 총 용량, block size, inode 위치, root 디렉토리 정보 등
  2. inode

    • 파일을 관리하는 데이터
    • 파일의 속성(write, read권한 등) 및 디스크 블록의 위치 등
  3. bit map

    • 디스크 블록, inode가 사용 중인지 사용 가능한지 구분

1.2.1.1 inode (링크)

  • 각 inode에는 indirect block이라는 포인터가 존재하며 몇 단계에 걸쳐 디스크 블록을 가르키는지에 따라 double, triple등으로 나눔
  • 1 단계 씩 증가할 때 마다 indirect block이 가리킬 수 있는 용량이 1024배 씩 증가
    (4KB / pointer size = 1024)

1.3 디렉토리 (링크)

  • 파일 이름, inode 번호로 이루어진 파일

1.4 UFS (Unix File system)

  • 모든 것을 파일로 관리

1.4.1 읽기 접근 흐름

  • /foo/bar, 12KB라 가정
  1. open()과정 : fdinode 연결

    • rootinode를 읽고(read) data 읽음(read)
    • fooinode를 읽고(read) data 읽음(read)
    • bardata읽음(read)
  2. read()과정 :

    • barinode정보 읽고(read) data읽음(read), 그리고 barinode에 접근 시간을 수정 (write)
    • 12KB이므로 디스크 블록 크기(4KB)만큼 3회 반복
  3. close()fd 및 관련 자료구조 해제

1.4.2 쓰기 접근 흐름 (생성)

  1. open()과정 : bar을 위한 inode할당

    • rootinode를 읽고 data 읽음(read)
    • fooinode를 읽고(read) data 읽어(read) 파일이 없다는 사실 알게 됨
    • inode bitmap을 읽고(read) bar에 대한 inode 할당 받아 정보 생성(write)
    • foodatabar가 추가됨 알림(write)
    • barinode를 읽고(read) 접근 시간 갱신(write)
    • fooinode에 새로운 정보 갱신(write)
  2. write()과정

    • barinode정보 읽고(read) 디스크 블록 할당 위해 data bitmap을 읽어(read) bitmap 할당(write)
    • bardata 기록(write), 그리고 barinode에 접근 시간을 수정 (write)
    • 12KB이므로 디스크 블록 크기(4KB)만큼 기록면 총 3번 반복
  3. close()fd 및 관련 자료구조 해제

1.4.3 caching

  • read(), write() 과정을 보면 디스크 I/O가 자주 발생해 성능 저하가 발생할 수 있음
  • 접근하려는 주소의 값을 caching해 이를 방지할 수 있음

1.4.4 Delayed write

  • write()과정에서 여러번의 write()과정을 통합하는 방법
  • 처음 write()과정에서 barinode정보 읽고(read) 마지막 write()과정에서 디스크 블록 할당 위해 data bitmap을 읽어(read) bitmap 할당(write)
  • bardata 기록(write), 그리고 barinode에 접근 시간을 수정 (write)

2. 파일 시스템 성능 향상 (링크)

  • 일반 디스크의 기본 단위는 sector로 크기는 512B 임
  • 다중 섹터 주소(4KB)를 LBA (Logical Block Address)라 하며 이를 디스크 블록이라고 함

2.1 성능 측정 지표

  • 단위
    • I/O time (ms) : I/O에 걸리는 단위 시간 (Seek Time + Rotational Delay + Transfer Time)
    • I/O rate (MB/s) : I/O 시 데이터가 전송되는 양 (데이터 양 / I/O time)
  • workload
    • random : 디스크 임의의 위치에서 작은 크기(4KB) I/O 요청
    • sequential : 연속적인 큰 크기 I/O 요청

2.2 FFS (Fast File System)

  • sequential하게 참조하는 것이 더 빨라 고안된 파일 시스템
  • inodebitmap같이 연속적으로 참조되는 데이터의 경우 같은 cylinder 구역에 저장하도록 함
    • 디스크에서 파일 시스템을 patition이라는 단위로 나누고 그 아래 superblock, boot block, cylinder groups으로 나눠짐
    • cylinder group : super block copy + inode map + bitmap + inode + data block

2.3 EXT2

  • sequential하게 참조하고 확장성 향상을 위해 고안된 파일 시스템
  • inode와 관련 data block을 인접한 cylinder에 할당 (block group)
  • 선할당 (pre-allocation)을 통해 8개 연속된 블록 할당
  • 파일 시스템 크기, 파일 크기, 디렉토리 엔트리 크기 확장
    • boot record + additional boot record data + superblock + block group record data + block bitmap + inode bitmap + inode table + data blocks

2.4 Issues of FFS / EXT2

Group Size

  • 너무 크면 긴 탐색 시간
  • 너무 작으면 한 그룹에서 관리하기 어려움

Allcation

  • 어떤 그룹을 선택해 할당할건지 결정해야 함
    • inode가 가장 적게 할당된 group에 할당 (load balancing)
    • 같은 디렉토리에 속한 파일들 끼리 같은 group에 할당 (locality)
    • 한 그룹을 모두 차지할만큼 용량이 큰 파일의 경우 한 그룹에서 정해진 블록을 할당 받으면 다른 그룹에서 할당 받음 (파일들 간의 locality)

0개의 댓글