10 nginx 中的 slab

news/2024/5/14 14:17:45/文章来源:https://blog.csdn.net/u011039332/article/details/125838947

前言

这里主要是描述 nginx 中的 slab 内存分配相关 

slab 在很多的地方都有使用, 比如 linux, nginx, netty 等等 

主要的作用是 内存管理, 复用 

简略 nginx 中的 slab 的流程

# slab relatedvoid* poolPtr = malloc(2048);ngx_slab_pool_t *pool = (ngx_slab_pool_t *)poolPtr;ngx_slab_init(pool);void* allocatedPtr = ngx_slab_alloc(pool, 36);int x = 0;x += 1;poolPtr = allocatedPtr;# 如果 sz 的 shift 为 ngx_slab_exactly_shift则使用 page->slab 来存储当前 page 的 n 个 entry 是否被使用bitmap 的数量为 1, 使用 page->slab 来表示前面 m 个 entry 为 bitmap 的位置, m 的计算方式为 (ngx_page_size / (1 << shift)) / ((1 << shift) * 8)(ngx_page_size / (1 << shift)) 为 entry 的数量每一个 entry 中存在 (1 << shift) 个 byte, 合计 ((1 << shift) * 8) bit因此需要的 m 为 (ngx_page_size / (1 << shift)) / ((1 << shift) * 8)在计算 bitmap[i] 的时候, n + 1 是因为当前申请了一块空间, 将这块额外的空间 置为 usedpage->slab 中存放的是 shift
# 如果 sz 的 shift < ngx_slab_exactly_shift则使用 page->bitmap 来存储当前 page 的 n 个 entry 是否被使用bitmap 的数量计算来自于 (ngx_page_size / (1 << shift)) / (8 * sizeof(uint_ptr))
# 如果 sz 的 shift > ngx_slab_exactly_shift如果是 shift > ngx_slab_exactly_shift, 则能够存放的 entry 数量必定小于等于 32page->slab 高32bit 存放的是 bitmappage->slab 低32bit 存放的是 shiftngx_slab_exactly_shift = 6
ngx_page_size = 4096
page->slab 类型为 uint_ptr 长度为 64
ngx_slab_exactly_shift 为 6, 一个空间占用 64byte, uint_ptr 有 64 bit, 总共可以表示 4096 byte, 因此 ngx_slab_exactly_shift 为 6

nginx 中的 slab 空间的分配

1. 如果 size 大于 ngx_slab_max_size[为 1/2 * pageSize] 

直接以页为单位 来分配空间 

2. 计算 shift 以及 slot 

shift 指代的是存储 size 的最小的 2的n次幂空间 的对数[即为n] 

slot 指代的是当前 slab 中存储当前 shift 对应的  slot 

假设需求空间为 27b, page->min_shift 为 3, 则存储 27b 的最小的 2的n次幂空间 为 32 

shift 为 5 

page->min_shift 为 3 表示最小以 8b 为单位申请空间, 那么这里的 slot 为 2

slot[0] 存放的是申请的 8b 的 page 列表, slot[1] 存放的是申请的 16b 的 page 列表, slot[2] 存放的是申请的 32b 的 page 列表

3. 假设我们需要新申请一个 page 

3.1 假设 shift < ngx_slab_exact_shift[为6], 即 size < 64b 

那么此时维护当前 page 的 bitmap 需要使用前 n 个 entry[每一个 entry 占用 (2 << shift) byte]

当前 page 总共会有 (ngx_pagesize / (2 << shift)) 个 entry 

那么 n 为 ((ngx_pagesize / (2 << shift)) / ((2 << shift) * 8)) 

然后下面初始化 bitmap, 下面的 bitmap[0] ~ btimap[i] 的处理, 指代的是 bitmap 中前 (n + 1) 个 entry 已经被使用[因为 bitmap 本身需要占用这一部分的空间, 分配空间的时候不能分配这部分空间, 标记为已经使用] 

