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>

+ Recent posts