Rethinking the Memory Hierarchy for Modern Languages
-
摘要:
- 内存安全语言(memory-safe language):向编程人员隐藏了内存布局,用于阻止内存损坏错误,并且能够启用自动内存管理机制。例如java, Go,Rust
- 论文提出了一种新的存储层级结构:Hotpads(热的便签本,类似于cache)
- 向软件隐藏了内存布局,并且帮助管理内存布局,从而消除了传统的平面地址空间抽象
- 该结构避免了使用 组相连缓存(associative caches)
- 该结构能够跨越直接寻址内存的层次结构移动对象
- 该结构会重写指针以避免大多数的关联查找
- 该结构为内存分配提供了硬件支持
- 该结构统一了分层垃圾收集和数据放置(data placement)
- 结果:大幅度改善了存储性能和效率,同时解锁了更多其它新的优化
-
介绍:
- 现代编程语言的差异:
- C,Fortran等语言向编程人员提供了平面的内存地址空间(flat memory address space),允许用户进行不安全的内存操作,例如执行任意的指针算法,访问任意的内存位置。(memory-unsafe)
- Java,Go等语言,不想用户暴露原生的指针,也不允许用户访问任意的内存地址。(memory-safe)
- 内存安全(memory safety):能够改善可编程性(避免了内存破坏,简化内存管理),但是需要额外的开销,这些开销主要来源于 存储系统和高级语言语义之间的不匹配而导致的(语义鸿沟,semantic gap)
- 减少语义鸿沟问题的已有技术:加速常见的操作。例如类型检查,基于对象的寻址和保护。这些技术仍旧在传统的内存层次结构中。
- 本文的关键见解:内存安全语言会向程序员隐藏内存布局信息,程序员无法直接使用原生的内存地址,只能够看到抽象数据类型(ADT),也仅仅只能够对ADT进行解引用或者比较操作。由于这种隐藏,软件上可以进行自动的内存管理。例如GC(垃圾回收)
- Hotpads依赖于四个关键的特征:
- 隐式地基于对象的数据移动。所有用于回应存储访问的数据移动都是隐式进行的。如果核心访问一个不在L1 pad(cache)的对象,该对象会全被拷贝到L1 pad中
- 重写指针以避免相连查找。L1 pad中的对象会有指针指向L1 pad之外的对象。当程序解引用这些指针时,硬件上会自动的将这些指针重写为这个对象在L1中的位置。随后对同样指针的解引用就不会进行相连查找。
- 在层次结构内的对象分配。新的对象会分配到L1/Lx中,并且不需要在主存中进行后备存储,此时可以廉价的访问(无写回),而且不会产生失效
- 统一的层次垃圾回收和替换。CE(回收-踢除):当pad/cache满时,触发CE进程检测死对象,回收空间,
- 现代编程语言的差异: