이미 존재하는 파일이 있다고 가정하면 (예 : <File>
) 이 파일은 업데이트 용 C 프로그램 (r+b
)에 의해 열렸습니다. fseek
을 사용하여 <File>
안의 한 지점으로 이동합니다 (끝 부분 제외). 이제 fwrite/fputc
을 사용하여 데이터 쓰기를 시작합니다. 이전에 존재하던 데이터는 삭제하지 않습니다. <File>
...fwite/putc는 어떻게 디스크에 기록합니까?
시스템에서 이러한 쓰기를 어떻게 처리합니까? 디스크의 다른 위치에 전체 파일을 다시 쓰면 새 데이터가 포함됩니까? 그것은 파일을 조각 내고 또 다른 위치에 새로운 데이터를 쓰는 것입니까 (중간에 약간의 여유 공간이 있음을 기억하십시오)? 실제로 은 변경된 부분 만 덮어 쓰시겠습니까?
묻는 좋은 이유가 있습니다. 첫 번째 경우에는 파일을 계속 업데이트하면 시스템이 느려질 수 있습니다. 두 번째 경우에는 더 빠를 수 있지만 많은 파일을 완료하면 파일 시스템이 엉망이됩니다. 세 번째 경우, 특히 솔리드 스테이트 디스크를 사용하는 경우 파일의 동일한 지점을 계속 업데이트하면 디스크의 해당 부분이 쓸모 없게 렌더링 될 수 있습니다.
사실 내 질문의 출처입니다. 나는 디스크 섹터를 과용으로부터 절약하기 위해 솔리드 스테이트 디스크가 다른 기술을 사용하여 덜 사용 된 섹터로 데이터를 이동시키는 것을 읽었습니다. 그러나 정확히 같은 상황을 처리하는 방법은 stdio
입니까?
미리 감사드립니다. : D
stdio와 같은 표준 라이브러리는 디스크 섹터를 신경 쓰지 않습니다. 그것이 바로 운전자입니다.또한 표준 라이브러리는 요청을 운영 체제로 라우팅하기 때문에 액세스 권한을 확인한 다음 (필요한 경우) 요청을 드라이버에 전달하기 때문에 디스크에 쓰는 것보다 더 많은 작업이 필요합니다. stdio는 가능한 멀리 디스크에서 멀리 떨어져 있습니다. stdio는 데이터가 디스크에 전혀 쓰여지는지조차 알지 못합니다. 디스크, 네트워크 또는 일부 RAM이 될 수있는 표준화 된 스트림에 쓰기 만합니다. 그것은 또한 쓰레기통 (일명/dev/null) 일 수도 있습니다 :) – Devolus
또한, fragementation은 많이 삭제하고 쓸 때 발생합니다. 이 경우 파일이 디스크 전체에 "산산조각"을 가져올 수 있으므로 드라이버가 더 많은 섹터를 읽을 때까지 기다려야하므로 액세스 속도가 느려집니다. 파일이 연속 블록으로 기록되면 드라이버는 디스크의 스핀 (회전하는 경우)이 특정 파일에 액세스하도록 최적화되어있는 것처럼 처리 할 수 있습니다. – Devolus
감사! 이것은 도움이되었다! : D 그런데 드라이브에 직접 액세스 할 수 있다는 것을 아는 방법이 있습니까 (어셈블리에서 운영 체제를 작성하는 것 외에는)? – someone