内存发展经历了哪几代

本文来自持久化内存文档,该文档上一次更新来自两个月前,也就是2019年3月,但是感觉内容应该还是比较老了,可能初版有两三年的历史了~ 一、持久化内存概述 在过去的几十年中,计算机系统已经实现了图1所示的存储器存储层次结构。存储器存储层次结构利用了局部性原理,它使频繁访问的数据保持在最接近CPU的位置。

本文来自持久化内存文档,该文档上一次更新来自两个月前,也就是2019年3月,但是感觉内容应该还是比较老了,可能初版有两三年的历史了~

一、持久化内存概述

在过去的几十年中,计算机系统已经实现了图1所示的存储器存储层次结构。存储器存储层次结构利用了局部性原理,它使频繁访问的数据保持在最接近CPU的位置。

连续几代技术分别从缓存的数量,大小和速度进行了改进,以此来确保CPU在缓存中可以访问到最常用的数据。CPU速度变得越来越快,在每个新的CPU中添加更多的核和线程,他们试图维护摩尔定律。

但是,易失性DRAM和非易失性存储(如NAND SSD或硬盘驱动器)的容量,价格和速度尚未跟上,这迅速成为系统和应用程序性能的瓶颈。

                                                                                          图1 内存-存储器层次结构

持久化内存(PMEM),也称为非易失性内存(NVM)或内存级存储器(SCM),在图2所示的存储器存储层次结构中提供了一个新的层级,填补了现有层级性能/容量差距。

                                                        图2 加上持久化内存层的内存-存储器层次结构

有了持久化内存,应用有了一个新的层级来进行数据的放置,这个介于内存和存储器层级之间的持久化内存提供了比DRAM更大的容量同时也有比存储器更显著的访问速度。应用可以像访问传统的内存一样访问持久化内存,无需在内存和存储器之间来回切换数据块。

二、存储网络工业联盟(SNIA)编程模型

存储网络工业联盟和一些技术产业公司提出了一系列的标准,其中有一个为NVM Programming Model,该模型支持持久化内存的应用程序开发。

想要了解该编程模型的更多信息可以访问下面的地址:

NVM Programming Model Version 1.2

SNIA Persistent Memory website

SNIA每一年都会举办非易失性会议,论文和一些之前的会议内容可以在下面的地址找到:

SNIA Persistent Memory home page

三、持久化内存对于开发者而言意味着什么?

持久化内存层提供给了开发者一个放置数据以及数据架构的选择。传统的数据被read和write到易失性内存(DRAM)上,然后被刷回到非易失性存储器(SSD、HDD)上。当一个应用程序启动的时候,数据需要先从非易失性存储器(SSD、HDD)上读到易失性内存(DRAM)才能被访问。

简单点说就是,传统的read、write先写内存,然后再刷回磁盘,当应用启动时,数据需要先从磁盘读到内存才能被访问。

基于数据集的大小,这个从非易失性存储器(SSD、HDD)上加载到易失性内存(DRAM)的过程可能从秒级、分钟级或者小时级不等,这个时间是非常长的。

巧妙地程序设计,开发者和应用架构师现在可以采用持久化内存这种新技术去提高性能同时减少应用的启动时间。

持久化内存的出现带来了一些不适用于传统易失性内存的新的编程关注点,主要有如下内容:

  • 数据持久性:

    • 在刷新之前,存储不保证是持久的。虽然几十年前的内存映射文件API(如Linux上的mmap()和msync())也是如此,但许多程序员还没有处理内存刷新以保持持久性。遵循标准API(如msync()以刷新对持久性的更改)将按预期工作。但是,更优化的刷新也是可能的,其中应用程序直接从CPU缓存中刷新存储,而不是调用内核。

    • CPU具有无序的CPU执行和高速缓存访问/刷新。这意味着如果应用程序存储了两个值,它们变为持久的顺序可能不是应用程序编写它们的顺序。

  • 数据一致性:

    • 8字节存储在x86架构上具有掉电原子性  - 如果在对PMEM8字节对齐数据的存储期间发生掉电,重启后,在该位置要么是新的8字节要么是旧的8字节,不会是两者的组合(保持原子性,要么完成,要么没完成)。

    • x86上大于8字节的任何内容都不具有掉电原子性,因此需要软件来实现一致性来进行所需的任何事务/日志记录/恢复。 请注意,这是特定于x86的 - 其他硬件平台可能具有不同的原子大小(PMDK的设计使得使用它的应用程序不必担心这些细节)。

  • 内存泄漏:

    • 内存泄漏到持久化内存是持久的。重新启动服务器不会更改设备上的内容。在当前的易失性模型(DRAM)中,如果应用程序泄漏内存,则重新启动应用程序或系统会释放该内存。

  • 字节级访问:

    • 应用程序开发人员可以根据应用程序的需求在字节级别进行读写。读/写不再需要对齐或等于存储块边界,例如:512byte,4KiB或8KiB。存储不需要读取整个块来修改几个字节,然后将整个块写回持久存储。应用程序可以根据需要随意读取/写入。 这可以提高性能并减少内存占用开销。

  • 错误处理:

    • 应用程序可能需要直接检测和处理硬件错误。由于应用程序可以直接访问持久性内存介质,因此任何错误都将作为内存错误返回给应用程序。

应用程序开发人员可以使用传统的系统调用如memcpy(),memmap()等来访问持久性内存设备。

这是一个具有挑战性的途径,它需要对持久存储设备和CPU功能有深入的了解。为一个服务器平台开发的应用程序可能无法移植到不同的平台或CPU。为了帮助应用程序开发人员应对这些挑战,可以下载并免费使用开源持久性内存开发工具包:

Persistent Memory Development Kit

有关PMDK的详细信息,可以参阅如下的PMDK简介,安装PMDK和PMDK程序员指南:

PMDK Introduction, Installing PMDK

PMDK Programmers Guide

在Linux和Windows上进行了调整和验证,这些库构建在这些操作系统的Direct Access(DAX)功能之上,允许应用程序将持久性内存作为内存映射文件进行访问,如SNIA NVM编程模型中所述。

 

原文来自:

https://docs.pmem.io/getting-started-guide/introduction#what-does-this-mean-for-application-developers

知秋君
上一篇 2024-08-11 17:48
下一篇 2024-08-11 17:12

相关推荐