当前位置: 首页 > backend >正文

Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【六、架构全景图与最佳实践】

Mysql InnoDB 底层架构设计、功能、原理、源码系列合集

一、InnoDB 架构先导。【模块划分,各模块功能、源码位置、关键结构体/函数】

二、内存结构核心 - 缓冲池与性能加速器

三、日志系统 - 事务持久化的基石

四、事务引擎核心 - MVCC与锁机制

五、InnoDB 高阶机制与实战调优

六、架构全景图与最佳实践


前言

MySQL InnoDB存储引擎作为现代关系型数据库的基石,其核心机制直接影响数据库的性能表现和可靠性。本文将深入剖析InnoDB的组件联动流程、参数调优策略和常见问题诊断,从工作原理、流程细节到源码实现进行系统性分析,帮助您构建一个高效、稳定的MySQL数据库环境。

一、组件联动流程图

1.1 SELECT语句执行流程
InnoDB_引擎层
MySQL_Server层
O_DIRECT模式
普通模式
访问Buffer Pool
数据页在缓存中?
通过B+树/AHI定位数据
从磁盘读取数据页
双写缓冲区检查
先写双写缓冲区
加载数据页到Buffer Pool
插入LRU链表midpoint
应用MVCC机制
访问Undo Log构建可见版本
获取共享锁S锁
读取数据
释放S锁
返回数据
连接器
客户端连接
认证通过?
解析器
拒绝连接
语法分析/词法分析
优化器
选择执行计划
执行器
Server层返回结果
客户端

SELECT语句的完整执行路径从MySQL Server层到InnoDB存储引擎层,涉及多个关键组件的协作:

  1. Server层处理
  • 连接器:验证客户端连接
  • 解析器:进行语法分析和词法分析
  • 优化器:选择最优执行计划,包括索引选择
  • 执行器:调用InnoDB存储引擎接口
  1. InnoDB引擎层处理
  • Buffer Pool:首先检查目标数据页是否在内存缓存中
  • 索引访问:若命中缓存,通过B+树或自适应哈希索引(AHI)定位数据
  • MVCC控制:根据事务版本号,通过Undo Log回溯到可见版本
  • 锁机制:获取共享锁(S锁)确保数据一致性
  • 数据返回:从缓存中读取数据,释放锁后返回结果
  1. 未命中缓存处理
  • 磁盘读取:通过操作系统读取数据页到Buffer Pool
  • 双写缓冲区:若开启O直接影响模式,先写入双写缓冲区
  • LRU链表管理:将新加载的页插入LRU链表的 midpoint
  • 锁释放:读取完成后释放锁,提高并发性能

SELECT执行流程的源码分析

// Server层执行SELECT的入口函数
void ha_innodb::external_lock(THD *thd, bool write) {// 获取S锁(共享锁)mysql_lock_table(thd, table_list, F蜀锁, 0);
}// InnoDB引擎层的索引查询函数
rec_t *btr cur search to leaf(dict Index_t *index,const dtuple_t *tuple,ulint方向,/* BTRCUR search方向等 */bool使用AHI) {// 首先尝试使用自适应哈希索引(AHI)加速查询if (使用AHI && dict Index has hash index(index)) {// AHI命中时直接返回记录return dict Index hash search(index, tuple);}// AHI未命中时,通过B+树进行搜索return btr cur search to leaf Bplus tree(index, tuple,方向);
}
1.2 UPDATE语句执行流程
后台处理
InnoDB_引擎层
MySQL_Server层
O_DIRECT模式
普通模式
是且页未缓存
Page Cleaner线程
自适应刷新脏页
双写缓冲区写入
最终写入表空间
Change Buffer合并
读取目标页时/系统空闲
应用更新到数据页
访问Buffer Pool
数据页在缓存中?
通过B+树定位数据
从磁盘读取数据页
双写缓冲区检查
先写双写缓冲区
加载数据页到Buffer Pool
插入LRU链表midpoint
获取排他锁X锁
修改数据标记脏页
写Undo Log
写Redo Log到Log Buffer
修改非聚簇索引?
记录到Change Buffer
继续
事务提交
Redo Log刷盘策略
释放X锁
连接器
客户端连接
认证通过?
解析器
写入Binlog
语法分析/词法分析
优化器
选择执行计划
执行器
Server层返回结果
客户端

