UNIX에서 파일을 쓰는 것보다 파일을 읽는 것이 더 빠릅니까?

UNIX에서 파일을 쓰는 것보다 파일을 읽는 것이 더 빠릅니까?

다소 느린 성능 병목 현상은 이 매우 작은 쿼리로 인해 발생합니다. 실증적인 분석을 해보니 디스크 캐시 정책에 영향을 받지 않을까 싶습니다. 기본적으로(디스크 캐싱이 비활성화된 경우) 파일 쓰기는 파일 읽기보다 빠르나요, 느리거나 빠르나요? 대답은 조각화(및 파일 크기)에 따라 다르다고 가정하지만 파일에 쓰는 작업은 포인터를 따라가는 대신 다음 사용 가능한 블록의 위치를 ​​추가로 찾아야 합니다.

답변1

때에 따라 다르지. 이 질문에 대한 보편적인 대답은 없습니다.

캐싱이 없으면 일반적으로 디스크 파일에 쓰는 것이 읽는 것보다 훨씬 느립니다. 이는 운영 체제보다는 하드웨어와 더 관련이 있습니다. 즉, 하드 드라이브와 솔리드 스테이트 미디어 모두 쓰기보다 읽을 수 있는 속도가 더 빠릅니다. 두 번째 요소는 파일 시스템 구조와 관련이 있습니다. 읽기만 하려면 디렉터리 트리와 블록 목록을 데이터까지 순회한 다음 데이터를 읽어야 하지만, 쓰기에는 동일한 순회를 수행한 다음 데이터를 쓴 다음 일부 메타데이터를 업데이트해야 합니다. .

캐싱이 시작되면 상황이 달라집니다. 캐시에서 데이터를 읽는 속도는 매우 빠르지만, 캐시에 없는 데이터를 읽으려면 디스크에서 가져와야 합니다. 운영 체제는 읽기 예측을 시도할 수 있지만 이는 매우 특정한 경우(주로 파일에서 순차적 읽기)에만 작동합니다. 반면, 데이터 볼륨이 너무 크지 않으면 데이터가 메모리 버퍼에만 기록되기 때문에 쓰기가 거의 즉각적으로 이루어질 수 있습니다. 버퍼는 결국 디스크에 기록되어야 하지만 그때쯤이면 애플리케이션이 이미 더 많은 작업을 수행하기 시작했습니다.

답변2

글쓰기는 더 빨라져야 합니다.

사용 가능한 블록 목록은 메모리에 보관되므로 다음 사용 가능한 블록을 찾는 것이 매우 빠릅니다. 동기 모드로 작성하지 않는 한, 무언가를 작성하려고 하면 데이터를 커널 버퍼에 복사하고 쓰기를 대기열에 추가하므로 I/O가 완료될 때까지 기다릴 필요가 없습니다.

반면, 읽기는 데이터가 도착할 때까지 호출자가 어떤 작업도 수행할 수 없기 때문에 I/O가 완료될 때까지 기다려야 합니다.

관련 정보