직접 접근이 가능한 매체라 하더라도 data를 어떻게 관리하느냐에 따라서 순차 접근만 허용하는 경우도 있고 직접 접근이 가능한 경우도 있다.
Allocation of File Data in DIsk
: 디스크 내부를 동일한 크기의 sector 단위로 나누어 저장
![](https://velog.velcdn.com/images/603080/post/5ce284b8-16f2-49b7-b009-f41cdb024f44/image.png)
Contiguous Allocation (Array)
- 하나의 file이 디스크 상에 연속해서 저장됨
- 오른쪽 표 directory에 metadata는 파일명, 시작점, 길이
- 단점
: 외부 단편화
: File grow가 어려움, 미리 할당 해놓으면 내부 단편화
- 장점
: 빠른 I/O에 효과적, 한번의 seek/rotation으로 많은 바이트 transfer
: Direct access(Random access) 가능
![](https://velog.velcdn.com/images/603080/post/bda77bd0-9909-4033-93f8-83e2fa50843c/image.png)
Linked Allocation (Linked List)
- Linked list를 이용해 sector들을 연결
- directory에 파일의 시작점, 끝점
- 단점
1. 직접 접근이 되지 않음
2. 한 sector가 고장나 pointer가 유실되면 많은 부분을 잃음(Reliability)
3. pointer를 위한 공간이 block의 일부가 되어 공간 효율성 떨어짐
(512 bytes/sector, 4 bytes/pointer)
- 장점
: 외부 단편화 발생 안함
- 변형
: File Allocation Table (FAT) 파일 시스템
-> 포인터를 별도의 위치에 보관하여 relaibility와 공간효율성 문제 해결
![](https://velog.velcdn.com/images/603080/post/428e1bf0-ae65-45cb-82ef-b877daffb5c2/image.png)
Indexed Allocation
- 파일마다 데이터가 들어있는 index들이 담긴 index block을 할당
- 장점
- 외부 단편화가 일어나지 않음
- 직접 접근 가능
- 단점
- 작은 파일의 경우 공간 낭비
- 너무 큰 파일의 경우 한 block으로 index를 저장하기에 부족
: linked scheme(마지막에는 다른 index블럭을 가리킴),
multi-level index(다른 index블럭들을 가리키는 index블럭)으로 해결
![](https://velog.velcdn.com/images/603080/post/8d0659a6-1102-4f27-b3f0-b32652f1f4df/image.png)
UNIX 파일 시스템
- Boot block
부팅에 필요한 정보(bootstrap loader)
모든 파일 시스템에서 Boot block은 항상 맨 앞에 있음
- Superblock
파일 시스템에 관한 총체적인 정보를 담고 있다.
- Inode list
파일 이름을 제외한 파일의 모든 메타 데이터를 저장
directory file에는 file name, inode number
- Data block
파일의 실제 내용을 보관
![](https://velog.velcdn.com/images/603080/post/92a5a964-bf58-4aab-9074-eb9484dbff2d/image.png)
FAT File System (File Allocation Table)
Linked allocation의 변형, file allocation table(FAT)를 추가
Data block 갯수만큼의 FAT에는 다음 block의 번호가 저장되어있음
- 직접 접근 가능
- bad sector가 생겨도 FAT를 참조해 복구 가능
Free-Space Management
-
bitmap or bit vector
![](https://velog.velcdn.com/images/603080/post/d84c9b99-9910-4320-b7e1-85990d4cd537/image.png)
- Bit map은 부가적인 공간을 필요로 함
- 연속적인 n개의 free block을 찾는데 효과적
-
Linked list
- 모든 free block들을 연결 (free list)
- 연속적인 가용공간을 찾는 것은 쉽지 않다
- 공간의 낭비가 없다
-
Grouping
- linked list 방법의 변형
- 첫 번째 free block이 n개의 pointer를 가짐
- n-1개의 pointer은 free data block을 가리킴
- 마지막 pointer가 가리키는 block은 또 다시 n개의 pointer를 가짐
-
Counting
- 프로그램들이 종종 여러 연속적인 block을 할당하고 반납한다는 성질에 착안
- (first free block, # of contiguous free blocks)를 유지
Directory Implementation
-
Linear list
![](https://velog.velcdn.com/images/603080/post/1edc153b-b079-4b66-9c06-2e244d95ef89/image.png)
- <file name, file의 metadata>의 list
- 구현이 간단
- directory 내에 파일이 있는지 찾기 위해서는 linear search 필요
-
Hash Table
![](https://velog.velcdn.com/images/603080/post/a658432b-c189-4f23-a047-d498cf8e89d6/image.png)
- linear list + hashing
- hash table은 file name을 이 파일의 linear list의 위치로 바꾸어줌
- search time을 없앰
- hash collision 발생 가능
-
- 디렉토리 내에 직접 보관
- 디렉토리에는 포인터를 두고 다른 곳에 보관
-
Long file name의 지원
![](https://velog.velcdn.com/images/603080/post/c56dc28d-9314-4e1a-9223-89d8e63f967e/image.png)
- <file name, file의 metadata>의 list에서 각 entry는 일반적으로 고정크기
- file name이 고정 크기의 entry 길이보다 길어지는 경우 entry의 마지막 부분에 이름의 뒷부분이 위치한 곳의 포인터를 두는 방법
- 이름의 나머지 부분은 동일한 directory file의 일부에 존재
VFS and NFS
![](https://velog.velcdn.com/images/603080/post/d9d4a09b-0c30-4f30-bbd5-2fcf1d3797e5/image.png)
-
Virtual File System (VFS)
- 서로 다른 다양한 file system에 대해 동일한 시스템 콜 인터페이스(API)를 통해 접근할 수 있게 해주는 OS Layer
-
Network File System (NFS)
- 분산 시스템에서는 네트워크를 통해 파일이 공유될 수 있음
- NFS는 분산 환경에서의 대표적인 파일 공유 방법임
Page Cache and Buffer Cache
![](https://velog.velcdn.com/images/603080/post/3c1c5cd1-d134-4c70-b546-3b9732df200f/image.png)
-
Page Cache
- Virtual memory의 paging system에서 사용하는 page frame을 caching의 관점에서 설명하는 용어
- Memory-Mapped I/O를 쓰는 경우 file의 I/O에서도 page cache 사용
-
Memory-mapped I/O
- File의 일부를 virtual memory에 mapping 시킴
- mapping 시킨 영역에 대한 메모리 접근 연산은 파일의 입출력을 수행하게 함
- 이미 mapping이 되어있는 내용에 대해서는 커널의 도움을 받지 않고 직접 읽고 쓸 수 있다는 장점
-
Buffer Cache
- File system을 통한 I/O 연산은 메모리의 특정 영역인 buffer cache 사용
- 한번 읽어온 block에 대한 후속 요청시 buffer cache에서 즉시 전달 (locality)
- 모든 프로세스가 공용으로 사용
- Replacement algorithm 사용 (LRU, LFU 등)
-
Unified Buffer Cache
- 최근의 OS에서는 기존의 buffer cache가 page cache에 통합됨
- 똑같이 page 단위로 관리하면서 필요할 때마다 파일 입출력을 위한 공간 혹은 프로세스의 주소공간으로 할당해서 사용
![](https://velog.velcdn.com/images/603080/post/4d2c2863-7b20-4a27-862d-6e1add1eda32/image.png)