UPDATE语句的完整执行路径更为复杂,涉及写操作、事务处理和日志管理:

  1. Server层处理
  • 连接器:验证客户端连接
  • 解析器:进行语法分析和词法分析
  • 优化器:选择最优执行计划,包括索引选择
  • 执行器:调用InnoDB存储引擎接口
  1. InnoDB引擎层处理
  • Buffer Pool:检查目标数据页是否在内存缓存中
  • 磁盘读取:若未命中缓存,从磁盘加载数据页到Buffer Pool
  • 锁机制:获取排他锁(X锁)确保数据独占访问
  • 数据修改:在内存中修改数据,标记为脏页
  • Undo Log:记录修改前的旧值,用于MVCC和事务回滚
  • Redo Log:将修改记录写入Log Buffer,确保事务持久性
  • Change Buffer:若修改非聚簇索引且页未缓存,暂存更新操作
  • 事务提交:根据innodb_flush_log_at_trx_commit参数将Redo Log刷盘
  • Binlog写入:写入二进制日志文件,用于主从复制
  • 锁释放:事务提交后释放X锁
  1. 后台处理
  • 脏页刷新:Page Cleaner线程根据自适应刷新算法将脏页刷入磁盘
  • Change Buffer合并:在适当时机(如页被读入缓存或系统空闲)将暂存的更新操作合并到目标页
  • 双写缓冲区:若开启O直接影响模式,先写入双写缓冲区再写入磁盘

UPDATE执行流程的源码分析

// InnoDB引擎层的更新操作函数
void row_update(dict Index_t *index,const dtuple_t *tuple,const dtuple_t *,const dtuple_t *new tuple,ulint方向,/* BTRCUR search方向等 */bool使用AHI,bool is insert) {// 获取X锁(排他锁)mysql_lock_table(thd, table_list, F排他锁, 0);// 将修改前的数据写入Undo Logundo_log Write Old Row(undo log, tuple);// 更新缓存中的数据page Modify Row缓存页, tuple,, new tuple);// 将修改记录写入Redo Loglog Write Row Modify(log buffer, page, tuple);// 若修改非聚簇索引且页未缓存,使用Change Bufferif (is secondary index && page未在缓存中) {change_buffer Add Entry(index, tuple);}// 事务提交时处理if (事务提交) {// 刷盘Redo Loglog Buffer刷盘();// 写入Binlogbinlog Write Record();// 释放锁mysql_unlock_table(thd, table_list);}
}
1.3 组件联动全景图

InnoDB存储引擎的核心组件及其联动关系如下:

组件功能与SELECT/UPDATE的交互关键参数
Buffer Pool数据和索引缓存SELECT直接读取,UPDATE修改innodb_buffer_pool_size
innodb_buffer_pool_instances
Log BufferRedo Log缓存UPDATE写入修改记录innodb_log_buffer_size
Redo Log事务持久化UPDATE写入修改记录,SELECT不涉及innodb_log_file_size
innodb_flush_log_at_trx_commit
Undo Log事务回滚和MVCCUPDATE写入修改前数据,SELECT读取旧版本innodb_rollback_segment_size
innodb_old_blocks_time
Change Buffer非聚簇索引更新缓存UPDATE暂存未命中缓存的索引修改innodb_change_buffer_max_size
innodb_old_blocks_pct
自适应哈希索引(AHI)加速索引查询SELECT查询加速innodb_adaptive_hash_index
锁管理保证并发一致性SELECT获取S锁,UPDATE获取X锁innodb_lock Wait_timeout
Page Cleaner线程脏页刷新UPDATE后后台刷新脏页innodb_max_dirty_pages_pct
innodb_io_capacity

组件联动全景图

关键流程说明

  • SELECT流程:从Server层解析开始,通过Buffer Pool缓存命中率决定是否需要磁盘I/O,AHI加速查询,MVCC通过Undo Log提供版本控制。
  • UPDATE流程:涉及Buffer Pool、锁管理、Undo Log、Redo Log和Change Buffer的协同工作,确保事务的ACID特性。
  • 后台流程:Page Cleaner线程根据自适应刷新算法,将脏页和Change Buffer中的修改异步刷入磁盘,避免阻塞前台操作。

二、参数调优清单

2.1 内存分配黄金比例