bitmap[i+1] - bitmap[map-1] 指代的是 n+1 以后的 entry 可用 

然后 下面 page-> slab 记录的是 shift, 更新 slot 的相关引用, 以及对应的统计 等等 

返回 bitmap 占用空间之后的第一个 entry 给调用方 

画个图来配合理解一下 

3.2 假设 shift = ngx_slab_exact_shift[为6], 即 size = 64b 

使用 page->slab 来维护当前 page 的 bitmap 

返回当前 page 的起始空间给调用方 

3.3 假设 shift > ngx_slab_exact_shift[为6], 即 size > 64b

那么此时 能够存储的 entry 的数量一定是 <= 32, 因此使用 page->slab 的高 32bit 存放 bitmap, 低 32 bit 存放 shift 

返回当前 page 的起始空间给调用方 

 4. 假设是基于已有的 page 进行空间分配  

4.1 假设 shift < ngx_slab_exact_shift[为6], 即 size < 64b 

轮询 bitmap 找到可以分配的空间的索引, 更新给定的bitmap[idx]为已经使用, 然后将给定的空间的地址返回回去 

如果当前 page 空间已经被全部使用, 从 slots[slot] 中 unlink 

4.2 假设 shift = ngx_slab_exact_shift[为6], 即 size = 64b 

轮询 bitmap 找到可以分配的空间的索引, 更新给定的bitmap[idx]为已经使用, 然后将给定的空间的地址返回回去 

如果当前 page 空间已经被全部使用, 从 slots[slot] 中 unlink 

4.3 假设 shift > ngx_slab_exact_shift[为6], 即 size > 64b

轮询 bitmap 找到可以分配的空间的索引, 更新给定的bitmap[idx]为已经使用, 然后将给定的空间的地址返回回去 

如果当前 page 空间已经被全部使用, 从 slots[slot] 中 unlink 

nginx 中的 slab 空间的释放

1. 根据地址确定属于哪一个 page, 并且确定 page 的类型 

根据 p 的偏移进行计算 所在 page 的索引, 然后根据 page 中存储的类型信息确定类型 

2. 假设 类型为 SMALL, 即 size < 64b 

根据 p 计算 页内 偏移, 计算当前元素的 entry 的索引 

查询 bitmap 当前 entry 是否已经被释放 

如果还未被释放, 释放当前 entry, link 当前 page 到 slots[slot] 

如果当前 page 空间已经全部被释放, 归还 page 到 free, 更新 stats 

3. 假设 类型为 EXACTLY, 即 size = 64b 

根据 p 计算 页内 偏移, 计算当前元素的 entry 的索引 

查询 bitmap 当前 entry 是否已经被释放 

如果还未被释放, 释放当前 entry, link 当前 page 到 slots[slot] 

如果当前 page 空间已经全部被释放, 归还 page 到 free, 更新 stats 

4. 假设 类型为 BIG, 即 size > 64b 

根据 p 计算 页内 偏移, 计算当前元素的 entry 的索引 

查询 bitmap 当前 entry 是否已经被释放 

如果还未被释放, 释放当前 entry, link 当前 page 到 slots[slot] 

如果当前 page 空间已经全部被释放, 归还 page 到 free, 更新 stats 

4. 假设 类型为 PAGE, 即 size > pageSize/2 

nginx 中 slab 的内存布局

pool 中内存边界为 [&pool, pool->end] 

n 为 ngx_pagesize_shift - pool->min_shift, 总共的 slot 的数量 

pages 为 ((pool->end - &pool) - (n * sizeof(ngx_slab_page_t)) - (n * sizeof(ngx_slab_stat_t))) / (ngx_page_size + sizeof(ngx_slab_page_t)) 

ngx_slab_pool_t 的元数据
n 个 slots
n 个 slot_page
pages 个 slot_stats
pages 个 page 存储真实的数据 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9278.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch深度学习——线性回归实现 04(未完)

