[논문 리뷰] An Extended Low Fat Allocator API and Applications
이 논문은 저지름 포인터—객체 크기와 기본 주소를 네이티브 포인터 내에 인코딩함으로써 크기, 기본 주소, 오프셋 검색과 같은 효율적이고 저지연 성능을 가능하게 하는 확장된 LowFat 할당기 API를 제안한다. 주요 기여는 힙, 스택, 전역 객체 전역에서 이러한 확장된 기능을 균일하게 지원함으로써 메모리 오류 검출, 압축된 데이터 구조, 최소한의 성능 오버헤드로 인한 타입 지정 포인터와 같은 새로운 응용 프로그램을 가능하게 한다.
The primary function of memory allocators is to allocate and deallocate chunks of memory primarily through the malloc API. Many memory allocators also implement other API extensions, such as deriving the size of an allocated object from the object's pointer, or calculating the base address of an allocation from an interior pointer. In this paper, we propose a general purpose extended allocator API built around these common extensions. We argue that such extended APIs have many applications and demonstrate several use cases, such as (manual) memory error detection, meta data storage, typed pointers and compact data-structures. Because most existing allocators were not designed for the extended API, traditional implementations are expensive or not possible. Recently, the LowFat allocator for heap and stack objects has been developed. The LowFat allocator is an implementation of the idea of low-fat pointers, where object bounds information (size and base) are encoded into the native machine pointer representation itself. The "killer app" for low-fat pointers is automated bounds check instrumentation for program hardening and bug detection. However, the LowFat allocator can also be used to implement highly optimized version of the extended allocator API, which makes the new applications (listed above) possible. In this paper, we implement and evaluate several applications based efficient memory allocator API extensions using low-fat pointers. We also extend the LowFat allocator to cover global objects for the first time.
연구 동기 및 목표
- 크기, 기본 주소, 오프셋과 같은 할당 메타데이터를 검색하기 위한 기존 malloc API에 대한 표준화되고 효율적인 확장 기능의 부재를 해결한다.
- 일관된 확장된 API를 통해 힙, 스택, 전역 객체 전역에서 메모리 객체를 균일하게 다룰 수 있도록 한다.
- 저지름 포인터 인코딩이 성능 민감한 응용 프로그램에 필수적인 최적화된 인라인 연산을 가능하게 함을 입증한다.
- 기존 할당기에서 과도한 오버헤드로 인해 이전에는 구현이 어려웠던 새로운 프로그래밍 패턴과 데이터 구조를 가능하게 한다.
- LowFat 할당기를 전역 객체를 지원하도록 확장하여 C/C++ 프로그램에서 주요 객체 유형 전부를 완전히 커버한다.
제안 방법
- 64비트 포인터 정렬과 사용되지 않는 비트를 활용하여 비트 필드를 사용해 객체 크기와 기본 주소를 포인터 표현에 직접 인코딩한다.
- 낮은 오버헤드를 위해 몇 개의 인라인 어셈블리 명령어로 컴파일되는 저지름 포인터 연산을 사용해 확장된 API를 구현한다.
- 전역 변수를 지원하기 위해 메타데이터를 검색 테이블에 저장하여 모든 객체 유형 간 일관된 동작을 가능하게 하기 위해 LowFat 할당기를 확장한다.
- 경계 검사, 숨겨진 메타데이터 저장, 타입 지정 포인터, 압축된 벡터와 같은 응용 프로그램을 확장된 API를 사용해 구현한다.
- 벡터 생성, 접근, 크기 계산과 같은 연산에 대한 마이크로 벤치마크를 사용해 LowFat와 기존 할당기 및 Boehm GC 기반 접근 방식을 비교하여 성능을 평가한다.
- LowFat 연산의 효율성을 활용해 경계 검사와 같은 빈번한 메타데이터 접근이 필요한 하드닝 툴에 적합한 응용 프로그램을 지원한다.
실험 결과
연구 질문
- RQ1저지름 포인터 인코딩을 전역 변수로 확장하여 모든 객체 유형 간 균일한 메타데이터 접근이 가능한가?
- RQ2기존 할당기와 비교해 저지름 포인터를 사용할 때 확장된 할당기 연산(크기, 기본 주소, 오프셋)을 얼마나 효율적으로 구현할 수 있는가?
- RQ3확장된 LowFat API를 기반으로 한 응용 프로그램은 어떤 성능 오버헤드를 가지며, 어떤 조건에서 유리한가?
- RQ4확장된 API는 기존 할당기로는 비현실적이었던 타입 지정 포인터나 압축된 데이터 구조와 같은 새로운 프로그래밍 패턴을 가능하게 하는가?
- RQ5LowFat 기반 구현의 성능은 유사한 용도로 사용되는 Boehm 가비지 컬렉터와 비교해 어떻게 되는가?
주요 결과
- 확장된 LowFat API는 크기, 기본 주소, 오프셋 검색을 몇 개의 인라인 명령어로 수행해 평균 10 사이클 이내의 저지연 성능을 달성한다.
- 저지름 벡터는 명시적인 len 및 pos 필드를 제거함으로써 메모리 오버헤드를 줄이며, 모든 필드가 1워드 크기일 경우 벡터당 3워드를 절약한다.
- 저지름 벡터 생성은 크기 정렬 조건에 따라 1.33배에서 2배의 성능 오버헤드가 발생하며, 접근 오버헤드는 약 1.2배이다.
- 저지름 태그 지정 포인터는 타입 지정 포인터 벤치마크에서 기존 태그 지정 포인터보다 약 20% 빠르며, 확장된 태그 지정 포인터는 약 27% 느리지만 더 많은 태그 비트를 지원한다.
- Boehm GC 기반의 유사한 기능을 가진 구현은 라이브러리 호출 오버헤드로 인해 LowFat보다 두 배 이상 느리며, 이는 인라인 연산의 이점이 뚜렷하게 드러난다.
- 저지름 포인터를 전역 객체로 확장함으로써 힙, 스택, 전역 메모리 전부를 커버하게 되어 확장된 API가 C/C++ 프로그램 전반에 걸쳐 보편적으로 적용 가능해졌다.
더 나은 연구,지금 바로 시작하세요
논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.
카드 등록 없음 · 무료 플랜 제공
이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.