Big Picture on File System
File System
OS 커널의 서브시스템.
Logical resource name을 Physical address로 변환시켜준다.
- 사용자 데이터를 저장장치로부터 읽어오거나 저장 장치에 기록하는 역할.
File을 보는 다양한 관점
각 그림은 User, Kernel , Device Driver, Device 입장에서 보는 파일의 모습 나타냄.

File System in Kernel
User Space의 사용자들은 Kernel Space로 부터 파일서비스를 제공받기 위해 create, read, write, ioctrl의 System call 호출을 사용한다.
- VFS Layer
다양한 특성의 파일 시스템들(Individual Filesystems)을 유저에게 통합적인 형식으로 나타내기 위해 존재한다.
- Buffer Cache(Page Cache)
최근 접근한 File의 Data Block 내용을 Main Memory에 저장해 두는 공간. 디스크로부터 한번 읽어온 파일의 내용에 다시 접근할 때, 빠르게 읽어올 수 있게 한다.
File Structures
Access Patterns with File(파일에 접근하는 방식들)
디스크의 Fragmentation 문제 해결 방안
과거에는 메모리의 Fragmentation처럼 파일에 저장 공간을 할당하고 반환할 때마다 Fragmentation이 발생했다. 메모리에서는 이를 막기 위해 Page 단위로 메모리를 할당하는 기법을 사용하였는는데, 디스크도 비연속적인 Block 단위로 Allocation을 수행하여 이를 방지할 수 있었다.
Types of file structures(과거, 요즘은 아님)
Linked files
블록 단위로 할당하지만 포인터를 통해 링크될 수 있도록 하는 방식.

-Linked File 구조에서 파일에 접근하기 위한 방법해당
File Descriptor에 기록된 File의 첫 번째 블록의 주소를 통해 File에 접근.
-Linked File 구조에서 File C의 세 번째 블록을 읽는데 필요한 Disk Access 횟수
1. File C의 Descriptor를 읽어온다. (File C의 첫 번째 블록의 주소를 알아냄)
2. File C의 첫 번째 블록을 읽어온다. (File C의 두 번째 블록의 주소를 알아냄)
3. File C의 두 번째 블록을 읽어온다. (File C의 세 번째 블록의 주소를 알아냄)
4. File C의 세 번째 블록을 읽어온다.
- Indexed files
- 마찬가지로 블록 단위로 디스크 공간을 할당하지만 File Descriptor에 존재하는 인덱스로 채워진 배열을 통해 각각 필요한 공간을 포인터로 가리키게 함.
- linked file 방식에 비해 Sequential, Random access 하기 편하다. 하지만 File Descriptor는 일정한 크기를 갖기 때문에 그 안에 넣을 수 있는 인덱스의 개수가 제한 된다. 즉, 한 파일의 크기가 인덱스의 개수 만큼 제한이 된다. 그럼에도 불구하고 linked file 방식보다 더 많이 사용된다.

Indexed file 방식이 현대의 OS File System에서 사용되는 방식
1~12번 인덱스는 데이터를 가리키고 13번은 특정 블록을 가르키고 해당 블록은 또 다른 인덱스들을 가지고 있다. 이런식으로 Indexed file이 가지고 있는 문제점을 해결하였다. 하지만 Data seek time이 증가하는 패널티가 있다.
Bit Map을 사용한 디스크의 Free Block 관리
각 Bit가 디스크의 Block이 사용 중인지 아닌 지를 나타내는 Array. HW/SW String Search 기법을 사용해 연속적인 사용 가능한 Block을 쉽게 찾을 수 있다. 예를 들어 6개의 연속적인 사용 가능한 디스크 블록을 111111로 표현한다. 사용할 수 없는 공간(이미 사용중인 공간)은 0으로 표시된다.
Disk Space Management
File이 생성되거나 확장될 때, 어떻게 Disk Sector들을 File에 할당해 줄 것인가를 결정. 파일에 접근하는 속도가 빠르게, 디스크 공간을 효율적으로 사용하는 것.
Extent-based Allocation
Block들을 그룹으로 묶고 각 그룹에 Semantics를 부여함으로써 최적화를 달성하는 정책. 기본적인 블록단위로 할당할 때 Seek time이 증가하는 패널티를 줄이기 위해 더 큰 단위로 할당.