lockfree
는 표준 C++11로 작성되었으며 심층 임베디드부터 HPC까지 모든 플랫폼에 적합한 잠금 없는 데이터 구조 모음입니다.
잠금 없는 데이터 구조는 상호 배제 메커니즘을 사용하지 않고도 동시에 사용할 수 있도록 스레드 및 인터럽트로부터 안전한 데이터 구조입니다. 이는 프로세스 간 통신에 가장 유용하며 작업 수 및 스레드 수에 따라 잠금 기반 구조보다 훨씬 더 잘 확장되는 경우가 많습니다.
lockfree
사용하는 이유이러한 데이터 구조는 성능이 더 뛰어나며 데이터를 푸시하는 스레드/인터럽트가 하나만 있고 이를 검색하는 스레드/인터럽트가 하나만 있을 때마다 일반적으로 사용해야 합니다.
이러한 데이터 구조는 더 일반적이어서 여러 생산자와 소비자를 동시에 지원하지만 단일 생산자 단일 소비자 데이터 구조에 비해 저장 공간과 성능 오버헤드가 있습니다. 또한 일부 저가형 마이크로컨트롤러에서는 누락될 수 있는 원자 명령도 필요합니다.
라이브러리를 얻는 방법은 크게 세 가지가 있습니다.
lockfree
기본적으로 거짓 공유 현상을 방지하기 위해 인덱스에 대한 캐시라인 정렬을 사용하여 캐시 일관성 시스템에서 캐시라인 무효화로 인한 성능 손실을 방지합니다. 기본적으로 인덱스는 LOCKFREE_CACHELINE_LENGTH
, 64
로 정렬됩니다.
임베디드 시스템에서는 메모리 낭비를 피하기 위해 LOCKFREE_CACHE_COHERENT
거의 항상 false
로 설정해야 합니다.
또한 일부 시스템에는 일반적이지 않은 캐시라인 길이가 있으며(예: Apple M1/M2 CPU의 캐시라인 길이는 128바이트) 이러한 경우에 따라 LOCKFREE_CACHELINE_LENGTH
설정해야 합니다.
lockfree
의 모든 데이터 구조는 사소한 유형에만 사용됩니다.
호스팅 환경에서 잠금 없는 데이터 구조를 사용하려는 가장 큰 이유는 교착 상태, 우선 순위 반전 및 비결정적 액세스 대기 시간과 같은 잠금 관련 문제를 피하는 것입니다. 잠금 없는 데이터 구조를 적절하게 사용하면 일부 시나리오에서 성능을 향상시킬 수도 있습니다.
또한 lockfree
#ifdef
또는 다형성 없이 POSIX 환경과 비 POSIX 환경 모두에서 작동하도록 컴파일할 수 있는 애플리케이션과 라이브러리를 구축하는 방법을 제공합니다.
잠금은 일반적으로 마이크로 컨트롤러와 같은 내장형 시스템에서 비용이 많이 들지 않지만 다양한 RTOS가 있으며 잠금을 위한 표준화된 API가 없습니다. 8051부터 RISC-V까지 여러 아키텍처가 존재한다는 것은 인터럽트 관리 방법도 표준화되지 않았음을 의미한다.
lockfree
잠금과 달리 무시할 수 있는 성능 비용으로 이식 가능한 임베디드 코드를 구축하는 방법을 제공하며, lockfree
사용하는 코드는 C++11을 지원하는 모든 임베디드 플랫폼에서 실행되도록 컴파일될 수 있습니다. 또한 모의 작업 없이 호스트 시스템에서 코드를 쉽게 테스트할 수 있습니다.
lockfree
의 데이터 구조의 공식적인 분류는 무엇입니까? lockfree
의 모든 구조는 경계가 있고 배열 기반 이며 잠금이 없으며 spsc 데이터 구조도 waitfree 및 종료 안전입니다 .
잠금 없는 프로그래밍에 대한 자세한 내용은 다음을 참조하세요.