슬래브 할당

Slab allocation

슬래브 할당은 객체의 효율적인 메모리 할당을 위한 메모리 관리 메커니즘입니다.이전 메커니즘과 비교하여 할당 및 할당 해제로 인한 플래그멘테이션을 줄일 수 있습니다.이 기술은 특정 유형의 데이터 개체를 포함하는 할당된 메모리를 유지하여 동일한 유형의 개체를 나중에 할당할 때 재사용하기 위해 사용됩니다.는 개체 풀과 유사하지만 메모리에만 적용되며 다른 리소스에는 적용되지 않습니다.

슬래브 할당은 Jeff Bonwick에 [1]의해 Solaris 2.4 커널에서 처음 도입되었습니다.현재는 FreeBSD [3]Linux를 포함[2] 많은 Unix 및 Unix 유사 운영 체제에서 널리 사용되고 있습니다.

근거

슬래브 할당은 커널 데이터 객체의 초기화 및 파괴에 매우 비용이 많이 드는 작업(CPU 시간)을 자주 발생시키지 않으며, 이는 해당 [1]객체에 대한 메모리 할당 비용을 초과할 수 있습니다.커널에서 개체를 자주 생성 및 삭제할 경우 초기화에 따른 오버헤드 비용으로 인해 성능이 크게 저하될 수 있습니다.오브젝트 캐싱은 오브젝트 상태를 초기화하는 함수의 호출 빈도를 낮춥니다.사용 후 슬래브 할당 오브젝트가 해방될 때 슬래브 할당 시스템은 일반적으로 해당 타입의 오브젝트가 다음에 필요할 때 재사용할 수 있도록 캐시(파괴 작업을 하지 않고)를 유지합니다(따라서 구축 작업을 피함).새로운 오브젝트를 질화한다).

슬래브 할당에서는 데이터 객체의 특정 유형 또는 크기에 대한 캐시는 미리 할당된 다수의 메모리 "슬랩"을 가집니다. 각 슬래브 안에는 [4]객체에 적합한 고정 크기의 메모리 청크가 있습니다.슬래브 할당자는 이러한 청크를 추적하여 특정 유형의 데이터 개체에 대한 메모리 할당 요청을 수신할 때 일반적으로 기존 슬래브에서 빈 슬롯(청크)을 사용하여 요청을 충족할 수 있습니다.할당자가 오브젝트의 메모리를 해방하도록 요구받으면 슬롯을 포함하는 슬래브의 빈(미사용) 슬롯 목록에 추가합니다.같은 타입의 오브젝트(또는 같은 사이즈의 메모리 할당)를 작성하기 위한 다음 콜에서는 해당 메모리슬롯(또는 다른 빈 슬롯)이 반환되어 빈 슬롯 목록에서 삭제됩니다.이 프로세스에 의해, 적절한 메모리 영역을 검색할 필요가 없어져, 메모리 플래그멘테이션이 큰폭으로 경감됩니다.이 문맥에서 슬래브는 미리 할당된 메모리 청크를 포함하는 메모리 내의 하나 이상의 연속된 페이지입니다.

실행

슬래브 할당 알고리즘을 이해하려면 다음 용어를 정의하고 설명해야 합니다.

  1. 캐시: 캐시는 소량의 매우 빠른 메모리를 나타냅니다.캐시는 세마포어, 프로세스 기술자, 파일 개체 등 특정 유형의 개체를 위한 스토리지입니다.
  2. 슬래브: 슬래브는 일반적으로 물리적으로 연속된 여러 페이지로 구성된 연속된 메모리 조각을 나타냅니다.슬래브는 포함된 캐시의 특정 종류의 객체와 연관된 데이터의 실제 컨테이너입니다.

캐시를 설정할 때 프로그램은 캐시와 연결된 슬래브에 여러 개체를 할당합니다.이 숫자는 연관된 슬래브의 크기에 따라 달라집니다.

슬래브는 다음 상태 중 하나로 존재할 수 있습니다.

  1. empty – free로 표시된 슬래브 상의 모든 객체
  2. 부분 – 슬래브는 사용된 객체와 자유로운 객체로 구성됩니다.
  3. full – 사용된 것으로 표시된 슬래브 상의 모든 객체

