File System

 

File System

Files and Directories

  • File : A named collection of byte stored on disk
  • 사용자와 OS가 File을 보는 관점의 차이
    • 사용자 입장에서는 Byte Sequence이지만
    • OS 입장에서는 Block Sequnece이다 (Disk는 Block device이고 Block 단위로 I/O activity가 발생함)
  • Naming : Disk 위에 만들어논 File을 Addressing 할 수 있게 만드는 것
  • File Descriptor : File의 내용에 접근하기 위해 필요한 Meta data들을 저장하는 자료구조
    • File system이 해야될 일은 text name을 File Descriptor id로 바꾸는 역할을 해야됨
    • File이 살아있는 한 File Descriptor도 Storage에 저장됨, 물론 OS가 File Descriptor를 자주 access해야되서 copy본을 Main memory에다가 저장함
      • 성능 향상을 위해 File Descriptor의 복사본을 Main memory에 유지할 때 발생하는 부작용 : Disk와 Main memory에 저장된 File Descriptor의 값이 달라질 수 있음
    • Meta data들 : file의 크기, file 최근 access 시간, file 접근 기능 등…
    • inode(Index node) :
      • Unix의 File System에서 File Descriptor
      • File System volume단위의 unique한 이름이다 (즉 Disk storage에서 inode를 0번부터 부여하고 Flash storage에서도 inode를 따로 0번부터 부여함)
      • Volume(Logic Drive) : 단일 File system으로 관리되는 저장 장치 상의 영역
  • File을 access할려면 먼저 File Descriptor를 access하고 File content를 access 해야 된다
    • File Descriptor들을 Disk의 특정 영역에 모아두면 성능 저하가 발생하는 원인 : Disk 상에서 File Descriptor와 File content사이의 물리적인 거리가 멀기 때문에 Disk의 Seek Time이 증가함
      • 요즘은 File Descriptor들을 가급적 File content 근처에 흩어놓는다. 그리고 깨질 경우 복구할 수 있게 copy를 여러개 유지함
  • Directory (Folder) : File들 또는 Subdirectory를 가지고 있는 entity. 내부적으로 file과 똑같이 처리함

    • Directory file의 content : (text file name, file id) pair data를 받음

      Screen Shot 2021-09-15 at 4.46.25 PM

  • Link : Unix나 Linux File System에서 실제 File이나 Directory 혹은 또 다른 Link를 가리키도록 연결해 준다는 의미

    • Windows의 ‘바로 가기’나 단축 아이콘을 연상할 수도 있지만, 바로 가기나 단축 아이콘이 단순히 File 관리자가 담당하는 기능인 반면, Linux의 Link는 File System 차원에서 제공된다는 근본적인 차이가 있다

    • link를 사용하는 이유 : disk공간의 효율적인 사용에 있다

    • 예를 들어 copy를 하게 되면 똑 같은 data block이 하나 더 생기는 반면에 link는 link된 두 파일이 하나의 data block을 포인트 하고 있기때문에 disk 공간을 절약할 수 있다

    Screen Shot 2021-09-15 at 6.13.20 PM

    • Soft Links (symbolic links) :

      • 원본 파일의 이름을 가리키는 링크로 원본 파일이 삭제되면 사용 불가능하다
      • symbolic link는 서로 다른 file system으로 link를 할 경우에 사용 (같은 file system내에도 가능)
    • Hard Link :

      • 원본 파일과 동일한 inode 를 가지며 원본 파일이 삭제되더라도 링크 파일을 여전히 사용 가능하다

      • hard link는 같은 file system내에서만 file link가능 (inode가 File System volume단위의 unique한 이름이기 때문에)

Big Picture on File System

