[linux] 리눅스에서 버퍼와 캐시 메모리의 차이점은 무엇입니까?

나에게 두 개의 리눅스 메모리 개념의 차이 무엇 분명하지 않다 : buffercache. 이 게시물을 읽었 으며 그들 사이의 차이점은 만료 정책 인 것 같습니다.

  1. 버퍼 정책은 선입 선출입니다
  2. 캐시 정책은 가장 최근에 사용한 것입니다.

내가 맞아?

특히, 나는 두 명령에서 찾고 : freevmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859



답변

“버퍼”는 캐시 디스크 블록 전용 RAM의 양을 나타냅니다. “캐시 됨”은 “버퍼”와 유사하지만 이번에는 파일 읽기에서 페이지를 캐시합니다.

인용 :


답변

버퍼는 특정 블록 장치와 관련이 있으며 파일 시스템 메타 데이터의 캐싱과 기내 페이지 추적을 포함합니다. 캐시에는 파킹 된 파일 데이터 만 포함됩니다. 즉, 버퍼는 디렉토리의 내용, 파일 사용 권한을 기억하고 특정 블록 장치에 대해 쓰거나 읽은 메모리를 추적합니다. 캐시에는 파일 자체의 내용 만 포함됩니다.

인용 링크


답변

인용 된 답변 (참조 용) :

짧은 대답 : 캐시는 페이지 캐시의 크기입니다. 버퍼는 메모리 내 블록 I / O 버퍼의 크기입니다. 캐시 된 사항; 버퍼는 크게 관련이 없습니다.

긴 답변 : 캐시 됨은 스왑 캐시의 메모리를 뺀 Linux 페이지 캐시의 크기이며 SwapCached로 표시됩니다 (따라서 전체 페이지 캐시 크기는 캐시 된 + 스왑 캐시 됨). Linux는 페이지 캐시를 통해 모든 파일 I / O를 수행합니다. 쓰기는 단순히 페이지 캐시에서 해당 페이지를 더티로 표시하는 것으로 구현됩니다. 그런 다음 플러 셔 스레드는 정기적으로 더티 페이지를 디스크에 다시 기록합니다. 읽기는 페이지 캐시에서 데이터를 반환하여 구현됩니다. 데이터가 아직 캐시에 없으면 먼저 채워집니다. 최신 Linux 시스템에서 캐시는 쉽게 몇 기가 바이트가 될 수 있습니다. 메모리 압력에 따라 축소됩니다. 시스템은 필요에 따라 더 많은 메모리를 사용할 수 있도록 데이터를 디스크로 스왑 아웃하면서 페이지 캐시를 제거합니다.

버퍼는 메모리 내 블록 I / O 버퍼입니다. 상대적으로 수명이 짧습니다. Linux 커널 버전 2.4 이전에는 Linux에 별도의 페이지 및 버퍼 캐시가있었습니다. 2.4 이후로, 페이지 및 버퍼 캐시는 통합되고 버퍼는 페이지 캐시에 표시되지 않은 원시 디스크 블록 (파일 데이터가 아님)입니다. 따라서 버퍼 메트릭은 매우 중요합니다. 대부분의 시스템에서 버퍼는 종종 수십 메가 바이트에 불과합니다.


답변

이처럼 간단하지는 않지만 이해하는 데 도움이 될 수 있습니다.

버퍼는 파일 메타 데이터 (권한, 위치 등)를 저장하기위한 것입니다. 모든 메모리 페이지는 여기에서 추적됩니다.

캐시는 실제 파일 내용을 저장하기위한 것입니다.


답변

RedHat에 의해 설명 :

캐시 페이지 :

캐시는 메모리의 일부로서 데이터를 투명하게 저장하여 향후 해당 데이터에 대한 요청을 더 빨리 처리 할 수 ​​있습니다. 이 메모리는 커널에서 디스크 데이터를 캐시하고 i / o 성능을 향상시키는 데 사용됩니다.