처음에 시스템은 각 슬래브를 "빈"으로 표시합니다.프로세스가 새로운 커널 개체를 호출하면 시스템은 해당 유형의 개체에 대한 캐시 내의 부분 슬래브에서 해당 개체의 빈 위치를 찾으려고 시도합니다.이러한 위치가 존재하지 않는 경우 시스템은 인접한 물리 페이지에서 새로운 슬래브를 할당하고 캐시에 할당합니다.새 객체가 이 슬래브에서 할당되고 해당 위치가 "부분"으로 표시됩니다.

시스템이 미리 객체를 구축하고 슬래브에서 쉽게 할당하기 때문에 할당이 빠르게 이루어집니다.

슬래브

슬래브는 캐시가 증가하거나 축소될 수 있는 양입니다.이것은 머신의 캐시에 대한 메모리 할당의 1개를 나타내며, 일반적으로 페이지 크기의 배수를 나타냅니다.슬래브에는 프리 버퍼(또는 bufctls) 목록과 할당된 bufctls 목록(슬래브 크기가 [citation needed]큰 경우)이 포함되어야 합니다.

대형 슬래브

이는 특정 시스템의 페이지 크기의 1/8 이상인 개체를 저장하는 캐시용입니다.큰 슬래브가 작은 슬래브와 레이아웃이 다른 이유는 큰 슬래브가 페이지 크기 단위로 더 잘 채워져 조각화에 도움이 되기 때문입니다.슬래브에는 bufctls 목록이 포함되어 있습니다.bufctls는 단순히 할당 가능한 각 버퍼의 컨트롤러입니다(버퍼는 슬래브 할당자의 사용자가 사용하는 메모리입니다).

소형 슬래브

작은 슬래브에는 지정된 머신의 페이지 크기의 1/8 미만의 객체가 포함되어 있습니다.이러한 작은 슬래브는 bufctls를 사용하지 않도록 논리 레이아웃에서 더욱 최적화해야 합니다(데이터 자체만큼 크고 메모리 사용량이 훨씬 더 커집니다).작은 슬래브는 정확히 한 페이지이며 bufctls를 피할 수 있는 정의된 구조를 가지고 있습니다.페이지의 마지막 부분에는 슬래브를 유지하는 데 필요한 정보인 '슬랩 헤더'가 포함되어 있습니다.이 페이지의 첫 번째 주소부터 시작하여 페이지 끝에 있는 슬래브헤더에 접속하지 않고 할당할 수 있는 버퍼의 수만큼이 있습니다.

bufctls를 사용하는 대신 버퍼 자체를 사용하여 빈 목록 링크를 유지합니다.이를 통해 작은 슬래브의 bufctl을 [1]우회할 수 있습니다.

슬래브 할당을 사용하는 시스템

「 」를 참조해 주세요.

메모들

  1. ^ a b c 제프 본윅슬래브 할당자: 오브젝트 캐시 커널 메모리 할당자(1994)
  2. ^ FreeBSD 커널 개발자 매뉴얼
  3. ^ M. Tim Jones, Anatomy of the Linux slab allocator 2013년 10월 2일 Wayback Machine에서 아카이브
  4. ^ 에이브러햄 실버스차트제트 연구진:운영 체제의 개념.Wiley: 2004. ISBN0-471-69466-5
  5. ^ "Gnu Mach Allocator Documentation".
  6. ^ "Console Security – Switch (34c3)". media.ccc.de. Retrieved 28 December 2017.
  7. ^ Chris Cooper and Chris Moore, HP-UX 11i Internals, Upper Saddle River, 뉴저지: 프렌티스 홀 PTR, 2004, ISBN 0-13-032861-8, 페이지 334.
  8. ^ "Perl5-Porters Weekly: 2012 June 17". Retrieved 18 November 2012.
  9. ^ Bonwick, Jeff. "Magazines and Vmem: Extending the Slab Allocator to Many CPUs and Arbitrary Resources". USENIX 2001. Retrieved 18 November 2012.

외부 링크