Screen Shot 2020-03-10 at 9.56.36 PM

  • File System은 Kernel의 하나의 Subsystem이고 다음과 같은 주요 기능을 가지고 있다

    • Logical file name을 Physical address로 변환시키는 역활
    • 사용자의 데이터를 저장 장치로 부터 읽어오거나 저장장치에 기록하는 역할
  • Views on File

    11-6 screenshot

    • User level에서 file content라 하는 것은 file 단위의 sequence of byte이다
    • Kernel level에서는 file content라 하는 것은 file안에 존재하는 sequence of block이다. 그리고 meta data를 가지고 있고 이거를 File Descriptor(inode)라 한다
    • Block device로 가면 sector들의 번호로 변화하게 된다
  • File System in the Kernel (UNIX OS)

    12-53 screenshot

    • VFS : 특성이 다른 여러 File System이 UNIX OS에 공존하는데 이것들을 uniform하게 사용자한테 나타내기 위해서 필요함
    • Buffer Cache : 최근 접근한 File의 Data Block내용을 Main memory에 저장해 두는 공간. Disk로 부터 한번 읽어온 File의 내용에 다시 접근할 때, 빠르게 읽어올 수 있게 한다
    • I/O Schedulers 부터 Disk의 device driver가 된다

File Structure

  • Data 접근 패턴

    • Sequential Access
    • Random Access : 저장된 file을 찾을려고 할 떄
    • Keyed Access : 특정을 값을 통해 block을 검색 할 때 (OS에서는 처리 :x: )
  • File Structure 구조를 결정하는 요소는

    • Sequential Access와 Random Access를 효율적으로 지원해야된다
    • 작은 File과 큰 File을 모두 효율적으로 지원해야된다
  • 과거 Fil system 구조

    • Linked files (70년대)

      • File이 하나 생기게되면 Disk storage에 그 file을 저장하기 위해 Block들을 할당해야됨. 가장 원시적인 방법은 필요한 Block을 연속적으로 Disk storage에 할당함

        10-32 screenshot

      • File에 Access하기 위한 방법 : 해당 File Descriptor에 기록된 File의 첫 번째 Block의 주소를 통해 File에 접근

      • Example. File C의 3번째 Block을 읽는데 필요한 Disk Access 횟수

        1. File C의 Discriptor를 읽어옴 (File C의 첫 번째 Block의 주소를 알아냄)
        2. File C의 첫 번째 Block를 읽어옴 (File C의 두 번째 Block의 주소를 알아냄)
        3. File C의 두 번째 Block를 읽어옴 (File C의 세 번째 Block의 주소를 알아냄)
        4. File C의 세 번째 Block를 읽어옴
      • Sequential Access는 문제가 없지만 Random Access에는 많은 seek가 필요함

      • Fragmentation 문제가 있음

    • Indexed files

      • File Descriptor 안에 Index array가 있어서 그 file이 가지고 있는 block에 대한 pointer들을 가지고 있음

        14-42 screenshot

      • Linked files에 비해 Sequential Access와 Random Access 모두가 편하다

      • 한 File의 크기가 Index의 개수 만큼 제한이 된다는 문제가 있음

      • Indexed file이 UNIX OS에서 사용됨

      • 4.3 BSD OS의 File Structure :

        15-36 screenshot

        Double, Triple indirected Index block을 만들어서 File size가 큰 것도 수용할 수 있음

        대신 File size가 커지면 Data를 access하기 위해서 더 많은 seek가 필요함

  • 관련된 Mechanism

    • Buffer cache : read/write system call한 횟수만큼 device driver가 동작하는 것이 아니라 많은 경우 device driver에 가지 않고 Buffer cache에서 hit가 나서 file operation이 처리가 됨
    • Bit map : Disk의 Block들에게 전부 1 bit를 map시켜놓는다. 그 Block이 free하면 1이 할당되고 그 Block이 이미 사용되고 있으면 0이 할당됨. (ex. file하나가 6개의 block이 필요하다면 Bit map에 “111111” string을 search해서 거기다 할당하면 된다)

