파일 시스템 Overview

June Lee·2021년 4월 18일
0

운영체제

목록 보기
20/25
post-custom-banner
  • User's View
    -계층적 파일 시스템
    -Logical I/O

  • Kernel's View
    -수평적 파일 시스템
    -Physical I/O (커널 입장에서는 파일에 일련번호가 있을 뿐 디렉토리나 계층적 구조가 없다)

파일 시스템은 OS마다 달라지는 부분이 있다.
OS 입장에서는 디바이스도 파일로 맵핑되어 파일처럼 다룬다.
리눅스 파일 시스템은 60개 이상의 파일 시스템을 다 커버한다. ( 마그네틱 디스크, 플래시 메모리 디스크,.. 모두 파일 시스템의 형태가 다르다.)


HDD(Hard Disk Drive) File System Layout

디스크는 빠른 속도로 돈다. 하나의 트랙은 섹터 단위로 나뉘어지고, 이 섹터 하나가 보통 4KB의 피지컬 블락이다. 돌고있는 디스크에서 head가 움직여서 원하는 트랙의 원하는 섹터로 찾아간다.

Disk Access

  1. Seek Time: head가 움직여서 원하는 트랙까지 찾아가는 시간(가장 느리다. O(10ms))
  2. Rotational Latency: 원하는 트랙에서 원하는 섹터가 돌아올 때까지 기다리는 시간(O(1ms))
  3. Read/Write Time: 섹터가 지나갈 때 read/write하는 시간 (O(1ms))

-> 디스크 스케줄링은 요청이 들어온 순서대로가 아니라, 마치 엘레베이터처럼 동작한다. (현재 위치에서 가까이 있는 요청을 먼저 처리한다)
-> 이처럼 디스크 I/O는 시간이 많이 소요되기 때문에, 디스크에 읽고 쓰는 작업을 최대한 줄이기 위해 페이지 캐싱/read-ahead 등의 기법을 사용한다.

Read-Ahead?
한 번 찾아갈 때 굳이 필요하지 않더라도 뒤에 붙어있는 블락까지 한번에 읽어오는 것을 말한다. 즉, Sequential Access를 가정하여 미리 페이지 캐시에 데이터를 가져다 놓는 것이다.
단, Read ahead의 경우 Sequentail Access를 가정하기 때문에, lseek를 많이 쓰는 경우에는 효과가 없다. 따라서 퍼포먼스를 높이기 위해서는 시퀀셜 어세스를 늘려주는 것이 좋다.
따라서 자료의 크기가 큰 경우에는 우선 sorting을 해서 시퀀셜 어세스를 늘려주는 편이 퍼포먼스가 좋다.

-> 하드 디스크는 매우 고장이 잘 나기 때문에, 이에 대비해서 Journaling File System을 사용한다.

Journaling File System?
저널링 파일 시스템은 디스크에 쓸 때 그 내용이나 행위를 저널(로그)에 기록하여 변경사항을 추적하는 파일 시스템이다.

사실 요즘은 플래시 메모리로 만들어진 SSD(Solid State Disk)를 많이 사용한다. 그러나 커널은 아직 완전히 고쳐지지 않았기 때문에 SSD 또한 하드디스크처럼 간주하고 다룬다.


리눅스 파일 시스템

  • 리눅스에서 제공하는 파일 타입
    -일반 파일(Ordinary File)
    -디렉토리(리눅스)/폴더(윈도우)
    : 일반 사용자는 폴더가 어떤 영역이라고 생각하지만 사실은 하나의 파일에 불과한데, 이게 디렉토리 파일이다. 디렉토리 파일은 디렉토리 안에 있는 파일들에 대한 정보를 지니고 있는 파일일 뿐이다.
    -파이프로 만들어 놓은 파일(FIFO File)
    -특수한 파일(Character Special File / Block Special File)
    : 디스크에 저장된 파일 뿐만 아니라, 디바이스도 파일로 취급하는데, 이처럼 파일로 맵핑된 디바이스를 Special File이라고 한다.
    -Symbolic Link File
    :다른 어떤 파일로 가기 위한 정보를 가지고 있는 파일(바로가기)

프로세스를 관리하기 위한 PCB처럼 파일을 관리하기 위한 것이 각 파일에 대한 inode이다. inode는 파일에 대한 메타데이터(누가 만들었고, 언제 만들었고, 언제 마지막으로 수정했는지,..)를 지니고 있다.

inode는 array이다. 즉, inode number(일련번호)를 안다면 inode array에서 해당 파일의 정보를 볼 수 있다. 따라서 파일 간의 관계는 Flat한 개념이지 계층적이지 않다.

파일의 내용 뿐만 아니라 inode 또한 디스크에 저장되어 있다. inode는 파일에 대한 모든 메타데이터를 가지고 있는데, 파일이 디스크 속 어디에 있는지도 이 inode에 저장되어 있다.
따라서, inode는 파일을 접근하고, 수정하기 위한 모든 정보를 지닌다. 때문에 파일에다 read/write를 하고 싶다면 우선 inode를 찾아야한다. 파일의 inode는 그 파일을 open한 후 close할 때까지 메모리에 가져다놓는데, 그게 open()이라는 시스템콜의 역할이다.

profile
📝 dev wiki
post-custom-banner

0개의 댓글