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 3.13，zswap需要通过显式指定内核引导参数为以启用。

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

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

历史

Recent developments
 In early 2008, a Linux project named zram (originally called compcache) was released; in a 2013 update, it was incorporated into Chrome OS and Android 4.4
 In 2010, IBM released Active Memory Expansion (AME) for AIX 6.1 which implements virtual memory compression.
 In 2012, some versions of the POWER7+ chip included the AME hardware accelerator for data compression support, used on AIX, for virtual memory compression.
 In December 2012, the zswap project was announced; it was merged into the Linux kernel mainline in September 2013.
 In June 2013, Apple announced that it will include virtual memory compression in OS X Mavericks, using the WKdm algorithm.
 An August 10, 2015 "Windows Insider Preview" update for Windows 10 added support for RAM compression.
zswap和zbud都由塞思·詹宁斯开发。2012年，此时代码库已经成熟，但仍标记为实验性内核功能。

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

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

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

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

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

参见 

 缓存
 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

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