버퍼는 속도에 차이가 있는 두 장치 사이에서 그 차이를 완화하는 역할을 한다. 일정량의 데이터를 모아 옮김으로써 적은 노력으로도 많은 양의 데이터를 옮길 수 있으므로 속도의 차이를 완화하는 장치라고 볼 수 있다.
ex) 동영상 스트리밍, 모니터 버퍼('\n')
스풀은 CPU와 I/O 장치가 독립적으로 동작하도록 고안된 소프트웨어적인 버퍼이다.
메모리와 CPU 간의 속도 차이를 완화하기 위해 메모리의 데이터를 미리 가져와 저장해두는 임시 장소이다. CPU가 앞으로 사용할 것으로 예상되는 데이터를 미리 가져다 놓는다. 이런 작업을 Prefetch라고 한다. 캐시는 CPU 내부에 있으며 내부 버스의 속도로 작동한다. 반면, 메모리는 시스템 버스 속도로 작동하므로 느리다. 따라서 캐시는 빠른 CPU와 느린 메모리 사이에서 두 장치의 속도 차이를 완화해준다.
CPU는 메모리에 접근할 때 캐시를 먼저 방문해 원하는 데이터가 있는지 찾는다. 이 때 캐시에 원하는 데이터가 존재하여 찾았다면 cache hit라고 하며, 데이터가 캐시에 없다면 메모리로 가서 찾게 되는데 이 것을 cache miss라고 한다. cache hit가 되는 비율을 cache hit ratio라고 한다.
캐시 적중률을 높이는 방법 중 하나로, 현재 위치에 가까운 데이터가 멀리 있는 데이터보다 사용될 확률이 더 높다는 이론이다.
- 공간 지역성 : 특성 클러스터의 기억 장소들에 대해 참조가 집중적으로 이루어지는 경향으로, 참조된 메모리 근처의 메모리를 참조
- 시간 지역성 : 최근 사용되었던 기억 장소들이 집중적으로 액세스되는 경향
메모리에 있는 데이터를 가져온 캐시에 있는 데이터가 변경될 때, 메모리에 있는 원래 데이터를 변경해야 하는 문제가 있다. 따라서 캐시의 변경된 데이터를 메모리에 반영할 때 즉시 쓰기 방식과 지연 쓰기 방식이 있다.
- 즉시 쓰기 방식 : 캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 방식이다. 메모리와의 빈번한 데이터 전송으로 인해 성능 저하가 발생하지만, 메모리의 데이터가 항상 최신 값으로 유지되므로 급작스런 정전에도 데이터 유실이 발생하지 않는다.
- 지연 쓰기 방식 : 캐시에 있는 데이터가 변경되면 변경된 내용을 모아 주기적으로 반영하는 방식이다. 메모리와의 데이터 전송 횟수가 줄어들어 시스템 성능이 향상되지만, 메모리와 캐시된 데이터 간의 불일치가 발생할 수 있다.