Memory 정보

System의 총 memory 양과 사용 중인 memory의 양은 free 명령어를 통해서 확인이 가능합니다. free 명령어는 system의 memory와 swap 공간의 상태를 보여주기 위해서 사용하는 명령어입니다.

Free 명령어의 memory field는 아래에 보이는 바와 같이 total, used, free, shared, buff/cache, avliable로 나뉘어져 있고, swap의 경우는 total, used, free로 구성됩니다.

memory의 total field 값은 dmidecode -t memory를 통한 값을 통해 확인 가능한 실제 memory의 양과 다릅니다. 이러한 차이는 Booting시에 BIOS에서 특정 하드웨어를 위해 memory를 예약하기 때문에 발생하는 것입니다. Free의 total값은은 이러한 예약된 값을 전체 memory에서 제외하고 보여주기 때문에 실제적인 memory의 양보다 적은 값이 책정됩니다.

Free 명령어의 다른 특이점은 free 값과 avaliable 필드의 값이 다르다는 점입니다. Man page를 확인해 보면, free는 말 그대로 사용되지 않는 memory를 의미하고, available은 swapping 없이 실행 가능한 application의 크기를 의미합니다.

Free 명령어를 strace -e open 명령어를 통해서 들여다 보면, cat /proc/meminfo에서 읽어들인 데이터를 parsing하여 보여주는 것을 확인할 수 있습니다. 추가로, memory의 통계 정보를 확인하는 것으로는 sar -r를 사용하기도 합니다.

Swap

Swap은 memory 용량이 가득 차서 사용 되지 않는 process의 데이터를 잠시 저장하기 위한 공간으로, disk의 특정 영역을 사용합니다. swap 공간에 있는 process의 page를 사용하기 위해서는 page를 memory에 올리는 작업이 필요한데, 이 때 disk에 접근 해야하기 때문에 상대적으로 시간이 오래걸리므로 system 성능을 저하시킬 수 있습니다.

memory의 available 부분이 0이 되기 전에 swap을 사용하기도 합니다. 이것은 Linux에서 swap의 사용 정도를 조절할 수 있는 vm.swappiness과 연관이 있습니다. vm.swappiness의 범위는 0~100이며, 0의 경우는 swap을 되도록 사용하지 않고, 100일 경우는 적극적으로 swap을 사용합니다. (참고 : https://brunch.co.kr/@alden/14) vm.swappiness의 현재 값은 sysctl -a | grep vm.swappiness를 통해서 확인이 가능하고, sysctl -w vm.swappiness=(value)로 값의 변경이 가능합니다.

Page

Paging이란 fragmentation 문제를 해결하기 위한 방법으로, VA를 page라는 단위로, PA를 frame이라는 단위로 나눠서 관리하는 기법입니다. 일반적으로 page와 frame size는 동일하며, getconf PAGETABLE을 이용해서 현재 OS의 page size를 확인할 수 있습니다. 일반적인 page size는 4KB입니다. Paging 기법을 사용할 시에 external fragmentation은 해소할 수  있지만, internal fragmentation을 해소할 수는 없습니다. internal fragmentation을 해결하는 방법으로는 단순히 page size를 줄이는 방법이 있을 수 있는데, 이것은 결국 page table의 entry 수를 증가시키므로, 다른 overhead를 발생합니다.

ARM64를 기준으로, page는 계층구조로 관리가 됩니다. 이렇게 관리가 되는 이유를 32bit arch를 기준으로 설명해 보겠습니다. 하나의 page가 212(4KB)일 때, page table의 entry 수는 220(∵32-12)가 되고, 각 entry는 32bit의 주소를 가리킬 수 있어야 하기 때문에 각각 4B여야 합니다. 따라서 32bit arch일 때 page table만 4MB가 됩니다. 2계층으로 관리를 할 시에는 접근 되지 않는 page table의 경우는 memory에 적재하지 않을 수 있기 때문에, memory 낭비를 줄일 수 있습니다. /arch/arm64/Kconfig를 확인해 보면 지원되는 page table level을 확인할 수 있다.

Address Translation

VA에서 PA로의 변환 과정은 MMU( Memory Management Unit)에서 일어난다는 설명을 많이 보았는데, 틀린말은 맞지만 정확한 것은 아닌 것 같습니다. MMU에서 address translation이 일어나려면 MMU의 TLB( Translation Lookaside Buffer )에서의 HIT가 일어났을 때에만 가능한 것이고, 그렇지 않을 경우에는 TTBR( Translate Table Base Register )에 있는 1계층 table의 주소 값의 접근을 시작으로 page table walk를 진행하여 PA로의 변환이 일어나기 때문입니다. ( 참고 : https://www.cs.rutgers.edu/~pxk/416/notes/10-paging.html )