InnoDB内存分配的核心是平衡性能与资源利用率,主要涉及Buffer Pool和Log Buffer的配置:

  1. Buffer Pool调优
  • 推荐值:专用数据库服务器上,建议设置为物理内存的50%-80%
  • 配置示例
[mysqld]
innodb_buffer_pool_size = 80G  # 假设物理内存为100GB
innodb_buffer_pool_instances = 4  # 根据CPU核心数设置
  • 监控指标
    • Innodb_buffer_pool_read_requests:缓存读取请求总数
    • Innodb_buffer_poolreads:缓存未命中导致的磁盘读取次数
    • 缓存命中率计算
      (1 - Innodb_buffer_poolreads / Innodb_buffer_pool_read_requests) * 100
  1. Log Buffer调优
  • 推荐值:一般不超过32MB,高并发写入场景可适当增大
  • 配置示例
[mysqld]
innodb_log_buffer_size = 32M
  • 监控指标
    • Innodb_log_waits:等待Log Buffer空间的次数
    • Innodb_log_writes:Log Buffer刷盘次数
  1. 其他内存组件
  • 锁表:自动管理,无需手动配置
  • 插入缓冲区:与Change Buffer类似,但仅用于插入操作

内存分配黄金比例总结

  • Buffer Pool:占物理内存的50%-80%
  • Log Buffer:占物理内存的0.01%-0.05%(约16-32MB)
  • 其他组件:占物理内存的5%-10%
2.2 写密集型场景配置

写密集型场景需要优化InnoDB的写入性能和资源利用率,关键参数包括:

  1. Change Buffer配置
  • 作用:暂存非聚簇索引的更新操作,减少磁盘I/O
  • 推荐值:25%-50%(根据工作负载调整)
  • 配置示例
[mysqld]
innodb_change_buffer_max_size = 50
innodb_change_buffering = all  # 缓存所有类型操作
  • 监控指标
    • Innodb_change_buffer_size:Change Buffer总大小
    • Innodb_change_buffer Merger:合并操作次数
  1. IO容量规划
  • SSD环境
[mysqld]
innodb_io_capacity = 20000
innodb_io_capacity_max = 50000

HDD环境

[mysqld]
innodb_io_capacity = 200
innodb_io_capacity_max = 1000
  • IO线程数
[mysqld]
innodb_read_io_threads = 4
innodb_write_io_threads = 8  # 写密集型场景增加写线程
  1. 事务提交与日志配置
  • Redo Log刷盘策略
[mysqld]
innodb_flush_log_at_trx_commit = 2  # 平衡性能与安全
  • 脏页刷新策略
[mysqld]
innodb_maxDirtyPagesPct = 75
innodb_maxDirtyPagesPctLwm = 30  # 自适应刷新低水位线
  • 直接I/O模式
[mysqld]
innodb_flush_method = O直接影响  # SSD推荐
  1. 锁与并发控制
  • 锁等待超时
[mysqld]
innodb_lock Wait_timeout = 50

写密集型场景参数调优总结

  • Change Buffer:最大化其利用率,但需监控合并速度
  • IO线程:SSD环境增加写线程数,HDD环境保持平衡
  • 日志配置:优化Redo Log刷盘策略,平衡性能与数据安全
  • 内存分配:确保Buffer Pool足够大,减少磁盘访问
2.3 内存分配与写密集型场景的源码分析

InnoDB内存管理的核心是**buf_pool_t**结构,负责管理Buffer Pool的分配和释放:

// Buffer Pool结构定义
struct buf_pool_t {ulint size;  // 缓冲池总大小ulint chunk_size;  // 每个块大小ulint instances;  // 缓冲池实例数// 其他成员...
};// 分配缓冲池的函数
void buf_pool Create(ulint size,ulint instances) {// 创建多个缓冲池实例for (ulint i = 0; i < instances; i++) {buf_pool_t *pool = ut malloc...// 初始化每个实例}
}

写密集型场景的优化逻辑

