2013-08-08 5 views
2

이미 존재하는 파일이 있다고 가정하면 (예 : <File>) 이 파일은 업데이트 용 C 프로그램 (r+b)에 의해 열렸습니다. fseek을 사용하여 <File> 안의 한 지점으로 이동합니다 (끝 부분 제외). 이제 fwrite/fputc을 사용하여 데이터 쓰기를 시작합니다. 이전에 존재하던 데이터는 삭제하지 않습니다. <File> ...fwite/putc는 어떻게 디스크에 기록합니까?

시스템에서 이러한 쓰기를 어떻게 처리합니까? 디스크의 다른 위치에 전체 파일을 다시 쓰면 새 데이터가 포함됩니까? 그것은 파일을 조각 내고 또 다른 위치에 새로운 데이터를 쓰는 것입니까 (중간에 약간의 여유 공간이 있음을 기억하십시오)? 실제로 은 변경된 부분 만 덮어 쓰시겠습니까?

묻는 좋은 이유가 있습니다. 첫 번째 경우에는 파일을 계속 업데이트하면 시스템이 느려질 수 있습니다. 두 번째 경우에는 더 빠를 수 있지만 많은 파일을 완료하면 파일 시스템이 엉망이됩니다. 세 번째 경우, 특히 솔리드 스테이트 디스크를 사용하는 경우 파일의 동일한 지점을 계속 업데이트하면 디스크의 해당 부분이 쓸모 없게 렌더링 될 수 있습니다.

사실 내 질문의 출처입니다. 나는 디스크 섹터를 과용으로부터 절약하기 위해 솔리드 스테이트 디스크가 다른 기술을 사용하여 덜 사용 된 섹터로 데이터를 이동시키는 것을 읽었습니다. 그러나 정확히 같은 상황을 처리하는 방법은 stdio입니까?

미리 감사드립니다. : D

+1

stdio와 같은 표준 라이브러리는 디스크 섹터를 신경 쓰지 않습니다. 그것이 바로 운전자입니다.또한 표준 라이브러리는 요청을 운영 체제로 라우팅하기 때문에 액세스 권한을 확인한 다음 (필요한 경우) 요청을 드라이버에 전달하기 때문에 디스크에 쓰는 것보다 더 많은 작업이 필요합니다. stdio는 가능한 멀리 디스크에서 멀리 떨어져 있습니다. stdio는 데이터가 디스크에 전혀 쓰여지는지조차 알지 못합니다. 디스크, 네트워크 또는 일부 RAM이 될 수있는 표준화 된 스트림에 쓰기 만합니다. 그것은 또한 쓰레기통 (일명/dev/null) 일 수도 있습니다 :) – Devolus

+1

또한, fragementation은 많이 삭제하고 쓸 때 발생합니다. 이 경우 파일이 디스크 전체에 "산산조각"을 가져올 수 있으므로 드라이버가 더 많은 섹터를 읽을 때까지 기다려야하므로 액세스 속도가 느려집니다. 파일이 연속 블록으로 기록되면 드라이버는 디스크의 스핀 (회전하는 경우)이 특정 파일에 액세스하도록 최적화되어있는 것처럼 처리 할 수 ​​있습니다. – Devolus

+0

감사! 이것은 도움이되었다! : D 그런데 드라이브에 직접 액세스 할 수 있다는 것을 아는 방법이 있습니까 (어셈블리에서 운영 체제를 작성하는 것 외에는)? – someone

답변

1

파일 시스템 처리기는 디스크의 섹터에 일종의 특수 쓰기를 생성하므로 파일의 내용을 업데이트 할 때 파일 시스템은 디스크의 사전을 조회합니다. 디스크에 파일 데이터가 있습니다. 그런 다음 디스크가 회전 (또는 디스크가 도착할 때까지 대기)하고 디스크의 해당 섹터를 업데이트합니다.

짧은 버전입니다.

따라서 파일을 업데이트하는 경우 파일은 일반적으로 새 장소로 이동되지 않습니다. 파일에 새 데이터를 쓰고 추가 할 때 데이터가 기존 섹터에 맞지 않으면 추가 섹터가 할당되고 데이터가 거기에 기록됩니다.

파일을 삭제하면 대개 섹터가 사용 가능으로 표시되어 재사용됩니다. 따라서 새 파일을 열고 다시 작성하는 경우에만 파일이 이전과 다른 섹터에 저장 될 수 있습니다.

하지만 세부 사항은 하드웨어에 따라 다를 수 있습니다. AFAIK CD의 데이터를 덮어 쓰면 세션이 완료되지 않는 한 데이터가 새로 작성됩니다 (CDA가 작성된 후 CD의 데이터를 업데이트 할 수 없기 때문에).

+0

이것은 이전 데이터를 덮어 쓰는 것을 의미합니까? SSD 드라이브에 대해서도 마찬가지입니까? – someone

+0

데이터를 쓰는 방법은 주로 파일 시스템 드라이버에 달려 있습니다. SSA에서 FAT를 사용하는 AFAIK는 같은 분야를 자주 덮어 쓰는 경향이 있기 때문에 그렇게 좋은 것은 아닙니다. 따라서 파일 시스템을 더 잘 배포하는 파일 시스템이 더 나은 선택이지만 확실하지는 않습니다. – Devolus

0

이해가 올바르지 않습니다 를 "우리가 이전 파일에 존재하는 모든 데이터를 삭제하지 않는 것이 참고"당신이 파일의 중앙으로 추구하고 그 있었다 어떤 이상 작성합니다 쓰기 시작하면

전에 위치.

이것은 하드 디스크의 컴퓨터가 어떻게 구현하는지에 따라 달라집니다. 그것은 하드 디스크 밖에서는 보이지 않아야하고 중요하지 않아야합니다.

+0

네, 그게 우리가하고 싶은 일입니다. 내 의견으로는, 우리는 단지 파일을 자르지 않고 모든 데이터를 지우는 (wb를 사용하여) 길이가 0 인 것을 언급하려고했다. – someone

+0

중요한 경우 : 데이터를 목적에 맞게 덮어 쓰고 싶을 때가 있습니다! : D – someone

+0

write() 메서드로 파일을 축소 할 수 없습니다. 기존 데이터 만 변경하거나 파일의 끝에 추가 할 수 있습니다. – Jay