文章目录
背景知识补充
文章来自HPCA 2022 第28届IEEE高性能计算机架构国际研讨会(HPCA-28),韩国首尔。
1、存储金字塔
- Cache高速缓存(包括寄存器)都是临时缓存。
- 随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。DRAM用于管理一些进程临时存储。DRAM内存颗粒,其存储组织结构为深度(Depth)加上位宽(Width)。动态随机存取存储器(DRAM)一个电容器和一个晶体管组成一对叫储存单元,需要周期性补充电子保持状态故称“动态”存储器。静态随机存取存储器(SRAM)需要6个晶体管组成一个储存单元。SRAM 快、DRAM慢。SRAM 贵、DRAM便宜。平常的内存芯片的用就是DRAM。高端的内存条都会有外壳包裹着,其实那个壳是人家的散热片也叫马甲。越是高频率的内存条一般都会加壳,频率越高,宽带越大,发热量越大。来自文章什么是内存颗粒?三星,海力士,镁光是市场三大供商内存颗粒供应商,那些高质量半导体芯片没有坏块的被原厂家保留,淘汰的称为白片卖给其他厂家,其他厂家再挑剩下坏块较多的做成了U盘。(DDR=Double Data Rate双倍速率,DDR SDRAM=双倍速率同步动态随机存储器,人们习惯称为DDR,其中,SDRAM 是Synchronous Dynamic Random Access Memory的缩写,即同步动态随机存取存储器。)
- SSD、U盘,SD卡等都是Flash结构,但其主控电路不同。
2、频率和带宽
存储器的带宽指单位时间内从存储器进出信息的最大数量。若存储器的数据总线宽度为 32 位,存取周期为 200ns ,则存储器的带
宽 =1/200ns ×32bit= 5MHz×32bit = 160 Mb/s = 20MB/ s(1 MHz = 1 0 6 H z 10^6 Hz 106Hz,1s = 1 0 6 n s 10^6ns 106ns )
3、Page 页
逻辑内存称之为页,物理内存称之为帧(page frame),由页表做映射,每个进程独立维护。操作系统通过物理地址帧来判断属于哪一层的。有的页应映射去磁盘了,产生缺页异常由用户态变为内核态(申请外部资源时发生),就去磁盘找数据,涉及页迁移与替换。
图片来自硬件茶谈视频(固态硬盘的缓存)
再补充一下用户态到内核态的几个操作,后面论文会提到相关的。读写文件:先open
,之后read
或者write
(这三个既是C内置函数名称,也是系统调用名称);申请内存(堆内存)C用malloc
,只是函数名,没有系统调用是这个名字,实际是通过brk
小于128k内存时在edata游标下申请或者mmap
,都申请的是虚拟内存空间。在第一次访问时,发现才申请的虚拟地址没有映射到物理地址,于是触发缺页中断(缺页异常)。cpp和java通过new一个对象也会经历类似过程,
- 分页使得每个程序都有很大的逻辑地址空间,通过映射磁盘和高效的置换算法,使内存“无限大”。
- 分页使不同的进程的内存隔离,保证了安全。
- 分页降低了内存碎片问题。
来自【OS】操作系统的内存管理简介
4、持久内存PM
持久内存(PMem)科普来自 memark.io 技术社区
允许应用程序直接从持久性内存中访问他们的数据,而不需要先分页到DRAM中。即可以当做内存使用,也可以当做持久化外存设备使用。对本篇文章来说有帮助的知识:
正是因为持久内存具有传统内存的特性,又兼具有外存的持久化特性,造就了其特殊的双模式使用方式。注意,两种模式不能混合使用,并且模式之间切换具有一定成本,无法做到程序运行时动态切换。文章希望将DRAM和PM配置成多层次内存系统中的独立层。
简单粗暴的内存模式(Memory Mode)
就是把持久内存直接当做内存使用,不利用其非易失特性。操作系统将会直接看到持久内存的容量,而原来的DRAM将会作为持久内存的一层cache。程序无需改动任何代码,可以直接利用持久内存的大内存优势来运行内存消耗大的应用。
内存模式使用简单,但是也带来了一些问题:
由于DRAM被当做了PM的一层cache,并且被CPU自动管理,但是PM其在性能参数上是略低于DRAM的,所以在某些对于cache不友好的情况下,可能会带来性能较大的衰减。
无法使用持久化特性。内存模式丢失了内存数据持久化的特性,无法用作对数据持久化有要求的场景。
App Direct 模式(AD Mode)
AD Mode 实际上是把内存层级完全暴露给了应用。程序员需要自己控制将数据存放在DRAM或者持久内存,自己掌握是否要进行内存数据的持久化操作。
其优势正好是克服了内存模式的两个问题:
存储层级对程序员可见,因此应用可以根据数据的特点进行存储性能优化,比如冷热数据的分级存储,以及使用缓存敏感的数据结构(cache conscious)
数据持久性在AD Mode下可用,程序员可以选择是否将数据在持久内存上做持久化操作。
5、LRU等页面置换算法
缺页中断发生时就要开始啦(本节摘取一文看懂页面置换算法)
-
最优页面置换算法(OPT、optimal)对于保存在内存当中的每一个逻辑页面,计算在它的下一次访问之前,还需要等待多长时间,从中选择等待时间最长的那个,作为被置换的页面。属于理想状况,现实无法实现。
-
先进先出算法(FIFO)系统维护着一个链表,记录了所有位于内存当中的逻辑页面。从链表的排列顺序来看,链首页面的驻留时间最长,链尾页面的驻留时间最短。当发生一个缺页中断时,把链首页面淘汰出局,并把新的页面添加到链表的末尾。即使这个页面在内存被经常调用,但它来的早也会躺枪,所以性能差。
-
最近最久未使用算法(LRU,Least Recently Used)选择最久未使用的那个页面,并淘汰之。(实现方式就是最近使用过就放最前面,放在最后的自然就是最久没使用过的)。
-
时钟页面置换算法(Clock)① 需要用到页表项当中的访问位,当一个页面被装入内存时,把该位初始化为0。然后如果这个页面被访问(读/写),则把该位置置1。② 把各个页面组织形成环形链表(类似钟表面),把指针指向最老的页面(最先进来)。③ 当发生一个缺页中断时,考察指针所指向的最老页面。若它的访问位为0,立即淘汰;若访问位为1,则把该位置为0,然后指针往下移动一格。如此下去,直到找到被淘汰的页面,然后把指针移动到它的下一格。MULTI-CLOCK通过对每个内存层分别运行Linux的页框回收算法(PFRA)的修改版(该算法基于CLOCK算法)来确定各层内和各层间的页面的相对重要性。
-
最不常用算法(LFU,Least Frequently Used)当一个缺页中断发生时,选着访问次数最少的那个页面,并淘汰之。被访问的次数也会很少。
LRU考察的是多久未访问,时间越短越好;而LFU考察的是访问的次数或频度,访问次数越多越好。这也对应着文章多次提到的性能指标frequency & recency的含义,前者指一段时间内的访问次数,后者指离上次访问过多久了。
6、字节寻址
内存的寻址粒度是Byte级别的 [字节, B,由8个位组成(bit,电子计算机中最小的数据单位。每一位的状态只有两种:0或1),字节是存储空间的基本计量单位] ,也就是说每个字节都有它的内存地址,CPU可以直接通过这个地址获取到相应的内容。对于SSD来说就不是这样了,SSD是以块的粒度来管理数据的,CPU没有办法直接访问文件中某个特定的字节。(混合内存还会用到NVM非易失性内存,人为啥有资格做内存,就是可以让软件以字节粒度进行寻址访问)
再补充一个小点:摘取自 按字寻址和按字节寻址
字一定为字节的整数倍,所以称之为字由若干个字节组成。
字的位数称为字长(字不等于字长乘以字节!字=字长×位)
比如一个8位的CPU,这里的8位指其字长为8位,即单位时间内可以处理8位二进制数,即一个字节数。
现在的CPU大部分为64位,即单位时间内可以处理64位二进制数,即8个字节数。
7、预取Prefetching
现代处理器速度的快速发展和存储器速度的慢速发展导致处理器要花费大量的时间等待存储器数据的返回,这就是存储墙问题。为了解决这些问题,已提出多种技术方案,