파일을 덮어쓰면 이전 공간이 해제되나요?

파일을 덮어쓰면 이전 공간이 해제되나요?

foo.txt크기 가 바이트인 파일이 있다고 가정합니다 500. 바이트 크기의 새 파일을 생성 10하고 이를 로 저장하여 foo.txt파일을 덮어쓴다고 가정합니다. OS(Windows 및 Linux)는 더 이상 사용되지 않는 공간( 410바이트)이 해제되도록 자동으로 확인합니까?

두 번째 시나리오에서는dd 유틸리티위에서 설명한 대로 이전 foo.txt와 새 foo.txt를 모두 생성합니다. OS가 더 이상 사용되지 않는 공간을 자동으로 확보합니까?

뒤에서는 파일에 대한 모든 쓰기가 동일한 OS 시스템 호출을 사용하므로 덮어쓰기 처리가 프로그램 전체에서 일관되게 이루어질 것이라고 상상합니다.

답변1

귀하의 질문은 프로세스를 여러 가지와 관련된 것으로 보는 것에서 비롯된 것 같습니다. 사용되지 않은 모든 공간을 다른 용도로 사용할 수 있으며 기존 파일과 동일한 이름의 파일을 작성하는 것이 동일한 위치에 작성됩니다. 이 두 전제는 모두 정확하지 않습니다. 그리고 더 이상 사용하지 않는 공간을 해제한다는 얘기도 나오네요. 작동 방식에 따르면 이러한 용어는 일종의 동의어입니다. 공간은 파일에 할당되거나 할당되지 않습니다.

davidgo가 설명했듯이 드라이브는 전체 섹터 또는 블록에서 작동합니다. 간단하게 설명하기 위해 공간 할당 단위를 "블록"이라고 부르겠습니다. 공간은 전체 블록 단위로 할당됩니다. 1바이트 파일에는 전체 블록이 할당되므로 작은 파일에 대해 논의하는 경우 크기가 한 블록 미만인 파일은 여전히 ​​전체 블록에 할당됩니다. 작은(하위 블록) 파일에는 블록에 다른 목적으로 액세스할 수 없는 사용되지 않은 공간이 있습니다. 여러 블록을 사용하는 큰 파일이 더 적은 수의 블록을 사용하는 작은 파일로 대체된다고 말할 수 있습니다. 이 경우 더 이상 필요하지 않은 전체 블록이 있습니다.

이전 파일은 실제로 덮어쓰여지지 않습니다. 새 파일은 필요한 만큼의 블록을 사용하여 다른 위치에 저장됩니다. 이전 파일 블록에 대한 파일 시스템 파일 테이블의 참조가 수정됩니다. 해당 블록은 모든 파일에 할당 해제되어 재사용이 가능해집니다. 이전 파일의 내용은 이 프로세스의 일부로 삭제되지 않으며 공간이 필요할 때까지 무시됩니다. 그렇기 때문에 삭제된 파일을 복구할 수 있습니다.

dd를 사용하면 이것이 달라지는지 물으셨습니다. dd는 다양한 방법으로 사용될 수 있습니다. 동일한 이름을 사용하여 새 파일을 작성하는 것만으로 토론을 제한하면 동일한 방식으로 작동합니다.

답변2

@KamilMaciorowski가 말했듯이 질문의 핵심 구성 요소는 디스크의 블록 크기입니다. 블록 크기가 512바이트 미만인 최신 파일 시스템을 찾는 것은 거의 불가능합니다(대부분 블록 크기가 훨씬 더 큽니다). 이는 블록 크기보다 작은 파일 작업을 처리하는 경우 해당 작업이 블록 크기만큼 많은 리소스를 사용한다는 의미이므로 관련이 있습니다.따라서 귀하의 질문에 대한 대답은 '아니요'입니다. 400바이트 파일은 1블록을 사용하고 1블록을 사용하는 다른 파일로 대체됩니다. 원래 블록은 해제될 가능성이 높지만(덮어쓸 수 있음) 디스크 공간을 절약하지 않았습니다.

나는 당신이 이것을 알고 있다고 생각하지만 다른 사람들을 위해 - 블록이 해제될 때 일반적으로 덮어쓰거나 비워지지 않으며 종종 복구될 수 있다는 점도 주목할 가치가 있습니다. 따라서 SSD에서는 OS가 보는 것에서 디스크에 있는 것을 더욱 추상화하는 것이 두 배로 사실입니다(웨어 레벨링 덕분에).

관련 정보