文章目录1 问题假设2 步骤3 学习使用Pytorch的API来搭建模型3.1 nn.Model3.2 优化器类3.3 评估模式和训练模式3.4 使用GPUdata和item的区别1 问题假设 假设我们的基础模型就是y wxb&#xff0c;其中w和b均为参数&#xff0c;我们使用y 3x0.8来构造数据x、y,所以最后通过模型…

0.django部署(基础知识)

我们前面的代码都是在我们自己的电脑&#xff08;通常是Windows操作系统&#xff09;上面运行的&#xff0c;因为我们还处于开发过程中。 当我们完成一个阶段的开发任务后&#xff0c;就需要把我们开发的网站服务&#xff0c;给真正的用户使用了。 那就需要我们的 网站 部署在…

【二次分配问题】基于遗传算法 (GA)、粒子群优化 (PSO) 和萤火虫算法 (FA) 求解二次分配( QAP)问题(MATLAB 实现)

目录 1 概述 3 Matlab代码及文章阅读 4 运行结果 4.1 萤火虫算法 4.2 粒子群优化算法 4.3 遗传算法 5 参考文献 1 概述 目前&#xff0c;该问题已经得到深入的研究&#xff0c;进化策略(evolutionstrategies)、遗传算法(genetic algorithms)、遗传规划(geneticprogramm…

警惕利用「以太坊合并」的 3 种骗局

原文作者&#xff1a;茉莉 距离以太坊合并还有不到 6 小时&#xff0c;这条被视作下一代互联网 Web3.0 底层基础设施的区块链网络将彻底改变共识机制&#xff0c;从工作量证明的 PoW 机制转向权益证明的 PoS。 在合并即将到来前&#xff0c;去中心化安全网络市场 PolySwarm 创…

各语言转wasm-js调用

起源是 我司应该是抄袭某家player , 也用wasm做的 , 所以我也研究一下 关于标题 我估计需要大家一起完善了 , 我只会讲一下 go c 别的都不会 webassembly( wasm ) 可以编译的如图 我想起我这边应用啊 也就无非播放器~~ 本地文件压缩啊加密啊或直接就上传了, 或者在操作数据…

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1

