지속 메모리 프로그래밍

프로그래밍 지속적인 메모리
년 6 월 2013 년 나는의 인터페이스 비 휘발성 메모리 (NVM)의 미래에 대해 썼다. 어느 SNIA NVM 기술 작업 그룹 (TWG 프로그래밍 설명 ) NVM의 프로그래밍 모델이 개발되고있다. 지난 4 년 동안 발표 된 사양은 예상대로 프로그래밍 모델은 후속의 많은 초점이되었다. 운영 체제 파일을 메모리에 매핑되는대로 프로그래밍 모델은 사양 NVM.PM.FILE에 설명 된대로, PM이 될 수있다. 이 문서에서는 어떠한 작업이 완료되었습니다 운영 체제에서 메모리 프로그래밍 모델을 지속 달성하는 방법을 설명하고 무엇에 도전하는 것은 우리가 직면하고있다.
BACKGROUND 영구 메모리
PM과 같은 스토리지 클래스 메모리라는 용어는,로드 / 저장 메모리 액세스 특성 어드레스 바이트지만, 지속성이있다. 는 PM이 시스템 메모리 버스에 걸려이 문서의 문제, 예를 들어, DRAM DIMM은 NVDIMMs라는 비의 DIMM 클래스를 만들 수 있습니다.
무엇을 더 지속 메모리를 설명하기 위해하는 것은 소프트웨어와 같은에만 NVDIMMs 토론, 같은 메모리 액세스에 액세스 할 수 있다고 말했다. 메모리 시맨틱 예컨대 CPU 캐시 일관성은 DMA 직접 메모리 액세스 다른 장치의 모든 장점을 제공하는 것은 버퍼 라인 크기, 바이트 어드레싱 캔에 액세스한다. 이러한 의미를 제공하기 위해, CPU가 충분히 합리적이어야 지연 장치는 CPU의 지시에 대한 액세스를 차단한다. 느린 때문에 블록 단위로 접근 할 필요의 NAND 플래시 메모리와 같은 지속성 및 컨텍스트 스위치에 충분히 긴 시간을 필요로합니다. 하드웨어 액세스 시간을 밀리 초 단위로 일반적으로, NAND 플래시 SSD 마이크로 단위, 나노초 PM과 함께. 하드웨어 미디어 유형에 따라 다름, NVDIMM는 DRAM보다 속도를 높일 수 있지만, 그 속도는 속도 비교입니다.
NAND 플래시 콘텐츠 DRAM을 반환 할 때 지금 시장에 일부 NVDIMM 제품은 사용 런타임 DRAM은 매체로의 콘텐츠는 다시 자동 전원 끄기, 전원을하는 동안 NAND 플래시에 백업됩니다. 이들 제품은 DRAM의 성능을 제공하지만, DRAM에 비해 DIMM 각 소용량 각 G. 높은 소모 특성을 제공하기 위해, 데이터를 저장하기위한 추가 구성 요소를 필요로하고 배터리 같은 DRAM보다 더 높은 용량을 통해 3D XPoint 기술, 2015 년, 인텔과 마이크론 공동 연구 개발 등의 새로운 비 휘발성 매체. T는 각각의 CPU 대역폭에 도달, 오래가는 메모리 국경은 많은 관심을 끌었다 : 내구성, 용량 및 소비를.
지속 메모리 프로그래밍 모델을
어떻게 액세스 응용 프로그램이 지속되는 메모리? 그리고 휘발성 메모리 다른 응용 프로그램이 특정 방법과 내용이 연결이 지속되는 지정이 필요 휘발성 메모리가 익명으로하지으로 지속 메모리를, 그 응용 프로그램이 그를 찾을 수 있도록하는 것이, 지역과 같은 파일 이름을 할 필요가있다. 응용 프로그램은 지속적 메모리 제어 권한에 대한 액세스를 필요로합니다. SNIA TWG는 운영 체제 표준 파일 이름 지정의 의미가 지속적인 메모리, 권한 및 메모리 매핑을 제공 사용할 수 있기 때문에 프로그래밍 모델을 추천합니다.
현재 리눅스와 윈도우를 포함하여 운영 체제의 다양한 모델을 지원합니다.
지속 메모리 프로그래밍