Disk Space Management

  • Disk Space Management : File이 생성되거나 확장될 때, 어떻게 Disk Sector들을 File에 할당해 줄 것 인가를 결정

    • Disk Space를 효율적으로 사용, 가급적이면 overhead가 적게, Disk access의 속도가 빠르게 allocation 하는 것, 필요하면 여러 user들이 space를 공유할 수 있게
  • File System이 가져야될 기능들 :

    [1] Disk Space Management

    [2] Naming

    [3] Protection

    [4] Reliability

  • Disk Space allocation policies

    • Contiguous allocation :
      • Fragmentation 문제가 있으며 현재는 잘 활용하지 않음
    • Block-based allocation
    • Extent-based allocation :
      • Block들을 group으로 묶고 각 group에 semantics를 부여함으로써 최적화를 달성하는 정책

Evolution of UNIX File System

  • UNIX File System의 진화

    [1] System V file system (s5fs)

    • 하나의 Disk driver위에다가 volume을 하나 또는 여러개를 만들 수 있다. 그리고 File system은 Volume당 하나가 존재한다.

    • block size는 그 당시 Disk drive의 sector size를 기준으로 512 또는 (512)^2, (512)^3 Byte 등등.

    • sector들의 Linear array = block array 이며, File System이 allocation을 할 때 관점을 두는 storage는 block array이다

    • block array 실제적인 모습

      Screen Shot 2021-09-16 at 12.52.24 PM

      • Boot Area (0번 Block) : Computer Booting 시 실행되는 Program인 Boot Loader가 저장되어 있는 공간
      • SuperBlock : 이 Volume에 들어있는 File System에 대한 모든 Meta data가 들어가있음 (ex. inode의 개수, 전체 block의 개수, free한 inode의 개수 등등 )
      • inodeList : 어떤 File이 Create되면 여기 inodeList에서 하나 inode를 가져다가 거기 meta data를 기억함
      • Data blocks : 나머지 Data들이 모두 저장됨
    • 문제점 :

      1. 성능상의 문제 :
        • File의 inode와 Data Block간의 물리적인 거리가 멀기 때문에 File 접근시 과도한 Seek Operation이 발생
        • Data Block의 할당/해제를 반복할수록 Free Block이 산재하게 되어 Sequential Block을 읽을 때 과도한 Seek Operation이 발생
      2. 안전성의 문제
        • SuperBlock이 한 곳에만 저장되어 있기 때문에 손상될 경우 File System을 사용할 수 없음

    [2] Berkeley fast file system (FFS) – often called Unix File System(UFS)

    • s5fs의 성능저하의 문제를 개선함

    • Cylinder :

      cylinder-cylinder.fit_lim.size_1050x

    • Cylinder group : 인접한 Cylinder 몇개를 묶어서 group화 시킴

    • 가급적이면 logical related information들은 다 Cylinder group에 몰아 넣는다 (즉, 같은 directory에 있는 모든 file들의 inode와 content들을 동일한 Cylinder group에 넣는다) :arrow_right: 성능상의 문제 해결

    • Cylinder group마다 SuperBlock을 다 둔다 (한 track 또는 한 Plate가 날라가도 정보를 회복할 수 있게 잘 배치함) :arrow_right: 안전성의 문제 해결

    • Block외에 Fragment라는 더 작은 개념을 도입 (Fragment = sector), allocation는 Fragment단위로 일어남

      • 여러 개를 할당해야되는 경우, Fragment를 여러개 묶어서 Block의 크기를 더 크게 잡기도 함
    • File size가 커서 한 Cylinder group에 다 몰아넣을 수 없는 경우, 인접 Cylinder group에 넘기게 된다

      Screen Shot 2021-09-16 at 1.21.49 PM

      • 하나의 Cylinder group에는 작은 size의 초기 block들을 담게 되고 그게 커지면 인접 Cylinder group에 넘기게 된다
      • 옆에 Cylinder group로 넘기는 기준은 48KB (왜냐하면 48KB까지는 Direct index로 fast access가 가능해서)
    • Rotational delay도 최적화 시켰다

      Screen Shot 2021-09-16 at 1.25.40 PM

      • rotdelay = 2로 설정했으면, 2 sector를 보낸 만큼의 시간이 보장되야됨. 그래서 Disk에 data를 저장할 때 2개 sector를 뛰어서 배치한다
    • 물리적 제약들을 해소함

      • s5fs에는 file 이름으로 14 character 밖에 사용할 수 없었음, 한 File system이 64K개 만큼의 file만 contain할 수 있었음
      • 그래서 file 이름을 256 character 로 지원함
      • Symbolic link를 지원함
      • Disk Quota개념도 추가
    • Read/Write 성능이 뛰어나게 되면서 Disk space의 효율성은 떨어지지 안았음

    • 문제점 :

      • Data Block이 흩어져있어 있는 문제가 존재
      • Crash recovery 시간이 너무 오래걸림

    [3] Sun’s network file system (NFS)

    • 분산 프로그래밍, 소켓 프로그래밍, RPC 개념이 생기면서 network file system이 개발되는데 가장 대표적인 file system

    [4] Sun’s virtual file system (VFS)

    • Virtual file system : File System이 너무 많아져서 user interface를 단일화하기 위해 만든 Software Layer

    [5] Log-structured file system (LFS)

    • Disk의 Volume size가 커지고 Recovery의 overhead가 심각한 문제가 되서 나온 새로운 file system
    • FFS에서의 Crash recovery를 쉽게 만듬
    • 기존의 File System은 Rewrite operation이 일어나면 그 content를 invalidate시킨 다음에 새로운 Block을 받아서 그 Block을 올바른 index 구조안에 넣는다. Log-structured file system은 새로 생성된 정보만 file 뒤에다가append한다.
      • modification이 일어나면 뒤에다 껴넣기 때문에 앞에 Invalidate된 Data Block들이 많이 생겨서 이것들을 collect해야되는 Garbage collection이 필요하다
    • Log-structured file system을 사용하게 되면 갑자기 System이 확 꺼졌다고 해도 Log들이 뒷부분에 남아있기 때문에 System이 Reboot하게 될 때 그 Log들만 다시 수행을 시켜서 File System을 reconstruct하면 됨
      • Smartphone의 flash storage가 있는데 flash drive의 file system은 예외없이 Log-structured file system로 구현이 되어있음 (Flash는 Erase-before-write라는 제약 때문에 LFS를 쓸 수 밖에 없음)

