Art of Pr0gr4m

File Hole Hint 본문

IT/Linux Programming

File Hole Hint

pr0gr4m 2017. 7. 4. 20:58

프로그램이 파일의 끝 너머로 파일 오프셋을 옮기고 쓰기 작업을 하면, 파일 중간에 빈 공간이 생긴다.


이전의 파일 끝과 새로 쓴 바이트들 사이의 이 공간을 파일 구멍(file hole)이라고 한다.


프로그래밍 관점에서 보면 파일 구멍 속에서도 바이트들이 존재하고, 읽을 시 0으로 채워진 바이트들의 버퍼를 리턴한다.


하지만 파일 구멍은 디스크 공간을 차지하지 않고 파일 시스템은 나중에 파일 구멍에 데이터가 쓰여질 때 디스크 블록을 할당한다.


여기서, 디스크 공간 할당에 대해서 블록 할당의 개념을 잘 알아둬야 한다.


대부분의 파일 시스템이 파일 공간을 블록 단위 (1K / 2K / 4K 등)로 할당하기 때문에


파일 구멍이 블록 경계에 걸치지 않고 블록 안에 들어간다면, 구멍이 있든 없든 똑같이 블록 하나가 온전히 할당되며


구멍에 해당되는 부분이 널로 채워질 뿐이다.


아무튼, File hole이 존재할 수 있기 때문에, 파일의 명목상 크기와 실제 사용하는 디스크 저장소 크기보다 더 클 수 있다.


따라서, 파일 구멍 중간에 바이트들을 작성하면 파일의 크기는 변하지 않는데 디스크 할당량은 늘어날 수 있다. (빈 공간이 줄어들 수 있다.)


이는 다시 말해 write 작업으로 파일 크기가 변하지 않아도 디스크 공간 부족으로 실패 하는 일이 있을 수 있는 것이다.


이와 관련해서 SUSv3에서는 디스크 공간 할당이 보장되는 함수 posix_fallocate를 정의하고 있다.