// 自适应刷新算法的核心函数
double buf_flush_get_desired_flush_rate() {// 根据Redo Log空间使用情况计算刷新速率if (modified_age >= innodb_adaptive_flushing_lwm) {double lsn_age_factor = modified_age / max_modified_age;desired_flush_rate = lsn_age_factor * innodb_io_capacity_max;}// 根据脏页比例计算刷新速率if (innodb_maxDirtyPagesPctLwm > 0) {double dirty_pct =脏页比例;if (dirty_pct >= innodb_maxDirtyPagesPctLwm) {double dirty_age_factor = (dirty_pct - innodb_maxDirtyPagesPctLwm) / (innodb_maxDirtyPagesPct - innodb_maxDirtyPagesPctLwm);desired_flush_rate = MAX(desired_flush_rate, dirty_age_factor * innodb_io_capacity);}}// 返回计算后的刷新速率return desired_flush_rate;
}

Change Buffer的合并逻辑

// Change Buffer合并函数
void change_buffer Merge(dict Index_t *index,页_t *page) {// 获取该页的Change Buffer条目change_buffer_entry_t *entry = change_buffer Find Entry(index, page);// 如果找到条目,合并到目标页if (entry) {// 执行合并操作...change_buffer Remove Entry(entry);}
}

三、常见问题诊断

3.1 表空间膨胀

表空间膨胀是InnoDB环境中常见的性能问题,主要表现为.ibdibdata1文件快速增长。

  1. 常见原因
  • 撤销表空间过大:未提交事务过多或事务回滚段不足
  • 独立表空间碎片:频繁增删数据导致页未释放
  • 共享表空间增长innodb_file_per_table=OFF时所有表数据集中存储
  • 大文本字段存储TEXT/BLOB字段未分区或存储策略不当
  1. 诊断方法
  • 监控表空间大小
-- 查看表空间使用情况
SELECT TABLESPACE_NAME, FILE_NAME, TABLESPACE_SIZE, DATA_SIZE, INDEX_SIZE
FROM information_schema/files
WHERE ENGINE = 'InnoDB';
  • 分析撤销表空间
-- 查看撤销表空间使用情况
SHOW TABLE STATUS LIKE '%innodb_rollback%';
  • 检查碎片化程度
-- 查看表空间碎片信息
SELECT * FROM information_schema.innodb_tablespaces;
  1. 修复方案
  • 清理撤销表空间
-- 优化表空间释放撤销空间
OPTIMIZE TABLE 表名;
  • 调整回滚段大小
[mysqld]
innodb_rollback_segment_size = 128M  # 增大回滚段容量
  • 碎片化表修复
-- 重建表空间释放碎片
ALTER TABLE 表名 ENGINE=InnoDB;
  • 监控与预防
-- 定期检查表空间增长
CREATE EVENT check_tablespace事件
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
+ - 检查并记录表空间大小...
END;
  1. 源码分析
  • 撤销表空间管理
// 回滚段创建函数
void trx_rseg_mem_create(Rseg_header *header) {// 从磁盘读取回滚段头部数据// 创建回滚段内存对象// 初始化insertUndoList和updateUndoList
}
  • 表空间扩展逻辑
// 表空间扩展函数
ibuf Extend TableSpace(dict TableSpace_t *tableSpace,ulint extentSize) {// 根据AUTOEXTEND_SIZE参数扩展表空间...
}
3.2 AUTOEXTEND_SIZE设置

AUTOEXTEND_SIZE控制InnoDB表空间自动扩展的步长,直接影响表空间管理效率。

  1. 配置机制
  • 设置方式:通过innodb_data_file_path参数指定
  • 默认值:1MB(当页大小为16KB时)
  • 配置示例
[mysqld]
innodb_data_file_path = ibdata1:12M;ibdata2:100M:AUTOEXTEND_SIZE=4M
  1. 与页大小的关系
  • 页大小影响AUTOEXTEND_SIZEinnodb_page_size相关
    • 默认页大小16KB:AUTOEXTEND_SIZE=1M(64页)
    • 页大小32KB:AUTOEXTEND_SIZE=2M(64页)
    • 页大小64KB:AUTOEXTEND_SIZE=4M(64页)
  • 设置限制innodb_page_size只能在初始化时指定,生产环境无法修改
  1. 性能影响
  • 小步长:频繁扩展,增加元数据管理开销
  • 大步长:减少扩展频率,但可能导致空间浪费
  • 推荐值:一般设为4M或8M,平衡扩展频率和空间利用率
  1. 监控与优化
  • 监控表空间增长
-- 监控表空间自动扩展情况
SELECT TABLESPACE_NAME, FILE_NAME, TABLESPACE_SIZE, DATA_SIZE, INDEX_SIZE
FROM information_schema/files
WHERE ENGINE = 'InnoDB' AND TABLESPACE_NAME IS NOT NULL;
  • 优化扩展策略
