zswap 数据结构维护解析

news/2025/2/26 12:47:18/

zswap 数据结构维护解析

zswap 是 Linux 内核中的一个前端压缩交换(swap)机制,它在内存中维护一个 zpool 来存储被压缩的页面,以减少磁盘 I/O 并提高性能。以下是 zswap 维护加解压相关数据结构的核心解析。

1. zswap 的核心数据结构

1.1 struct zswap_entry

zswap_entry 结构体表示 zswap 维护的每个压缩页面的元数据。

struct zswap_entry {struct rb_node rbnode;   // 用于红黑树索引struct list_head pool;   // 用于池管理pgoff_t offset;          // 页面在 swap 空间中的偏移量struct zswap_tree *tree; // 所属的 zswap 树unsigned int length;     // 压缩后数据的长度unsigned int swp_type;   // 交换设备类型unsigned int refcount;   // 引用计数
};
作用:
  • 通过 rbnode 组织为红黑树,便于高效查找。
  • offsetswp_type 用于唯一标识 swap 空间中的页面。
  • length 记录压缩后数据的大小。
  • tree 指向 zswap_tree,用于组织多个 zswap_entry

1.2 struct zswap_tree

zswap_tree 组织多个 zswap_entry,采用红黑树管理。

struct zswap_tree {struct rb_root rbroot;  // 红黑树根节点struct rw_semaphore lock; // 读写锁保护
};
作用:
  • rbroot 是存储 zswap_entry 的红黑树,支持高效插入、删除、查找。
  • lock 保护 zswap_tree,防止并发访问问题。

1.3 struct zswap_pool

zswap_pool 代表 zswap 运行时管理的一个压缩池,支持多个池。

struct zswap_pool {struct list_head list;  // 链接到 `zswap_pools` 全局链表struct zpool *zpool;    // 关联的 zpool 实例struct crypto_comp *tfm; // 压缩算法实例(如 LZO, ZSTD)struct work_struct release_work; // 释放任务char tfm_name[CRYPTO_MAX_ALG_NAME]; // 算法名称int refcount;           // 引用计数
};
作用:
  • zpool 负责实际存储压缩数据。
  • tfm 是加密 API 提供的压缩上下文。
  • release_work 用于释放 zswap_pool
  • refcount 记录被使用的计数。

2. zswap 关键操作流程

2.1 页面压缩并存储流程

  1. 检查页面是否适合压缩

    • 通过 zswap_frontswap_store() 处理 swap 出的页面。
    • 计算 swap type 和 offset,检查是否已经存在于 zswap_tree
  2. 压缩页面

    • 选择合适的 zswap_pool 进行存储。
    • 调用 crypto_comp_compress() 进行压缩。
  3. 存入 zpool

    • 调用 zpool_malloc() 分配空间。
    • 将压缩数据存入 zpool,并记录 zswap_entry
  4. 更新 zswap_tree

    • 通过 rb_insert_color() 插入红黑树。

2.2 页面解压读取流程

  1. 查找 zswap_entry

    • 通过 zswap_frontswap_load() 根据 swap type 和 offset 查询 zswap_tree
  2. zpool 读取并解压

    • 通过 zpool_map_handle() 获取压缩数据。
    • 调用 crypto_comp_decompress() 进行解压。
  3. 恢复到物理页

    • 将解压后的数据写回物理内存。
  4. 移除 zswap_entry(可选)

    • 如果页面不再需要保留,则从 zswap_tree 中删除。

3. 相关源码文件

  • mm/zswap.c:主逻辑,包括 zswap_entryzswap_tree 维护。
  • mm/zpool.c:实现 zpool,用于存储压缩数据。
  • crypto/ 目录:压缩算法,如 crypto/lzo.c

4. 总结

zswap 通过 zswap_entryzswap_treezswap_pool 维护压缩数据的存储与查询,结合 zpool 高效管理物理内存。其核心流程依赖于红黑树进行索引,加解压过程由 crypto_comp_compress()crypto_comp_decompress() 执行。


http://www.ppmy.cn/news/1575007.html

相关文章

0084.基于springboot+vue的医患档案管理系统

一、系统说明 基于springbootvue的医患档案管理系统,系统功能齐全, 代码简洁易懂,适合小白学编程。 二、系统架构 前端:vue|elementui 后端:springboot| mybatis 环境:jdk1.8 | mysql8.0 | maven 三、相关功能介绍 1.登录、注…

小程序高度问题背景scss

不同的机型&#xff0c;他的比例啥的都会不一样&#xff0c;同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…

排序算法归类整理对比

以下是常见排序算法的详细分类和解析&#xff0c;涵盖原理、时间复杂度及适用场景&#xff1a; 一、比较排序算法 1. 快速排序&#xff08;Quick Sort&#xff09; 原理&#xff1a;分治策略&#xff0c;选取基准元素&#xff08;pivot&#xff09;&#xff0c;将数组分为小于…

django校园互助平台~源码

博主介绍&#xff1a;✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

elkan K-Means算法

简介 在计算向量相似度时,常用 近似最近邻(ANN, Approximate Nearest Neighbor)算法 来加速查询向量的搜索。其中,较为知名的 ANN 算法包括 HNSW、Ivfflat、Ivfpq 和 Ivfsq。在 IVF(倒排索引,Inverted File Index) 类型的算法中,Elkan K-Means 算法是较为经典的方法之…

AI知识架构之数据采集

数据采集 数据格式: 结构化数据:以固定格式和结构存储,如数据库中的表以及 Excel 表格,易于查询和分析。半结构化数据:有一定结构但不如结构化数据严格,XML 常用于数据交换,JSON 在 Web 应用中广泛用于数据传输和存储。非结构化数据:无预定义结构,文本、图像、音频和视…

大语言模型学习路径与开源模型推荐

互联网各领域资料分享专区(不定期更新): Sheet 正文 一、入门级开源模型推荐 1. GPT-2(小参数版) 特点:由OpenAI推出,117M参数的版本对硬件要求较低,适合新手理解生成式模型的基本原理(如自回归生成、注意力机制)。学习方向:可尝试文本生成、对话模拟等任务,结合论…

git 命令 设置别名

在Git中&#xff0c;您可以通过以下命令查看所有的alias&#xff08;别名&#xff09;&#xff1a; git config --get-regexp alias 这个命令会列出所有配置的alias&#xff0c;例如&#xff1a; alias.st.status alias.co.checkout alias.br.branch ... 如果您想查看某个特定a…