1. pcp(per-cpu)
pcp는 각 cpu별로 가지고 있는 section으로 시스템 성능 향상을 위해 존재하는 일종의 캐시 공간이다.
시스템을 사용하는데 있어 자주 사용되는 1초에 수 천 수 만번의 access가 일어나는 작업의 경우 위와 같이 각 cpu별로 할당된 캐시공간을 이용함으로써 성능을 극대화 할 수 있다.
마찬가지로 메모리 할당/해제 관점에서 buddy시스템을 사용하는것 보다 pcp를 활용하면 더 좋은 성능을 제공할 수 있다. (물론 각 CPU내부에 각개할당하는 부분으로 CPU성능 상 적은 공간만 할당하는 현실적인 문제가 존재할 수 있음)
Linux에서는 가장 많이 사용되는 single 즉 buddy기준으로 order=0인 메모리 할당/해제 건에 한해서는 pcp영역을 사용해서 할당/해제 해줌으로써 성능을 보장하고자 한다.
pcp사용을 위해서는 보통 미리 CPU별로 맞춰 배열을 할당해주고 alloc/free시 해당 배열을 이용해서 할당된 page를 가져오는 방법으로 진행한다.
<pcp라고해서 buddy와 완전 독립적으로 운용되는 것이 아닌 배열에 free개수 등에 따라서 order=n의 buddy를 쪼개서 pcp를 채우거나 pcp의 남는 page를 합쳐서 buddy로 올리고 한다>
pcp의 구조를 보면 위와 같다 먼저 각 CPU별로 per-cpu section이 존재하고 각 section들은 결국 virtual address로 memory map을 통해서 연결된다.
.data..percpu 00013a58 0000000000000000 0000000001a5c000 00e00000 2**12 CONTENTS, ALLOC, LOAD, DATA |
할당과정을 코드로 확인하면 각 CPU별 per-cpu section영역에 대해서 offset, size값을 바탕으로 부팅 초반에 할당을 진행한다. 그리고 할당한 영역들은 배열상태로 관리하며 memory map을통해 virtual address로 연결된다.
이렇게 만들어진 CPU별 per-cpu section공간을 Unit이라고하고 각 CPU의 Unit들을 모은 단위를 Chunk라고 한다.
Chunk의 개수는 여러 개일 수 있으며 프로그램이 실행되면서 필요에 따라 삭제, 생성 될 수 있다. 단, 부팅 초반에 1개의 First Chunk를 만들게되며 이 때는 static성격으로 생성하게 된다. (실행중에는 Dynamic하게 생성 가능)
1) Buddy System
위에서 언급한 내용과 같이 per-cpu는 buddy system과 같이 사용되어 order=0인 경우 per-cpu로 하여금 메모리 할당을 할 수 있게끔 진행한다.
이 때 per-cpu공간이 부족한 경우 buddy system을 쪼개서 per-cpu 새로운 chunk를 만들거나 반대로 per-cpu 공간이 너무 free가 많아진다면 merge해서 buddy 시스템 공간으로 올려주기도 한다.
이 떄 기준에 되는 값이 high과 batch이다.
high는 per-cpu공간의 page갯수 limit값을 의미한다. batch는 buddy <-> per-cpu간 1회 이동시 이동하는 page의 개수를 의미한다. |
즉 free가 발생해서 per-cpu에 새로운 free page가 생성되었을때 high값과 비교하여 high을 초과하는 경우 batch 개수 만큼의 page를 merge해서 buddy로 올려주게 된다.
per-cpu는 각 CPU별로 가지고 있는 개별 캐시 메모리 공간이다. 때문에 share등의 목적을 위해서 per-cpu의 메모리를 모두 buddy system order=0으로 옮겨서 저장하는 API또한 존재한다.
- ref
코드로 알아보는 ARM 리눅스 커널
https://www.bhral.com/post/가볍게-살펴보는-per-cpu
https://0xax.gitbooks.io/linux-insides/content/Concepts/linux-cpu-1.html>
'OS > Linux' 카테고리의 다른 글
[Linux Kernel] Kernel 분석(v5.14.16) - NUMA, Zone Allocation (2) (0) | 2022.05.09 |
---|---|
[Linux Kernel] Kernel 분석(v5.14.16) - NUMA, Zone Allocation (1) (0) | 2022.05.01 |
[Linux Kernel] Kernel 분석(v5.14.16) - Buddy (2) (0) | 2022.03.07 |
[Linux Kernel] Kernel 분석(v5.14.16) - Buddy (1) (0) | 2022.02.26 |
[Linux Kernel] Kernel 분석(v5.14.16) - Memory Zone & Sparse (0) | 2022.02.13 |