Disk Scheduling

  • I/O Request : 몇 번째 Plate에 몇 번째 Track에 몇 번째 Sector를 읽어라 같은 명령

  • Request Queue : Disk에 대한 I/O Request를 저장하는 Queue

    • Request Queue는 Device Driver와 Device사이에 존재하면 된다
  • I/O Scheduler : Request Queue의 순서를 reordering하는 것

    • I/O Scheduler는 Device Driver의 한 부분으로 들어있게 됨
  • Scheduling Policies

[1] First Come First Served (FIFO)

  • 성능이 별루

[2] Shortest Seek Time First (SSTF)

  • Handle nearest request first

[3] Scan (Elevator)

  • Disk Arm을 한 방향으로 쭉 움직이고 거기에 중간에 걸리는 Disk operation을 처리하고 다시 돌아오면서도 Disk operation을 처리
  • 문제점 : 한 Circular scan에 중간 track들은 2번씩 기회가 주어지지만 양쪽 끝 Track은 1번씩 기회가 주어짐

[4] Circular scan

  • Scan (Elevator)의 문제점을 개선한 policy
  • Disk Arm을 한 방향으로 쭉 움직이고 거기에 중간에 걸리는 Disk operation을 처리하고 바로 다시 처음으로 돌아옴

  • Example. Request queue : 98, 183, 37,122,14,124,65,67 (Head starts at 53)

    Screen Shot 2021-09-16 at 4.40.23 PM

  • Flash Drive같은 경우 Disk보다 복잡한 Scheduling이 필요함

《Reference》

  1. SNUON Youtube