Zswap

zswap是一项Linux内核的虚拟内存压缩功能，可为将要交换的页面提供压缩回写缓存。当内存页将要交换出去时，zswap不将其移动到交换设备，而是对其执行压缩，然后存储到系统RAM内动态分配的内存池中。回写到实际交换设备的动作则会延迟，甚至能完全避免，从而显著减少Linux系统用于交换的I/O；副作用则是压缩所需的额外CPU周期。

zswap能减少I/O，因而有利于使用固态存储的设备，包括嵌入式设备、上网本及其它相似的低端硬件设备，也包括其它使用SSD存储的设备。由于其固有性质，闪存的寿命有限，因而避免以其提供交换空间可防止其迅速磨损。

 内部机制 
zswap通过使用由frontswap提供的API集成入Linux内核虚拟内存子系统的剩余部分中，该接口是Linux内核中的一种机制，能对各类可用作交换空间的存储进行抽象。因此，zswap可通过提供内部可见的伪-RAM设备，以frontswap后端驱动的身份运作。换句话说，frontswap API使得zswap可在内存页交换出的时候拦截它，及已交换页面的页缺失；在获取这两个通路后，zswap便可充当交换页面的压缩回写缓存。

在内部，zswap使用由内核加密API提供的压缩模块，从而使其有可能（比如说）使用受内核支持的硬件压缩加速器，将压缩任务搬离主CPU。使用内核引导参数，开机时可以动态地选择要使用的压缩模块；缺省值为，表示使用Lempel-Ziv-Oberhumer（LZO）压缩。Linux操作系统是否默认启用zswap取决于内核编译配置时选项是否启用，此外，可以显式指定内核引导参数来覆盖这一设置。

zswap可使用的内存池最大大小可由参数配置，它指定池可占用的总系统RAM的最大百分比。内存池并非预先分配到所配置的最大尺寸；相反，它会根据要求增加和缩小。当在交换的过程中达到了配置的最大池大小，或者由于内存不足无法分配更多的池时，将会根据最近最少使用（LRU）原则，从内存池逐出交换页面到交换设备上。这种方式使zswap成为真正的交换缓存，因为一旦缓存已满，最旧的缓存页面将会被逐出到交换设备中去，因而较新的交换页面就能有空间压缩并缓存。

zbud是由zswap内部使用的专用内存分配器，用于存储压缩页面；它是Oracle zcache内部使用的zbud分配器的重写。zbud的工作原理是，在每张物理内存页中存储至多两张压缩页面（“buddies”，分配器因而得名），这既有优势（简单的空间收集及空闲空间复用）也有劣势（潜在的低内存利用率）。然而，由于它的设计，zbud分配的内存空间不会比最初未压缩页面所使用的还多。

 历史 

zswap和zbud都由塞思·詹宁斯开发。2012年，此时代码库已经成熟，但仍标记为实验性内核功能。

zswap（连同zbud）于Linux 3.11（发布于2013年9月2日）合并入Linux内核主线。

自Linux 3.15（发布于2014年6月8日）起，zswap支持多种交换设备。

自 Linux 6.8 （发布于2024年3月11日）起，zswap 支持关闭特定 cgroup 的写回功能。

 替代 
其中一个zswap的替代是zram，它向Linux内核提供了类似但有所不同的“压缩交换页面到RAM”机制。

主要区别在于，zram提供以RAM存储数据的压缩块设备，作为独立的一般交换设备。使用zram需要额外的用户空间配置（通过使用和），这样zram提供的基于RAM的交换设备才能被初始化并配置使用。正如设计的那样，zram可提供交换空间，即使是没有其他可用的交换设备，从而更适合用于未提供交换空间的系统，如嵌入式设备。

相比之下，zswap则作为基于RAM的一般交换设备的压缩缓存，运行透明，不需要用户空间额外配置。zswap提供最少使用交换页面的逐出机制，而zram不支持。尽管如此，因其设计的缘故，至少需要一个已存在的交换设备，以便为其所用。

关联项目
 2008年初，zram（最初称为compcache）的Linux项目发布，在2013年被Chrome OS和Android 4.4采用。
 2010年，IBM发布了适用于AIX 6.1的Active Memory Expansion（AME），实现了虚拟内存压缩。
 2012年，某些版本的POWER7+芯片包含了AME硬件加速器，用于AIX上的虚拟内存压缩。
 2013年6月，苹果宣布将在OS X Mavericks中使用WKdm算法包含虚拟内存压缩。
 2015年8月10日"Windows Insider Preview" Windows 10更新加入了内存压缩支持

 参见 

 缓存
 Linux swap
 固态硬盘上的交换分区

 参考 

 外部链接 
 , September 30, 2013, by Seth Jennings, IBM
 Zswap – a compressed page add-on for the Linux kswapd, March 15, 2013, University of Liege
 The Compression Cache: Virtual Memory Compression for Handheld Computers , March 16, 2000, by Michael J. Freedman

Category:用C編程的自由軟體
Category:Linux内核功能
Category:記憶體管理
Category:虚拟内存