-- 为特定表设置独立表空间
CREATE TABLE 表名 (...) ENGINE=InnoDB TABLESPACE='表名';
3.3 Redo Log大小优化

Redo Log是InnoDB事务持久化的关键机制,其大小设置直接影响数据库性能和恢复时间。

  1. Redo Log结构与作用
  • 结构:由两个或多个文件(ib_logfile0ib_logfile1等)组成,循环使用
  • 作用:记录所有修改操作,确保崩溃后数据可恢复
  • 性能影响
    • 过小:频繁切换,增加I/O开销
    • 过大:恢复时间延长,内存占用增加
  1. 优化策略
  • 推荐值:设置为innodb_buffer_pool_size的25%-50%
    • 示例:若Buffer Pool为100GB,Redo Log建议设为25-50GB
  • 配置示例
[mysqld]
innodb_log_file_size = 25G  # 适合大Buffer Pool环境
  • 事务提交策略
[mysqld]
innodb_flush_log_at_trx_commit = 1  # 强一致性但性能较低
# 或
innodb_flush_log_at_trx_commit = 2  # 平衡性能与安全
  1. 源码分析
  • Redo Log写入逻辑
// Redo Log写入函数
void log Write Row Modify(log_buffer_t *log_buffer,const dtuple_t *tuple) {// 将修改记录写入Log Buffer...// 当Log Buffer满时或事务提交时刷盘...
}
  • Redo Log空间管理
