하드 드라이브에서 데이터를 읽는 속도는 RAM에서 데이터를 읽는 속도와 매우 다르기 때문에 캐싱이 하드 드라이브에서 데이터를 읽는 속도를 높이는 데 사용된다는 것을 알고 있습니다. 따라서 캐시 미스 지수는 매우 중요합니다.
또한 하드 디스크나 키보드와 같은 다른 장치를 읽고 쓸 때 버퍼가 있다는 것을 알고 있습니다(예: Java에 있음) BufferedWriter
. BufferedReader
그런데 버퍼가 왜 필요한지 모르겠습니다. 버퍼가 없으면 어떻게 되나요? 버퍼는 읽기 속도도 높이기 위한 것입니까? 그렇다면 버퍼와 캐시의 차이점은 무엇입니까?
또한 캐싱이 읽기 속도를 높이는 것으로 알고 있는데, 캐싱을 통해 RAM에서 하드 드라이브로 데이터를 쓰는 속도가 빨라질 수 있나요?
답변1
내가 이해한 바에 따르면, 버퍼는 생산자와 소비자가 서로 다른 속도로 데이터를 최적으로 생성하거나 소비할 때 가장 유용합니다.
예를 들어, 프로그램은 한 번에 8바이트의 데이터를 파일에 쓸 수 있습니다. 디스크를 쓰는 경우 실제로 한 번에 4KiB의 데이터를 쓰는 것이 최적일 것입니다. 상당히 작은 블록의 경우 디스크 쓰기에 관련된 오버헤드가 디스크가 실제로 데이터를 쓰는 데 걸리는 시간보다 클 수 있습니다(따라서 512*T_8b >> T_4KiB). 따라서 4KiB의 데이터 청크를 수집하고 동시에 쓰는 사이에 버퍼를 설정하면 성능이 크게 향상됩니다. 예를 들어 다음을 참조하세요.dd는 왜 그렇게 오래 걸리나요?, 가장 간단한 해결책은 더 큰 버퍼 크기를 사용하는 것입니다. (물론 여기에 나와 있는 숫자는 순전히 예를 들어 설명한 것입니다. 최신 디스크의 실제 숫자는 상당히 다를 수 있습니다.)
캐싱은 버퍼링과 직교합니다. 캐싱과 버퍼링 모두 느린 소스(디스크, 네트워크 등)에 대한 불필요한 추가 액세스를 방지하기 위한 것입니다. 그러나 캐시는 재사용을 위해 결과를 저장하여 중복된 읽기 및 쓰기를 제거하는 방식으로 작동하는 반면, 버퍼는 결과를 함께 모아서 중복된 순차 읽기 및 쓰기를 제거하는 방식으로 작동합니다. 간단한 요점:
- 동일한 위치를 n번 읽으면 실제로 처음으로 디스크에 도달하고 나머지는 캐시에서 가져옵니다.
- 동일한 위치에 n번 쓰면 실제로는 마지막 시간만 기록됩니다.