DAX
어댑터 그림 1과 같이 지속되는 메모리 파일 시스템은 페이지 캐시 시스템을 거치지 않고, 지속적인 메모리에 직접 액세스 할 수 있습니다. 이러한 특성은 DAX이라고합니다. 지속 메모리 프로그래밍 모델과 DAX의 속성은 지속 메모리 파일의 mmap () 또는 MapViewOfFile을 () 함수는 메모리에 매핑 유사한 증상이다 사용할 수 있습니다 제안합니다. 한 형태의이 유형의 우측 도면. 응용 프로그램로드 / 저장 지침에 의해 영구적 인 메모리에 직접 액세스 할 수 있습니다. 지속성은 커널 모드 및 사용자 모드로 전환하지 않고 매체에 직접 액세스 할 수있다.
영구 저장
리눅스 시스템은 데이터 지속성을 보장하기 위해 msync () 또는 fsync를 ()를 사용할 수 있습니다, 윈도우 FlushViewOfFile ()와 FlushFileBuffers를 통해 데이터 지속성을 보장 할 수 있습니다 (). 이러한 호출은 메모리 게이트를 생성합니다 전에이 점에 대한 데이터는 모든 영구 메모리에 지속되고있다. 역사적으로, 메모리 게이트 운영 시스템은 페이지 캐시의 더티 페이지를 찾을 필요가, 그리고 그들은 디스크로. 지속적인 메모리로 인해 페이지 캐시를 사용하지 않고 운영 체제 만 지속 메모리에 플러시 변경 CPU 캐시해야합니다. 2 :
지속 메모리 프로그래밍
그림 2 오래가는 도메인에 점선한다. 이 레벨 아키텍처는 DIMM 방법 또는 기록 요구 큐 WPQ 메모리 컨트롤러 중의 점선 부분 내의 데이터. 데이터 점선 상자가 지속 미디어에 플러시에 어느 반환, 메모리 요구를 지속하는 것은 충분한 전력을 가지고있다. 이 기능은 DRAM 브러시 비동기라고, 이미 이러한 특성 및 NVDIMM 있습니다.
X86 아키텍처, 데이터는 여전히 CPU 캐시에있을 수 있기 때문에 단순히 데이터의 지속성을 보장 할 수 없습니다 저장된 명령을 실행, 정전되면 데이터가 손실됩니다. 추가 교육의 필요성은 데이터 지속성을 보장 떠올랐다. 다음 표는 작동 방식에 대해 설명합니다.
인텔 CPU 캐시 도메인 부분을 지속받지 않습니다 이유는 그림 2와 표 1, 혼동 될 수 있습니다. 도 1의 점선 박스 내의 CPU (2) 캐시를 포함하여 기술적으로 가능.
영구 도메인 확장을 포함하여 86 CPU 캐시 문제는 그가 전력을 제공하기 위해 실제 커패시터보다 훨씬 더 많은 전력을 필요로 매우 큰 캐시입니다. 플랫폼은 배터리를 필요로이 수단. 이 때, 서버는 배터리 지속 메모리가 현실적이지 못하다 지원합니다. 그러나 하드웨어 공급 업체에 대한 물론, 그것의 상품에 배터리를 포함 할 수있다. 이렇게하면 새로 고침 명령을 버퍼 읽기 표 1에 설명 건너 뛸 수 있지만에만 지속적으로 간주 될 볼 수 전역 메모리 장벽에 저장되어 있기 때문에 sfence 명령은 여전히 필요하며,이 sfence이 보장됩니다.
응용 프로그램 공급 업체의 계획은 모든 플랫폼에서 미래의 기대가 지속 도메인에 CPU 캐시를 포함뿐만 아니라 같은 배터리를 사용하기 때문에, 그래서 브러시 스킵 CPU가 BIOS 운영 체제를 통지 할 수 있습니다 때 그래서, ACPI에 속성을 추가 할 수 있습니다. 이것은 최적의 방식과 유사 msync 전화의 운영체제를 할 수 있습니다.
영구 사용자 공간 도메인 점멸
WBINVD 예외 인텔 CPU 사용자 모드 명령 모드는 아래의 표 1을 지원한다. 사용 CLWB (CLFLUSHOT 또는 CLFLUSH) 사용자와 지원 임시 저장 모드의 사용과 쓰기 캐시 라인 브러시입니다.
지속 메모리 프로그래밍
이 커널을 거치지 않고, 지속적인 메모리에 플러시 사용자 공간, 최적화 된 세척라는이 기능을 할 수 있습니다. 그것은 각각의 선택적 지원이 기능에 대한 운영 체제 및 하드웨어 플랫폼에 따라 달라집니다. CPU 지원에도 불구하고 있지만 응용 프로그램, 운영 체제, 말했을 때 최적화 된 높이의 안전한 사용. 파일 시스템 메타 데이터 변경이 msync이 번쩍이 필요하면 운영 체제가이 컨트롤 포인트를 필요로한다.
현재 구현에서 지원하는 보안 사용자 공간 브러시는 끊임없이 진화한다. 닥스는 플러시 최적화 된 조건없는 지원을 포함하여 Windows NTFS 파일 시스템에 의해 제공된다. Windows는 명령을 지속적인 메모리를 유지하기 위해 유사한 CLWB + SFENCE 데이터 지속성을 사용합니다. 리눅스는 ext4를하고 XFS는 관계없이 사용자 공간의 보안을 번쩍, DAX를 지원합니다. 임시 해결책으로, 리눅스는 디바이스-DAX를 제공하는 응용 프로그램은, 지속적인 메모리 장치를 열고 메모리에 매핑, 내구성을 보장하기 위해 사용자 공간을 작성하는 브러시를 사용할 수 있습니다.
Libpmem 라이브러리는 최적화 된 높이가 안전 할 때 기능은 응용 프로그램을 알 수 있습니다. 프로그래머가 강력하게 식별하고 사용자 공간을 작성하는 브러시를 사용하는 libpmem를 사용하는 것이 좋습니다. Libpmem는 브러시 sfence 단순히 호출 명령으로 호출 기록, 배터리 감지 플랫폼을 사용하는 경우에 사용된다. 이 라이브러리는 아래에 상세하게 설명한다.
메모리 도전 지속
메모리 내 데이터 구조 변화 자성 문제가 발생할 때. 다른 스레드의 절반은 데이터 구조를 액세스 할 경우에만 데이터에 대한 변경 사항을 테스트합니다? 일반적으로 잠금 멀티 스레드 프로그램의 데이터 구조를 보호 할 수 있습니다. 또한 때때로 하드웨어에서 원자 명령을 확인하는 데 사용됩니다. 변경 사항이, 최선을 다하고 있습니다이 스레드를 수정하는 다른 스레드를 볼 때이 논문은 또한, 원자의 가시성이되고있다.
지속 메모리 프로그래밍
Libpmemobj 라이브러리는 안전 오프를 보장하기 위해 트랜잭션 보증을 제공합니다. , 메모리 상태 아무 문제를 작성할 때이 휘발성이기 때문에 전원이 중단 실패하기 전에 메모리를 지속합니다. 그러나, 영구 메모리 상태의 일부는 상기 브러시 후 지속되었음을 이해하여야한다. 인텔은 스토리지의 8 바이트는 자성의 실패를 보장하기 위해 사용. 8 바이트보다 큰 데이터 일관성을 보장 할 수 없습니다.
기타 문제 : 관리 공간. 필드가 파일로 지속적인 메모리이기 때문에, 파일 시스템은이 공간을 관리 할 수 있지만 응용 프로그램이 메모리에 매핑되면, 무슨 일 응용 프로그램 파일에 전적으로 의존한다. 그리고 유사한 malloc에 기능 할당 메모리는 다시 시작 방법, 지속적인 메모리 재 연결 권리를 제공하지 않는 오류가 발생하면 데이터 일관성을 보장하기 위해 어떤 단계를 종료하지 않는 경우, 휘발성이다. 메모리 프로그래밍을 지속 그래서 또한 공간 할당 문제에 집중해야합니다.
주소 독립은 또 다른 도전이다. 이 동일한 주소로 매핑 내측 지속 실현하는 것은 기술적으로 가능하지만, 비록 다른 항목 비현실적 맵의 크기를 변경하는 경우. 주소 공간 레이아웃 랜덤 기능은 운영 체제 라이브러리를 조정하고, 임의의 파일 매핑 주소 것입니다. 어드레스 영구 메모리 내 데이터 구조에 대한 포인터를 사용하여 다른 데이터 구조를 참조하는 독립 수단, 파일을 다른 주소에 매핑되는 경우에도, 포인터가 어떤 방식으로 사용되어야한다. 절대 포인터보다는 포인터 대해 사용 또는 데이터 구조를 영구 메모리에 상주하는 애플리케이션 객체 ID의 일부 타입을 이용하여 몇 가지 예를 들면 이것을 달성하는 방법, 재배치 맵핑 후의 포인터가있다.
NVM 라이브러리
인텔은 설명서는 http://pmem.io에서 볼 수 있습니다, GitHub의 오픈 소스, 오픈 소스 라이센스 BSD에 pmdk 라이브러리를 개발했다.
libpmem : 기본 라이브러리
이 라이브러리는 상대적으로 간단하고 상대적으로 작은 감지 CPU 지침을 포함하고 최적의 복사 명령 범위 지원을 작성하는 브러시를 사용한다.
libpmemobj : 지원 서비스
Libpmemblk 및 libpmemlog : 특정 사용자의 경우 지원
지속 휘발성 메모리 사용 : Libmemkind
의 요약
성숙하고 완벽한 프로그래밍 모델을 추가 2013의 아이디어를. Pmdk 라이브러리는 지속적인 메모리 프로그래밍을 제공하기 위해 개발되었다. GitHub의 오픈 소스 https://github.com/pmem의에 라이브러리
원래
https://www.snia.org/pm-summit2019
https://www.snia.org/pm-summit2017

추천

출처blog.51cto.com/yanzongshuai/2485052