Unix 운영체제가 처음 도입되었을 때, 첫번째 파일시스템의 데이터 구조
성능이 매우 나쁘다는 단점
inode와 데이터 블록이 많이 떨어져 있을수록 seek time이 많이 발생하기 때문!
또한, 빈 공간에 대한 관리 방법을 별도로 정하지 않았기 때문에 파일 시스템이 조각화 될 수 있어 디스크 성능이 나빠진다는 단점
이러한 성능 문제를 보완하기 위해, FFS가 등장
FFS는 디스크를 여러개의 cylinder group으로 나눔
cylinder group은 같은 위치의 트랙들의 집합인 cylinder를 모은 것으로, 결국 하나의 디스크는 cylinder group으로 나타낼 수 있음
위 사진에서 인접한 cylinder 3개를 모아 하나의 cylinder group으로 나타냈는데 cylinder가 인접해 있는 것을 모았기 때문에 seek time도 최소화할 수 있게 된다
FFS는 이를 활용하여,
inode와 데이터 블록을 같은 cylinder 또는 cylinder group에 배치하여 디스크 성능을 향상시킨다.
또한, 동일한 디렉터리에 존재하는 파일과 같이 비슷한 파일들을 동일한 그룹에 배치하여 공간 지역성을 통해 성능을 향상시킨다.
cylinder group은
super block, inode bitmap, data bitmap, inode blocks, data blocks으로 구성
FFS는 안전성을 보장하기 위해, 각 그룹의 super block 사본을 보관한다.
이는 파일 시스템을 mount할 때 필요하며 여러 개의 복사본을 가지고 있기 때문에 안정적으로 파일 시스템을 mount하고 접근할 수 있음
위와 같은 구조가 디스크 내 cylinder group마다 존재하게 되고, 이는 seek time을 줄여 성능 향상
시스템 자료 구조를 cylinder group 형태로 적용했으므로, 이제는 파일/ 디렉터리/ 메타 데이터를 디스크에 배치해야 함
먼저 디렉터리를 배치할 때, 각각의 그룹마다 디렉터리를 균등하게 배치하기 위해 할당된 디렉터리 수가 적은 cylinder group, 사용 가능한 inode가 많은 그룹을 찾음
다음으로 파일의 경우, inode와 동일한 그룹에 있는 파일의 데이터 블록을 할당하여 inode와 데이터 블록 간 seek time을 줄여준다.
또한, 해당 파일과 동일한 디렉터리에 있는 모든 파일을 해당 디렉터리의 그룹에 배치
동일 디렉터리에 존재하는 파일, 디렉터리를 동일한 group에 배치하게 되면, inode와 데이터 블록이 가까이 배치되므로 파일 접근이 빨라진다
만약, 하나의 파일이 하나의 group을 모두 채울만큼 큰 사이즈일 때는, 어떻게 배치해야 하는지 고려해 봐야함
어떤 a라는 파일이 너무 커서 group의 블록을 모두 사용해버린다면, a파일이 있는 디렉터리에 다른 파일들이 있을 때 다른 파일들은 동일한 그룹에 존재하지 못하게 되는 문제가 발생
이를 해결하기 위해, FFS는 대용량 파일의 경우 몇 개의 group에 chunk 단위로 분산하여 배치함 (chunk 단위란 하나의 그룹에 저장할 블록 개수)
대용량 파일 a을 여러 개의 group에 분산 배치하면, 하나의 group에 대한 사용률도 분산할 수 있음
이렇게 되면 a 파일을 연속적으로 읽어들일 수 없기 때문에 성능이 저하된다고 볼 수 있다.
하지만 chunk 크기를 충분하게 설정해주면 대부분의 시간을 전송하는데 사용할 수 있고, 전체 시간에서 다음 chunk로 이동하는 시간의 비율을 낮게 유지할 수 있음
이를 amortization(상각)이라고 함
디스크가 특정 블록을 찾는 평균 시간을, 10ms라고 하고, 40MB/s의 속도로 데이터 전송한다고 가정할 때, 디스크가 다음 chunk로 이동하는 시간을 전체 시간의 50%만 사용하고자 한다면 10ms만큼 이동하고 10ms만큼 데이터를 전송하면 됨
그럼 chunk의 크기는 409.6KB로 설정하면 된다
즉, 1번 블록을 찾으러 가기 전에 409.6kb 만큼의 데이터를 전송한다면 전체 시간의 50%를 전송에 사용할 수 있다는 의미
FFS에서는 12개의 direct block을 inode와 동일한 그룹에 배치하고, 이 외의 indirect block과 indirect block이 가리키는 블록들은 모두 다른 그룹에 배치
디스크 전송속도는 seek time, rotation 속도 보다 훨씬 빠르기 때문에 더 나은 성능을 위해 다음 chunk 블록으로 이동하기 전에 더 많은 데이터를 전송하도록 함
대부분의 파일은 2KB의 크기였기 때문에, 4KB인 블록을 모두 사용하지 못하는 내부 단편화가 발생하여 공간 효율성이 좋지 않았음
FFS는 작은 파일 관리를 위해, 블록의 크기를 작게 만드는 방법을 선택함
하나의 블록 크기가 512byte인 블록을 만들어,
4kb 보다 작은 파일의 경우, 512byte를 할당하고
4kb 보다 큰 파일의 경우, 4kb와 512byte를 적절히 사용하여 저장하도록 함
또한, libc라는 라이브러리를 통해 위의 복잡한 작업을 해결할 수 있도록함
라이브러리는 쓰기를 바로 실행하지 않고, 어느 정도 모은 뒤 4kb가 되면 그때서야 chunk로 발행하여 오버헤드를 피함