시뻘건 개발 도전기

#4 OS 캐시 본문

Reading/대규모 서비스를 지탱하는 기술

#4 OS 캐시

시뻘건볼때기 2022. 5. 6. 23:56
반응형

데이터를 보다 효율적으로 처리하기 위한 많은 방법이 있지만 그 중에서 OS 캐시를 살펴보려한다. OS캐시는 어떻게 동작하며 만약 제대로 처리되지 않았을 때 분산에 대해서 어떻게 고려해야하는지 알아본다.

 

OS는 메모리를 이용해서 디스크 액세스를 줄이는데, 그 원리가 OS 캐시다. 리눅스의 경우에는 페이지 캐시나 파일 캐시, 버퍼 캐시라고 하는 캐시 구조를 가지고 있다.

[그림 1] 페이징 구조

 

OS는 가상 메모리 구조를 가지고 있으며 이는 흔히 말하는 '스왑'과 다른 말이다. 스왑은 물리 메모리가 부족할 때 2차 기억장치를 메모리로 간주해서 외형상의 메모리 부족을 해소하는 원리를 말한다. 가상 메모리 구조를 기반으로하는 페이징 구조는 논리 어드레스를 물리 어드레스로 변환한다.

 

[그림 2] 가상 메모리 구조

물리적인 하드웨어를 OS에서 추상화하기 위해서 '가상 메오리 구조'를 필요로한다.

[그림 2]와 함께 보았을 때, 메모리는 0x00002123이라는 주소를 가지고 있다. 이 메모리는 OS로부터 관리되며 비어있는 곳을 반환할 때 0x00002123 이외의 다른 어드레스를 반환하도록 되어 있다.

더보기

프로세스는 메모리의 어느 부분을 사용하고 있는지 알 필요가 없다. 반드시 메모리는 특정 번지부터 시작한다고 정해져 있는 편이 프로세스에게는 다루기 쉽다.

한 마디로 간단하게 이야기하면 OS는 메모리를 직접 프로세스에게 넘기는 것이 아니라 커널 내에서 메모리를 추상화 한다는 것이다.

OS가 메모리를 확인하여 확보할 때 1바이트씩 액세스하는 것이 아니라, 적당하게(?) 4KB 정도의 블록(필요한 만큼의 블록)을 확보해서 프로세스에게 넘긴다. 여기서 이 4KB의 블록을 '페이지'라고 한다.

 

[그림 3] 페이지 캐시

 

OS는 확보한 페이지를 메모리상에 계속 확보해두는 기능을 갖고 있다.

 

1. OS는 우선 디스크로부터 4KB 블록(페이지)를 읽는다. - read

2. 읽은 페이지는 메모리에 쓴다. (프로세스는 디스크에 접근 불가이기 때문에) - write

3. 메모리 주소를 프로세스에게 알려준다. (가상 어드레스)

4. 프로세스가 해당 메모리에 접근한다.

5. 만약 메모리 여유분이 없다면 LRU, 가장 오래된 것을 해제하고 새로운 곳을 쓴다.

 

혹여나 다른 프로세스가 같은 메모리에 접근할 때는 디스크에서 다시 읽어오지 않는다. 왜냐하면 이전에 메모리에 쓴 페이지가(메모리) 해제되지 않기 때문이다. 디스크를 다시 읽지 않아도 되므로 시간적으로나 I/O 발생으로나 ㄱㅇㄷ이다.

이 부분에서 가장 중요한 내용이다.

커널이 한 번 할당한 메모리를 해제하지 않고 계속 남겨두는 것이 페이지 캐시의 기본이다.
더보기

이 말은 즉.... 우리는 컴퓨터를 매일 재부팅하고있는데, 계속 살려두면 캐시로 인해 컴퓨터가 빨라진다는 것!!!

재부팅을 하게되면 또 다시 I/O가 발생하기 쉬우므로 PC가 버벅거릴 수 있다.

 

디스크의 캐시는 페이지 캐시로부터 제공되지만, 실제로 디바이스 드라이버와 OS 사이에는 파일시스템이 끼어있다. 리눅스를 써봤다면 어디선가 봤을 수도 있겠지만 ext2, ext3, ext4, xfs 등 파일 시스템이 있는데 그 구조는 [그림 4]와 같다.(현업에서 메모리가 가득 차서 로그 파일을 백업하는 등 작업으로 파일 시스템을 살짝 살펴보았던 기억이 난다.)

[그림 4] VFS

가상 파일시스템(난 븨프스라고 읽는데 다른 종사자 분들은 어떻게 읽으시는가 궁금...ㅋㅋ)이라고 하는 추상화 레이어가 있는데, 다양한 함수를 가지고 있는 파일시스템의 인터페이스를 통일시키는 역할을 한다. 심지오 VFS도 페이지 캐시의 구조를 가지고 있다.

VFS의 역할은 파일시스템 구현의 추상화와 성능에 관련된 페이지 캐시 부분이다.
반응형
Comments