// Redo Log空间检查函数
bool log Space Is Full() {// 检查当前Redo Log空间是否耗尽...// 触发检查点机制释放空间...
}
  1. 常见问题与解决方案
  • 问题:Redo Log频繁写满导致性能波动
  • 解决方案
    • 增大innodb_log_file_size
    • 优化事务提交策略(如innodb_flush_log_at_trx_commit=2
    • 监控并调整innodb_maxDirtyPagesPct参数

四、综合调优策略与最佳实践

4.1 不同负载场景的调优方案

根据负载类型选择不同的参数调优策略

  1. 写密集型场景
  • 内存分配
    • Buffer Pool:70%-80%物理内存
    • Log Buffer:32MB(高并发场景可增至64MB)
  • 写优化参数
    • innodb_change_buffer_max_size=50
    • innodb_old_blocks_pct=30
    • innodb_old_blocks_time=1000
    • innodb_flush_method=O_DIRECT(SSD环境)
  • IO优化
    • innodb_read_io_threads=4
    • innodb_write_io_threads=8(SSD环境可增至16)
    • innodb_io_capacity=20000(SSD环境)
  1. 读密集型场景
  • 内存分配
    • Buffer Pool:80%-90%物理内存
    • Log Buffer:16MB(足够应对读操作)
  • 读优化参数
    • innodb_old_blocks_pct=40(保留更多热数据)
    • innodb_old_blocks_time=1000(延长热数据保留时间)
    • innodb_adaptive_hash_index=ON(默认开启)
  • IO优化
    • innodb_read_io_threads=8
    • innodb_write_io_threads=4
    • innodb_flush_method=fsync(利用操作系统缓存)
  1. 混合负载场景
  • 内存分配
    • Buffer Pool:60%-70%物理内存
    • Log Buffer:24MB
  • 参数优化
    • innodb_old_blocks_pct=35
    • innodb_old_blocks_time=1000
    • innodb_change_buffer_max_size=30(平衡读写)
  • IO优化
    • innodb_read_io_threads=6
    • innodb_write_io_threads=6
    • innodb_io_capacity=10000(SSD环境)
4.2 常见问题预防与应急处理

预防措施

  • 定期备份:使用全量备份+增量备份策略
  • 监控表空间增长:设置定期检查事件
  • 优化事务设计:避免长事务,减少锁持有时间
  • 设置合理的**innodb_maxDirtyPagesPct**:防止脏页比例过高
  • 监控Redo Log空间使用:设置预警阈值

应急处理

  • 表空间膨胀
    • 尝试OPTIMIZE TABLE释放空间
    • 若无法优化,考虑ALTER TABLE ... DISCARD TABLESPACE后重建
    • 紧急情况下可使用innodb_force_recovery参数强制启动
  • Redo Log空间不足
    • 临时增大innodb_log_file_size
    • 减少innodb_maxDirtyPagesPct加快脏页刷新
    • 检查是否有未提交的长事务并终止
  • 崩溃恢复
    • 根据innodb_force_recovery参数逐步尝试启动
    • 从模式1开始,逐步增加到模式4
    • 避免使用模式5和6,除非数据极度重要且无备份

五、总结与展望

InnoDB存储引擎的组件联动机制是理解其工作原理的关键。通过本篇对SELECT/UPDATE语句完整执行路径的分析,您可以清晰地看到数据如何在内存与磁盘之间流动,以及各组件如何协同工作保证事务的ACID特性。

参数调优是提升InnoDB性能的核心手段。内存分配黄金比例(Buffer Pool占50%-80%,Log Buffer占0.01%-0.05%)为不同场景提供了基础配置指南。写密集型场景的优化参数组合(如增大Change Buffer、调整IO线程数、设置合理的脏页刷新策略)可以帮助您应对高并发写入负载。

常见问题诊断是确保数据库稳定运行的重要保障。表空间膨胀可通过OPTIMIZE TABLE或调整innodb_rollback_segment_size解决;AUTOEXTEND_SIZE的设置需结合页大小和表空间管理策略;Redo Log大小优化则需平衡性能与数据安全。

未来展望

  • 随着存储技术的发展,InnoDB的自适应刷新机制可能会进一步优化,以更好地适应NVMe等高性能存储设备。
  • 崩溃恢复流程可能会引入更多智能化的判断机制,减少对innodb_force_recovery参数的依赖。
  • 内存管理机制可能会更加精细化,提高Buffer Pool的利用率和命中率。

实战建议

  • 在实际生产环境中,应根据存储设备类型、负载特征和业务需求,合理配置相关参数。
  • 建立完善的监控和备份机制,定期检查数据库健康状态。
  • 对于关键业务,考虑使用RAID配置和带电池缓存的RAID卡,进一步提高数据安全性。

通过深入理解InnoDB的架构和工作机制,结合合理的参数调优和问题诊断,您可以构建一个高效、稳定、可靠的MySQL数据库环境,满足各种业务场景的需求

http://www.xdnf.cn/news/18503.html

相关文章:

  • ArcGIS Pro 安装路径避坑指南:从崩溃根源到规范实操(附问题修复方案)
  • 在 CentOS 7 上搭建 OpenTenBase 集群:从源码到生产环境的全流程指南
  • SpringMVC相关自动配置
  • 第四十三天(JavaEE应用ORM框架SQL预编译JDBCMyBatisHibernateMaven)
  • 算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路
  • Vue 3 useModel vs defineModel:选择正确的双向绑定方案
  • [特殊字符] 在 Windows 新电脑上配置 GitHub SSH 的完整记录(含坑点与解决方案)
  • 简单留插槽的方法
  • 生成一个竖直放置的div,宽度是350px,上面是标题固定高度50px,下面是自适应高度的div,且有滚动条
  • 航空复杂壳体零件深孔检测方法 - 激光频率梳 3D 轮廓检测
  • FFMPEG相关解密,打水印,合并,推流,
  • 鸿蒙中Snapshot分析
  • Vue3+ElementPlus倒计时示例
  • 应用服务器和数据库服务器的区别
  • 机器学习案例——预测矿物类型(数据处理部分)
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk
  • `sudo apt update` 总是失败
  • Linux问答题:调优系统性能
  • 李宏毅NLP-12-语音分类
  • 基于Labview的旋转机械AI智能诊断系统
  • 2015-2018年咸海流域1km归一化植被指数8天合成数据集
  • html-docx-js 导出word
  • Linux问答题:归档和传输文件
  • 探秘北斗卫星导航系统(BDS):架构、应用与未来蓝图,展现中国力量
  • 文件系统挂载详细分析(《图解Linux内核》虚拟文件系统篇笔记二)
  • UDP报文的数据结构
  • 可转换债券高频交易Level-2五档Tick级分钟历史数据分析
  • 20250823解决荣品RD-RK3588-MID核心板的底板的adb不通
  • 超越基础:Glide 高级优化与自定义实战
  • 12.Shell脚本修炼手册--函数的基础认知与实战演练(fock炸弹!!)