/////
Search

Storage

Hard Disk

array of sector의 추상화이다
한 섹터는 512바이트나 4096 바이트이다
크고, 싸고, 영구적이고, 느리다
Cylinder-Header-Sector Scheme
각 블럭은 cylinder, head, sector로 특정된다
Logical block addressing (LBA) Scheme
SCSI에 소개된거임
Disk는 블럭의 논리적 배열로 추상화됨
LBA(Logical block address)로 다뤄지고, Disk는 이 LBA를 물리 장소로 매핑함
HDD 퍼포먼스는
실린더 찾기(r 조절)
rotation delay
transfer 타임이다
이 디스크 스케쥴링도 해야한다.
seeks이 비싸다.

SDD

block의 집합이다
각 블럭은 페이지로 이루어져있다.
블럭이나 페이지의 크기는 기술에 따라 다르다.

NAND 타입

SLC
single level cell
1 bit/cell
MLC
multi level cell
2 bits/cell
TLC
triple level cell
3bits/cell
셀이 많아질수록, 용량은 많아지는데 느려짐
NAND constraints
No in-place update
같은 위치에 덮어쓰기 하지 못한다
다른 위치에 쓰고, 기존 주소를 새 주소로 매핑해야한다.
여기서 매핑은 논리 주소를 물리 주소로 바꾸는 걸 의미
이 관리는 SSD 컨트롤러 내부에 FTL이 관리
비트 에러
ECC를 사용해서 감지
불량 블록
이 블록을 우회하도록 해야함
수명이 있다
Flash memory
NAND는 1을 0으로 바꾸는건 가능
하지만 0을 1로 바꾸려면 전체 삭제가 필요하다
전체 삭제라고 하면 그냥 한 블록을 전부 1로 만드는 것임
bulk erase
page 단위로 쓴다
지우는 단위는 블록이다

page mapping

Flash는 한 번 쓴 페이지를 덮어쓸 수 없기 때문에, LBA랑 PPN을 매핑하는 테이블이 필요하다.
invalidate 된 친구들은 flash controller가 동작해서 지운다.

File System

File

데이터 묶음
메타 데이터는 inode라는 타입으로 저장
type
uid
rwx
size
blocks
addrs[N]: 파일 데이터를 저장한 디스크 블록 번호 리스트

Directory

내부에는 파일 이름, inode 번호 쌍이 들어있다.

Design 이슈

메타데이터에 정보를 어떻게 저장하지?
파일 이름에서 메타데이터를 어떻게 찾지?
메타데이터, offset에서 데이터 블럭을 어떻게 찾지
메타데이터랑 데이터 블럭을 어떻게 관리하지
crash 시 어떻게 파일 시스템을 recovery 하지

General

파일 시스템은 마운팅이 되어야한다.
서로 다른 파일 시스템이 같은 트리에 마운트 될 수 있다
하드 링크 vs symbolic links
하드 링크는 pathname이 같은 inode 숫자를 쓴다
뭐가 original인지 모름
inode는 하드 링크의 수를 저장함
파일 삭제는 그 수를 줄이는 것 뿐이고, 그게 0이 되면 inode가 사라짐
심볼릭은 그냥 바로 가기 같은 거임
다른 파일에 대한 레퍼런스를 가지고 있을 뿐이다.
그건 이제 절대 경로나, 상대 경로 같은 pathname이다.
파일 시스템은 쓰기에 대해서 메모리에 버퍼로 일단 남긴다
fsync()는 dirty data를 디스크로 방출함.
그리고 메타데이터도 같이 내보낸다
fdatasync는 바뀐 메타데이터는 안 내보낸다.
Read Ahead (prefetch)
파일 시스템은 파일 캐시로 데이터 블록을 먼저 읽어온다.
필요할 거 같으면 먼저 들고오는 식
spatial locality를 이용
Consistency/Sharing
Unix 개념
프로세스 간에 공유가 됨
같은 시간에 열려있으면 다른 사람들한테 다 보인다
AFS Session
파일을 열고 있는 동안 즉시 반영되지는 않는다
닫은 후에야 보임

Implementation

VSFS

very simple file system
디스크를 블럭으로 나눈다
블럭 사이즈는 sector size의 multiple임
블럭은 OS에서 사용하는 단위, 섹터는 디스크에서 사용하는 단위
일부 비율은 파일 시스템 메타데이터를 위해 남겨진다.
inode의 사이즈는 고정되어있다.
만약 한개당 256B라면, 한 4KB 블럭당 16개의 inode를 가지고 있다
5개의 블럭에는 80개의 inode가 있는건데, 이게 최대 파일의 수다
bitmap 블럭이 있어서 각 데이터/inode 블럭이 유효한지 안 한지 알 수 있다
슈퍼블록이 있다
파일 시스템의 메타데이터를 담음
파일 시스템 타입
블럭 사이즈
전체 블럭 수
전체 아이노드 수
등등

Allocation Strategy

파일을 디스크 블록에 어떻게 매핑하지
연속적으로 배정
horrible external fragmenation
파일을 옮기지 않고서는 grow 하지 못한다
sequential access에는 성능이 좋음
random access도 간단한 계산하면 잘 됨
IBM OS/360
linked list로 배정
TOPS-10, Alto
랜덤 액세스가 엄청 느리다
no external fragmentation
File allocation Table
랜덤 엑세스 성능을 늘리기 위함으로, file allocation table을 만들어서, 그 다음 링크 블록이 어디에 있는지를 적어놓음
메인 메모리에 유지
큰 파일 시스템에 scalability 안 좋을 수 있음
Indexed allocation
각 파일마다 fixed size block을 할당함
어떻게 블록을 연결할 것인가에 대한 방법 중 하나
파일은 여러 개의 고정 크기 블록에 나누어 저장됨
인덱스 블록이 따로 존재, 이 인덱스 블록 안에 해당 파일이 차지하는 데이터 블록들의 번호를 배열로 저장
메타데이터 오버헤드가 있음
인덱스 블록 크기에 따라 파일 최대 크기가 제한될 수 있음
no external fragmentation, 랜덤 접근 지원
multi-level indexing
hierarchy를 가진다
direct pointer랑 indirect pointer를 가짐
필요없는 포인터에 대해서는 공간 낭비 없음
추가적인 disk read를 할 수 있음
unix FFs, Linux Ext2/3
extent-based allocation
파일마다 여러 개의 연속된 공간을 확장함
Extent: 여러 개의 블록들을 하나의 단위로 묶은 것
연속 범위로 저장한다
b+tree 처럼 저장

Directory

Table or linear list
linear search를 해야함
Tree
Sort가 되있을 수 있음.
Hash Table:
빠르지만 파일이 늘어날 수록 scalable 해야한다

Crash Consistency

FSCK
FSCK는 파일 시스템이 마운트 될 때, 모든 consistency를 체크한다
Inode bitmap consistency
Data bitmap consistency
Inode link count
duplicated/invalid data block pointers
other integrity checks for superblock, inode, and directory
근데 너무 느리디ㅏ
Journaling
파일을 직접 반영하기 전에 로그를 남긴다
이 로그를 보고 redo하거나 아예 undo하거나