NVDIMM ABC

NVDIMM概述

1、简介

顾名思义,NVDIMM是Non-Volatile
DIMM(非易失性内存)的简称。作为系统掉电后仍然保证数据不丢失的重要硬件,NVDIMM和NVRAM的功能类似,都是在系统掉电时仍然能够保证一部分内存里的数据不会丢失,并且当系统上电后数据能够自动恢复到内存当中。和NVRAM不同的是,NVRAM要么是把数据写回到PCIE接口的独立卡上,要么是依赖于独立的后备电池给DRAM在系统掉电时供电,而NVDIMM是把数据写回到自带的FLASH芯片上去。另外一个不同时,NVDIMM本身不需要额外的硬件设计,也不占用PCIE通道资源,它只用主板上DIMM上没有占用的DIMM插槽。

2、原理

从硬件的角度看,NVDIMM可以看作由四部分组成:用作内存的DRAM,保存数据的FLASH,控制两者并和CPU交互的中心控制模块(FPGA),以及在系统掉电后为前面三者提供暂时后备电源的超级电容。当系统掉电时,NVDIMM上的中心控制模块能够检测到,并且触发DRAM进入异步刷新模式,

当CPU
cache、write
combining buffer、store
buffer中的数据都写回到DRAM后,中心控制模块再把DRAM里的数据写到NVDIMM上的FLASH里面去,相应数据的校验值也会写道FLASH。类似地,在系统上电后,NVDIMM上的中心控制模块先于CPU接管其上的DRAM,它初始化DRA,进行一些读写测试,确保无误后,通过校验值检查FLASH上是否有之前保存的完整数据,如果之前保存到FLASH里的数据完整,就把它写回到DRA。完成这些步骤后,中心控制模块再把DRAM的控制权交还给CPU,此后CPU可以像对待普通的NVDIMM一样往NVDIMM上的DRAM里读写数据。

3、核心IP

通过以上对硬件的分析,可以看到NVDIMM最核心的IP就是中心控制模块的设计,它既是DRAM控制器,又含有FLASH控制器,还能监控CPU以及主板上的相关信号,此外还能生成校验值。这也就难怪为了保护知识产权,为什么现在市面上能买到的NVDIMM上的中心控制模块,都用FPGA的形式实现。

此外,为了确保每次掉电NVDIMM都能保证把DRAM的内容保存到FLASH里面去,作为临时后备电源的超级电容的续航能力和稳定性尤其重要。否则就可能出现DRAM的内容没有全部备份到FLASH里去,超级电容的电量就已耗尽的情况,这就根本起不到掉电保护数据的作用。因此,超级电容的稳定性、续航能力决定了整个NVDIMM的稳定性和强壮程度。

当然,为了保证数据一致性,特别是能把掉电之前NVDIMM的DRAM所对应的
在cache、write
combining buffer、store
buffer里的任何数据都写回到FLASH,需要系统软硬件的综合设计,这就要求处理器厂商、主板厂商、NVDIMM厂家、BIOS厂商一起协作,设计好实现的方法。

4、使用方法

从系统软件的角度来看,NVDIMM既可以当作一个透明的DRAM,也可视作一个字符设备。但无论如何,使用的时候它必定需要映射到用户可以访问的地址空间。同设备内存、独立显存的地址映射类似,NVDIMM上的DRAM可以支持uncache、write
through、write
combine这三种映射模式。当然如果硬件和系统软件能够自动写回cache以及write
combining buffer和store
buffer的内容到DRAM,
cached的映射模式也是可以的。

5、应用场景

因为NVDIMM能够保证掉电基本不丢数据,因此它特别适合对数据完整性要求苛刻的场景,比如某些需要实时交易的金融行业、重要的信息平台等。此外,因为NVDIMM还能够上电后很快从NVDIMM上的flash恢复数据,它也可以用来加速系统的启动,显著地减少系统宕机时间,这对那些servie
on time以及基本不允许宕机的应用来说特别有用。

时间: 2024-11-05 21:55:30

NVDIMM ABC的相关文章

java中String s="abc"及String s=new String("abc")详解

1.   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共 享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要 在运行时动态分配内存,存取速度较慢. ==是判断

堆与栈(JAVA)——以String str="abc"的深度含义解释

栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要在运

今年数博会全面升级!BAT+TMD+ABC黑科技,你能看到谁?

一年一度的贵阳数博会又要来了!2017年5月26-29日,第三届贵阳数博会将在贵阳举办.然后重要的事情说三遍,今年的数博会规格全面升级了!升级了!升级了!今年数博会是首届中国国际大数据产业博览会,本届数博会的年度主题为"数字经济引领新增长". 2015年,数博会第一次举办的时候叫贵阳国际大数据产业博览会暨全球大数据时代贵阳峰会分,2016年第二次举办的时候叫中国大数据产业峰会暨中国电子商务创新发展峰会,2017年正式升级为中国国际大数据产业博览会,这意味着2017年数博会正式升级为国家

九度oj 题目1059:abc

题目1059:abc 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4510 解决:3546 题目描述: 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入: 题目没有任何输入. 输出: 请输出所有满足题目条件的a.b.c的值.a.b.c之间用空格隔开.每个输出占一行. 样例输入: 样例输出: 1 #include <iostream> 2 using namespace std; 3 int main

python abc模块

因为Python没有提供抽象类,需要使用抽象类需要使用abc模块 abc用法很简单主要是3个: ABCMeta,abstactporperty,abstractmethod from abc import ABCMeat, abstractporperty, abstractmethod class B():   __metaclass__ =  ABCMeta  @abstractporperty  def map_data(self):     pass  @abstractmethod  

LNMP_访问 www.abc.com&#160;&#160;请求到 www.abc.com/abc/

在nginx配置文件中加入 if ($document_uri !~ 'jzq') { rewrite ^/(.*)$ http://www.jzq.pub/abc/$1 permanent; } Mkdir /data/www/abc

char * p = &quot;abc&quot;与const char *p = &quot;abc&quot;

char * p = "abc"与const char *p = "abc"的区别是什么呢? 第一个语句会产生问题: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 此时我们只需要改成第二个用法警告就消失了,这是为什么呢? 我们来分别理解以下两个语句,首先要清楚的是char * p语句定义的p是一个指针变量,假设我们用的是第一个语句,那么我们所表达的意思

JAVA 多线程开篇 -从按顺序打印ABC开始

序言 很想把一个问题弄清楚,特别是以前一直模模糊糊的并发编程,今天在华为OJ上碰到一道题,“顺序打印ABC的两种方法开始写起”,就以这道题开篇,希望日后有时间把并发编程的基本问题弄清楚. 问题 启动三个线程,一个线程打印A,一个打印B,一个打印C,按顺序打印ABC.....如输入3,输出就是“ABCABCABC” 程序 线程的调度是由系统操作的,要想多个线程按照要求顺序打印,就必须做好线程间的同步. 思路:四个线程循环打印,但是一个线程打印一个字母释放锁后无法确定获得锁的是哪一个线程,这就需要用

exp/imp碰到的两则问题处理(ORA-00904和the objects were exported by ABC not by you)

最近负责搭建某系统的用户环境,其中涉及从测试环境导入数据,由于受客观因素制约,不能使用传输表空间方法同步,因此需要用imp/exp或数据泵的方法,这里采用的是imp/exp.下面记录操作过程中碰到的问题. 问题1:exp导出时ORA-00904: "IFREEPOOL": invalid identifier和"OLEVEL": invalid identifier错误 第一次操作时: 用于执行imp/exp的版本是:10.2.0.4 用于导出的数据库版本是:10.