RestHighLevelClient创建索引时报错[299 Elasticsearch-7.12.1出现原因 : 这是因为在使用create方法时 , 会有两个选择 , 其中一个已经过时了 client.indices().create(request, RequestOptions.DEFAULT); 其中的create方法 , 有两个版本 , 有一个显示已经过时了 , 两个方法虽然…

蜂蜜什么时候喝,才可以获得蜂蜜更大的好处?真可以治疗咳嗽?

中秋节刚过去不久&#xff0c;家里面的礼品多的是不是可以开超市了?中国人讲究一个“礼”字&#xff0c;逢年过节、探望故友病友手里不带点东西就会难受。中秋节这样带有美好祝愿的节日自然也是中国人送礼的最佳时间之一。 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过…

Google Chrome Privacy Sandbox All In One

Google Chrome Privacy Sandbox All In OneGoogle Chrome Privacy Sandbox All In OneGoogle Chrome 隐私沙盒chrome://settings/privacySandbox With Privacy Sandbox trials, sites can deliver the same browsing experience using less of your info. That means more priv…

需要在html中加CSS,怎么加

在html中加CSS有三种方式 一种是直接写到标签上的style属性里面 <divid"mydiV"style"width:200px;border:1pxsolid#f00;margin:0;"></div> 一种是写到head标签里面的style标签里面 <styletype"text/css"> #mydiV{ width:2…

C++ 01 内存模型

内存分区的示意图。一般内存主要分为&#xff1a;代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区这几个区域。 什么是代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区&#xff1f; 代码区&#xff1a;存放程序的代码&#xff0c;即CPU执…

springboot 整合dubbo3开发rest应用

一、前言 作为微服务治理生态体系内的重要框架 dubbo&#xff0c;从出身到现在历经了十多年的市场检验而依旧火热&#xff0c;除了其自身优秀的设计&#xff0c;高性能的RPC性能&#xff0c;以及依托于springcloud-alibaba的这个背后强劲的开源团队支撑&#xff0c;在众多的微…

MongoDB6安装配置详解

官网下载地址&#xff1a; https://www.mongodb.com/try/download/community?tckdocs_server 打开后是这样的&#xff1a; 鼠标滑到上图红色箭头位置&#xff0c;可以看到最新版本目前是6.0.1&#xff0c;点击download下载即可&#xff0c;这里下载的是Windows版本。 下载好后…

vue插槽---作用域插槽(三)

编译作用域:模板中的变量,在模板对应的实例中查找相应的变量和数据。通俗的说就是父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。 作用域插槽:带参数的插槽,子组件提供给父组件参数,父组件决定其展示形式替换插槽标签。 为什…

哈希原理及模拟实现并封装unordered系列关联式容器

目录一、哈希1. 哈希概念2. 哈希冲突3. 哈希函数4. 哈希冲突的解决闭散列线性探测二次探测开散列开散列与闭散列比较二、哈希表哈希表的实现三、封装unordered系列关联式容器1. 封装unordered_set2. 封装unordered_map四、哈希表的应用1. 位图概念2. 应用3. 位图的实现2. 布隆过…

springboot客户关系管理系统源码 CRM小程序源码

CRM客户关系管理系统源码 crm小程序源码 基于springbootvue MySQL数据库开发的客户关系管理系统。 客户全流程高效管理&#xff0c;客户资料管理&#xff0c;客户跟踪管理&#xff0c;订单、合同管理&#xff0c;回款及交付管理等功能。 功能介绍 1、系统管理&#xff1a;员工…

基于STM32单片机和AD9850的智能DDS函数信号发生器

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 文章目录1、整体设计2、硬件方案3、软件程序4、实物验证1、整体设计 有一天&#xff0c;我在浏览CSDN时看到一篇关于 AD9850 的帖子。AD9850是一款可以产生1hz到40mhz左右正弦波的芯片。淘宝的产品经销商能够将芯片与提供 T…

第二章-使用KNN和GBDT进行收入的预测分析

本文是《从零开始学python数据分析与挖掘》的第二章学习心得&#xff0c;相关数据可以从对应的官方数据库获取。 提供给你的只有一份收入相关的xlsx&#xff0c;你需要通过里面的数据进行年收入的预测。 1.数据预处理 首先读取数据&#xff0c;查看是否存在缺失值。对于存在…

关于模糊理论及简单应用

关于模糊理论及简单应用 1.开始 最近导师让我了解一下模糊理论,思考能不能结合现有技术实现创新点.这篇博客主要记录一下这两天对模糊理论的学习,以及做的一个小demo,希望如果有研究相关方面的大佬能留言相互交流学习. 之前用模糊c均值聚类的时候了解过scikit-fuzzy,这次发现…

(14.1)Zotero常用功能:导入题录、参考文献

(14.1)Zotero常用功能&#xff1a;导入题录、参考文献 文章目录一、插件1.1、Zotfile1.2、Zotfile配置2、translators_CN3、zotero-pdf-translate4、jasminum5、zotero-better-bibtex-Sponsor&#xff08;待更新&#xff09;二、导入题录(知网为例)三、参考文献样式1、样式选择…

隐写术——PNG文件隐藏payload

0x01 PNG文件格式 PNG文件基本上由两部分组成: 文件头、文件数据块 文件头也叫署名域 用来标识这是一个PNG格式的文件&#xff0c;8字节长度&#xff0c;固定数据:89 50 4E 47 0D 0A 1A 0A 数据块: PNG定义了两种类型的数据块: 1:关键数据块(Critical Chunk):PNG文件必须包含&…