Linux 커널은 로컬 및 원격 파일 시스템 및 디스크에서 정보를 캐시하기 위해 가능한 한 많은 RAM을 사용할 수 있도록 구축되었습니다. 시간이 시스템에서 다양한 읽기 및 쓰기가 수행됨에 따라 커널은 시스템에서 실행중인 다양한 프로세스 또는 가까운 미래에 사용될 관련 프로세스의 데이터를 위해 메모리에 저장된 데이터를 유지하려고합니다. 프로세스가 중지 / 종료 될 때 캐시는 회수되지 않지만, 다른 프로세스에 사용 가능한 메모리보다 많은 메모리가 필요한 경우 커널은 캐시 데이터를 저장하고 해당 메모리를 새 프로세스에 할당하여 메모리를 회수하기 위해 휴리스틱을 실행합니다.

모든 종류의 파일 / 데이터가 요청되면 커널은 사용자가 작업중인 파일의 일부 복사본을 찾고, 그러한 복사본이 존재하지 않으면 캐시 메모리의 새 페이지를 하나 할당하여 채 웁니다. 디스크에서 적절한 내용을 읽습니다.

캐시에 저장된 데이터는 이전에 계산 된 값이거나 디스크의 다른 곳에 저장된 원래 값의 복제본 일 수 있습니다. 일부 데이터가 요청되면 캐시에 먼저 해당 데이터가 포함되어 있는지 확인합니다. 데이터는 소스 출처보다 캐시에서 더 빨리 검색 할 수 있습니다.

SysV 공유 메모리 세그먼트는 디스크의 데이터를 나타내지 않지만 캐시로 간주됩니다. ipcs -m 명령을 사용하고 bytes 열을 확인하여 공유 메모리 세그먼트의 크기를 확인할 수 있습니다.

버퍼 :

버퍼는 페이지 캐시에 저장된 데이터의 디스크 블록 표현입니다. 버퍼에는 페이지 캐시에있는 파일 / 데이터의 메타 데이터가 포함됩니다. 예 : 페이지 캐시에있는 데이터 요청이있는 경우 먼저 커널은 페이지 캐시에 포함 된 실제 파일 / 데이터를 가리키는 메타 데이터를 포함하는 버퍼의 데이터를 확인합니다. 메타 데이터에서 파일의 실제 블록 주소가 알려지면 처리를 위해 커널에 의해 선택됩니다.


답변

버퍼 및 캐시.

버퍼는 아직 디스크에 “쓰기”되지 않은 것입니다.

캐시는 디스크에서 “읽고”나중에 사용하기 위해 저장 한 것입니다.


답변

이 페이지는 버퍼와 캐시의 차이점을 깊이 이해하는 데 도움이 될 것이라고 생각합니다. http://www.tldp.org/LDP/sag/html/buffer-cache.html

디스크에서 읽는 것은 (실제) 메모리에 액세스하는 것에 비해 매우 느립니다. 또한 비교적 짧은 시간 동안 디스크의 동일한 부분을 여러 번 읽는 것이 일반적입니다. 예를 들어, 먼저 전자 메일 메시지를 읽은 다음 회신 할 때 편지를 편집기로 읽은 다음 메일 프로그램을 폴더에 복사 할 때 다시 읽도록 할 수 있습니다. 또는 ls많은 사용자가있는 시스템 에서 명령 이 얼마나 자주 실행될 수 있는지 고려하십시오 . 디스크에서 정보를 한 번만 읽은 다음 더 이상 필요하지 않을 때까지 메모리에 보관하면 첫 번째 읽기를 제외한 모든 속도를 높일 수 있습니다. 이를 디스크 버퍼링이라고하며, 목적에 사용되는 메모리를 버퍼 캐시라고합니다.

불행히도 메모리는 유한하고 부족한 희소 한 리소스이기 때문에 버퍼 캐시는 일반적으로 충분히 클 수 없습니다 (사용하려는 모든 데이터를 보유 할 수는 없음). 캐시가 가득 차면 가장 오랫동안 사용하지 않은 데이터는 삭제되고 사용 가능한 메모리가 새 데이터에 사용됩니다.

디스크 버퍼링은 쓰기에도 작동합니다. 한편으로, 기록 된 데이터는 종종 곧 다시 읽히고 (예를 들어, 소스 코드 파일이 파일에 저장된 후 컴파일러에 의해 읽혀 짐), 캐시에 기록 된 데이터를 넣는 것이 좋습니다. 반면, 데이터를 캐시에 넣고 디스크에 한 번에 쓰지 않고 쓰면 프로그램이 더 빨리 실행됩니다. 그런 다음 다른 프로그램의 속도를 늦추지 않고 백그라운드에서 쓰기를 수행 할 수 있습니다.