Preview
- FS API open, read, write, close, link, unlink, mkdir, rmdir, etc.
- Implementation
Simple Implementation
- On-disk data structures
- Access methods
---------------------------------------------
| | D A T A |
--------------------------------------------
close up first part:
--------------------------------------------------------------
|Super block|Inode BM|Data BM| I N O D E S |
--------------------------------------------------------------
math: true
BM = bitmap
Superblock = meta-info about FS
Inode: (~256 bytes)
-------------
| type |
| size |
| #of blocks| (size smaller than block size, sparse file)
| owner |
| permission|
| addresses |
| of data blocks (direct pointer)
-------------
Questions:
- Access?
- Large Files?
- Performance: Use memory as cache
- Pathname:
/a/b/c/d/main.c- root inode
- root data -> a’s inode #
- a’s inode
- a’s data -> b’s inode #
- …
- d’s inode
- d’s data -> main.c inode #
- main.c inode
Large Files:
- inode:
- type
- size
- # blocks
- owner
- permissions
- direct pointers … (addresses of first N blocks)
- indirect pointer -> points to data block (more direct pointers)
- double indirect ptr -> points to block with indirect -> direct
- tripe indirect ptr
- Some file systems use extents (ptr, length)
Caching / Write Buffering
Caching
- frequently accessed -> in memory (use LRU-like replacement)
Write Buffering
- write() -> fast
- buffers in memory + return
- (not immediately written to disk)
- Crash => lost data
- to ensure no data loss
- write()
- fsync() forces writes to disk (SLOW)
- Delayed write benefits
- Batch
- Perceive lower latency
- Avoid overwrite, ignore deleted
FFS
Locality: Case study of early file system (Berkeley Fast File System) [FFS]
FFS: Main idea “treat disk like a disk” (technology aware)
Simple Ideas
- “block groups”:
- contiguous part of disk allocate “related” items in a group
- (spread out “unrelated” items into different group)
- Disk
------------------------------------------- | Block Group | Block Group | Block Group | ------------------------------------------- Closeup: ---------------------------------------- |Bit map | Inodes | DATA | |inodes data | | | ----------------------------------------- “block groups”:
Allocation Policies:
- mkdir() Directory
- Spread across disk (e.g. pick group w/ low# of directories)
- creat() File
- Put files in same group as parent directory
- mkdir() Directory
Large File exception