Swap 메모리를 알아보기 위해 메모리를 확인하는 과정을 진행 중, buff/cache를 자세히 정리해야겠다고 생각함

위 이미지에서,
used 는 사용중인 메모리의 크기를 말하는데 (전체메모리-free/buff/cache메모리)
available 은 사용가능한 메모리의 크기가 아닌 swapping 없이 새 응용 프로그램을 사용할 수 있는 메모리의 크기

Buffer와 Cache란?

디스크에서 데이터를 가져오는 것은 매우 느리기 때문에 시스템 부하를 발생 시킬 수 있습니다. 이런 과정을 빠르게 하기 위해 디스크에서 한번 가져온 내용을 메모리의 캐싱영역에 저장해 사용합니다. 한번 가져온 내용은 캐싱영역에 저장되어있기 때문에 디스크보다 더 빠르게 가져와 사용할 수 있습니다. 이때 사용되는 메모리의 캐싱영역을 Buffer/Cache 라고 부릅니다.


메모리의 캐싱영역은 Buffer와 Cache로 나뉘는데,

Buffer 는 데이터에 대한 정보와 같은 '메타데이터(파일의 정보)'를 저장합니다. Buffer는 보통 속도 향상을 위한 것이 아니라, 빠른쪽에서 데이터가 느린쪽으로 보내질때 데이터의 손실을 막기 위해서 쓰입니다. 즉, 데이터의 처리속도나 처리단위, 데이터 사용시간이 서로 다른 두 장치나 프로그램 사이에서 데이터를 주고받기 위한 목적으로 사용되는 임시 기억장소 입니다. 서버과 클라이언트의 속도차 때문에 서버가 버퍼에 내용을 저정해 놓으면 클라이언트는 버퍼의 내용을 가져간다. 다 사용되면 버퍼 내용은 삭제됩니다.

Example

예를 들자면 키보드를 들 수가 있습니다. 터미널 상태의 통신을 할때를 생각해 봅시다.
만약 게시판에서 키보드로 '엔터'키를 눌러 다음 페이지로 넘기면, 바로 다음 페이지로 넘어가지 못하고 1,2초 늦게 화면이 넘어갑니다.
만약 계속 엔터키를 누르고 있다가 손을 떼면, 손을 놨는데도 엔터키가 눌러지면서 한참을 페이지가 넘어갑니다.
이것은 모뎀과 서비스 업체의 화면 처리 속도가 키보드 보다 느리기 때문에 키보드 버퍼가 작동한 것입니다.
만약 화면이 처리된 후에만 키보드 데이터를 받아 들이면, 키보드 타이핑 도중에 글자를 잃어버릴 위험이 있습니다.
"1234567890"을 빨리 치면 처리를 못해서 "12367890"이 쳐질 수도 있다는 것이죠.
그런것을 막기 위해서 키보드는 사용자가 치는 키를 차례차례 받아 두었다가 처리가 되는 데로 계속 내보내는 것입니다.

Cache 는 (Page Cache + slab)으로 이루어지는데, 여기서 Page Cache는 한번 읽어온 '파일의 내용'을 저장하고, Slab은 커널 내부에서 사용하는 메모리/캐시 입니다. 한번 저장한 내용을 지우지 않고 그대로 가지고 있습니다. 빠른 처리속도를 가진 기기에게는 미리 데이터를 준비해줌으로서 최대한의 효율을 내도록 하고, 느린 처리속도를 가진 기기에게는 처리할 데이터를 대신 받아줌으로서 다른 기기가 기다리는 일이 적어지도록 하는 것 입니다.

Example

예를 들면, 메모리의 속도가 100이고, 하드디스크의 속도를 1이라고 가정 한다고 했을 때,
이 때 갑자기 어떤 데이터(용량이 50)를 메모리가 하드디스크에서 읽어 오려고 할 경우 속도가 1인 하드디스크가 50인 용량을 읽기 위해서는 시간이 50 걸립니다.
그런데 50인 용량을 메모리가 받을때는 0.5라는 시간이 걸립니다.
결국 메모리는 하드디스크가 정보를 다 읽을때까지 모두 49.5라는 시간을 아무일도 못하고 놀게 됩니다.
그것을 막기 위해서 캐시라는 장치가 생겼습니다.
만약 메모리의 특정영역을 캐시로 정하고 위의 경우에서 읽어올 데이터 50중에 30을 미리 읽어 왔다면, 30은 미리 메모리에 있으니, 20만 더 읽어 오면 됩니다.
그래서 하드디스크는 20의 시간이 걸리고, 메모리는 19.5라는 시간만 놀게 됩니다. 결국 하드디스크가 2.5배나 빨라진 셈입니다.

profile
열심히 굽고 있어요🍞

1개의 댓글

comment-user-thumbnail
2022년 9월 20일

캐시는 보통 데이터를 빠르게 읽어오기 위해, 버퍼는 데이터 손실을 막기 위해 사용

답글 달기