본문 바로가기
정글 2기/OS 운영체제

[three_easy_pieces] 파일 시스템(File system)_vsfs(Very Simple File System)

by Dean30 2021. 10. 13.
728x90

[three_easy_pieces] 파일 시스템(File system)_vsfs(Very Simple File System)

 

파일 시스템에 대해 학습할 때 두 가지 측면으로 접근이 중요

  • 자료 구조 - 자신의 데이터와 메타 데이터 등을 관리하기 위해 디스크 상에 어떤 자료 구조?
  • 접근 방법 - 어떤 시스템 콜?

 

vsfs(Very Simple File System)의 자료 구조를 보자

 

 

블럭(Block) : 디스크를 누나는 단위. 4KB

메타 데이터(Metadata) : 파일에 대한 정보 (크기, 권한, 소유자,  변경 시간 등)

아이노드(Inode) : 메타 데이터를 저장하는 자료구조

 

  • D : Data region - 사용자 데이터가 있는 디스크 공간
  • I : Inode table- 아이노드들이 배열형태로 저장됨
  • i : Inode bitmap -  아이노드 영역에 있는 블럭들의 사용여부 표시
  • d : data bitmap - 데이터 영역에 있는 블럭들의 사용여부 표시
  • s : super block - 파일 시스템 전체에 대한 정보를 담고 있음 (아이노드 및 데이터 블럭 개수, 아이노드 테이블 시작 위치 등)

 

섹터(Sector) : 접근 최소 단위. 디스크는 바이트 단위로 접근이 불가능하며 섹터는 대체로 512 byte의 크기를 갖는다.

blk = (inumber * sizeof(inode_t)) / blockSize;
sector = ((blk * blockSize) + inodeStartAddr) / sectorSize;

 

멀티 레벨 인덱스

  • 직접 포인터(direct pointer) : 데이터 블럭의 위치를 직접적으로 가리킴
  • 간접 포인터(indirect pointer) : 데이터 블럭의 위치를 가리키는 포인터들이 저장된(직접 포인터 역할) 배열 블럭을 가리킴
  • 이중 간접, 삼중 간접 포인터 등등이 있음.

 

 

 

디스크에서 파일 읽기

 

  • 간단한 예제로 단순히 파일을 열고 (ex. /foo/bar) 읽고, 읽은 후 닫는 상황을 가정해 보자
  • 파일은 4KB 1개 블럭을 갖고 있다고 가정한다.

 

 

처음에는 system call open 사용

open`(`/foo/bar','O_RDONLY) 시스템 콜 -> bar에 대한 inode를 찾아서 파일에 대한 정보(권한, 파일 크기)를 얻어야 함

-> 현재 가진게 파일에 대한 전체 경로명 밖에 없으므로 경로명을 따라가서 (traverse) 원하는 inode를 찾기

-> 경로명 따라가는 것은 제일 먼저 root(/) directory에서 시작 -> 보통 root inode = 2이므로 inode 2번을 포함하는 블럭을 읽음

-> 데이터 블럭의 포인터를 추출 -> root directory data 확인(ls -al 쳐서 부모(..), 자기(.), 하위 directory, 파일 inode 정보 확인)

-> foo 폴더 inode 찾기 -> foo 폴더 데이터 읽어서 bar inode 확인 -> bar 파일 inode 확인하여 접근 권한 확인 -> 이 프로세스의 open file-table에서 file descriptor를 할당받아 사용자에게 return (이 fd는 메타데이터, 즉 bar inode를 가리키는 포인터를 가짐)

 

open() 이후 read() 시스템 콜을 통해 파일을 읽음

첫 번째 읽기는 bar inode를 읽어 블럭의 디스크상의 위치를 파악 -> bar 파일 블럭을 읽음 -> 파일 읽은 후 마지막으로 읽은 시간을 inode에 기록 + open-file-table(= file descriptor table in memory)에 오프셋(읽거나 쓸 때, 해당 작업 수행 위치 저장 변수)을 기록

 

어느 시점이 되면 그 파일을 닫아야 한다.

할당된 file descriptor 해제 (deallocated) - 이 때 추가 disk I/O 가 발생하지 않는다

 

 

디스크에서 파일 쓰기

 

  • read()와 비슷
  • 블럭 할당이 필요 할 수 있음 -> 디스크에 다른 자료 구조들을 갱신 (data bitmap, inode)
  • 그러므로 쓰기 요청은 논리적으로 다섯 번의 I/O를 생성 (bit map 읽기 / 쓰기, inode 읽기 / 쓰기, 실제 블럭에 기록) - 표의 write() 부분을 보라 !
  • /foo/bar 생성 후 그 안에 3개의 블럭을 쓴다고 가정

나중에 다시 한 번 보기 !

728x90

댓글