안녕하세요, MJ 입니다.
리눅스 명령어 free 를 설명하다 보니 buffer 와 cache 에 대한 설명이 필요하게 되었는데, 내용이 짧지 않아 별도 포스트를 작성합니다.
우선 buffer 와 cache 는 I/O 성능 향상을 위한 메모리 영역입니다.
-
buffer/cache 의 필요성
블록 디바이스(하드디스크 등 디스크에 해당하는 저장 장치)에 있는 데이터를 읽거나, 새로운 데이터를 저장하는데, 이런 저장 장치는 다른 장치들(메모리,CPU-cache)에 비해 속도가 느립니다. I/O 가 일어날 때 마다 디스크에 접근하여 파일을 읽고 쓴다면 너무 오래 걸려서 다른 프로세스의 처리에 지장이 생길 수 있습니다. 이러한 문제를 해결하기 위해 캐시가 필요하게 됩니다.
-
캐시란
커널은 디스크를 빠르게 사용하고자 메모리의 일부를 디스크의 캐시로 사용합니다.
-
캐시의 동작
한번 읽은 파일의 내용을 캐시 영역에 저장한 뒤, 다시 해당 파일을 읽으려 시도할 때, 메모리 영역에 아까 저장 해 둔 내용을 바로 처리할 수 있게 하는 것 인데, 바로 이 메모리를 buffer, cache 라고 합니다.
-
buffer 와 cache의 차이
buffer 와 cache 의 차이에 대해 설명 하기 위해 부가적인 설명을 추가합니다.
[unix 파일시스템의 구조]
→ 유닉스의 파일시스템은 디렉토리와 파일을 찾기 쉽도록 유지 및 관리하는 시스템으로 4가지의 블록으로 구성되어있습니다.
- Boot block → 부팅에 필요한 정보를 담고 있습니다.
- Super block → 파일시스템의 어디부터가 i-node 블록인지, Data 블록인지 등의 정보를 담고 있습니다.
- i-node List → 파일 하나에 i-node 하나가 할당이 되는데 i-node 는 파일의 메타 데이터를 갖고 있습니다. 이 i-node 묶음으로 파일의 퍼미션, 소유자, 크기, inode 번호 등의 정보를 갖고있습니다.
- Data block 데이터가 저장되는 영역으로 각 데이터 블록은 한번에 하나의 파일만 할당이 될 수 있습니다.
buffer 와 cache 의 차이를 설명하기에 앞서,
buffer 는 buffer cache,
cache 는 page cache 로
용어를 정정하고 차이점을 설명 드립니다.buffer cache 는 Super Block 과 i-node list 에 해당하는 메타 데이터를 저장합니다. 디렉토리를 읽고자 하는 경우에는 디렉토리에 포함되어있는 파일들의 i-node block 들을 buffer cache 에 저장하고, 다음에 다시 그 파일에 접근하게 되면 buffer cache 에 존재하는 값을 가져다가 바로 보여주게 됩니다. 파일로의 접근을 빠르게 수행하기 위한 캐시라고 볼 수 있고,
page cache 는 한번 읽었던 파일의 내용을 저장하여 동일한 파일로 I/O 요청이 일어나면, 디스크로부터 다시 파일의 내용을 읽어 올 필요가 없이, page cache 에 저장 된 내용을 보여줄 수 있어 I/O 성능이 향상 될 수 있습니다.
→ buffer (buffer cache)는 파일을 빠르게 접근 하기 위한 캐시, cache (page cache)는 파일의 내용을 빠르게 확인 하기 위한 캐시 가 되겠습니다.
요청이 read 일때는 이렇습니다.
write 요청이 일어나게되면, page cache 로 데이터를 작성하게 됩니다.
아직 디스크에 저장하지 않은 이 데이터는 페이지 테이블이 수정 된 것이라는 의미로 dirty 플래그를 붙이게 되고, 이 플래그가 붙은 페이지를 dirty page 라고 부릅니다.
dirty page 는 커널의 백그라운드로 처리되어 쓰기 작업에서도 메모리를 활용하여 성능이 향상됩니다.읽어주신 분들이 이해가 잘 되셨으면 좋겠습니다.
문의사항은 댓글을 달아 주시면 성심껏 답변 드리겠습니다.
감사합니다.
댓글
댓글 쓰기