[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개의 블럭을 쓴다고 가정
나중에 다시 한 번 보기 !
'정글 2기 > OS 운영체제' 카테고리의 다른 글
[Pintos] Project 1, 2_Argument parsing, User Program_system call_code analysis (0) | 2021.10.14 |
---|---|
[Pintos] Project 2_User Program_system call (0) | 2021.10.14 |
[OS운영체제] 권영진 교수님 OS 강의_2 (카이스트 전산학부) (0) | 2021.10.11 |
[Pintos] Project 2_Calling convention_Caller, Callee and registers (0) | 2021.10.09 |
[three_easy_pieces] 가상 메모리(Virtual memory)_주소 변환의 원리 (0) | 2021.10.07 |
댓글