reference: https://pages.cs.wisc.edu/~remzi/OSTEP/, 시스템 프로그래밍, 운영체제 수업(최종무 교수님)
파일에 append 작업만 해도 inode 변경, 데이터 블록 추가, 비트맵 변경 등이 수반된다. 이 과정 중 일부 단계에서 문제가 발생하면 일관된 상태가 깨질 수 있다. 모든 작업의 원자적 수행을 보장해야 한다.
Delayed write using cache => 급작스러운 전원 off and system crash => Some writes can be done while others are not!
Three writes: 데이터 블록, 아이노드, 비트맵
데이터 블록만 쓰이는 경우: 문제 없음.
비트맵만 수정되는 경우: space leak 발생.
아이노드만 수정되는 경우: 1) garbage read, 2) inconsistency: inode vs bitmap
데이터 블록과 비트맵만 쓰여지는 경우: inconsistency(사실상 space leak, inode가 없으므로 접근하지 못함.)
데이터 블록과 아이노드만 쓰여지는 경우: inconsistency
아이노드와 비트맵만 쓰여지는 경우: garbage read
Too Slow... (will update post soon..)
(inode, bitmap, data blocks write 가정)
step 1) Jounaling: Before writing them to their final locations, we first write them to the log
(1) TxB: Transaction begin, include Tid and writes information
(2) Log: (보통 Physical logging) same contents to the final locations
(3) TxE: End with Tid
step 2) Checkpointing: After making this transaction safe on disk, we are ready to update the original data
step Recovery(fault handling))
How to reduce journaling overhead? -> 1. performance
=> employ commit (커밋 프로토콜)
TxE(Transaction End) for all other writes (ex, fsync() before TxE)
Recovery: (1) not committed -> undo, (2) committed, but not in the original locations -> redo logging
commit before TxE
How to reduce journaling overhead? -> 2. write volume
데이터 저널링의 문제점: writes data twice, which increases I/O traffic(reducing performance), especially painfull for sequential writes
=> Metadata Journaling