美文网首页程序员
Nginx 内存池一行代码的分析 -- 对齐

Nginx 内存池一行代码的分析 -- 对齐

作者: 72ae6551aa0d | 来源:发表于2018-07-06 14:53 被阅读13次

在看 Nginx 内存池实现的时候,在 ngx_slab_init 函数的实现中最后有一个内存对齐的操作:

 pool->start = (u_char *)
                  ngx_align_ptr((uintptr_t) p + pages * sizeof(ngx_slab_page_t),
                                 ngx_pagesize); 

其中p是指针,ngx_pagesize是页的大小,该操作就是向前移动p使其是ngx_pagesize的整数倍,ngx_align_ptr实现如下:

#define ngx_align_ptr(p, a)                                                   \\
    (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))

这段代码着实迷惑了我一下,想了半天,才发现自己在知识的运用上还是太生疏了:

  1. 内存页都是 2 的幂,如 x86 的页是就是 4096( 即2 ^ 12,即0b1000000000000
  2. 指针是无符号数
  3. 于是问题就变成了将一个无符号整数“上调”到最近的 2 的幂(4096)的倍数

分析到这里,一下了就想到了一本神书“Hacker's Delight”(中文译作《高效算法的奥秘》),拿来一看第三章说的恰恰是这个问题!这本书在读研究生时在图书馆看过,但是只当时觉得神奇,看完了除了能『装』一下也不知道有什么用处,而『装』这个事在软件工程中总是不被提倡的,所以看了前几章也就放下了,但是这次终于『啊哈!』了一下。

对于上面宏中的paa总是 0b10000 这样的形式),先看看下调:p & -a,其实就是把p后面和a中后面 0 同样多的的位置 0,写成位操作的形式就是p & ~(a-1)

有了下调,上调就简单了,只要对p+(a-1)下调即可,即(p+(a-1)) & ~(a-1),这就是ngx_align_ptr的内容了。

总结:

  1. 知识总不嫌多,看不到实际应用是因为学识还不够
  2. 可以不记住所有细节,但是用时一定会记起出处
  3. 代码写点注释能死啊!

相关文章

  • Nginx 内存池一行代码的分析 -- 对齐

    在看 Nginx 内存池实现的时候,在 ngx_slab_init 函数的实现中最后有一个内存对齐的操作: 其中p...

  • 2.iOS底层学习之内存对齐

    学习了内存对齐之后的疑问?? 1.为啥要内存对齐?2.内存对齐的规则?3.内存对齐实例分析。 内存对齐的目的 上网...

  • nginx源码分析-内存池

    介绍 (Memory Pool)是一种内存分配方式。通常我们习惯直接使用new、malloc等API申请分配内存,...

  • 结构体内存对齐分析

    这里我们来分析结构体内存对齐方式, 从中我们可以间接的分析出在OC中内存的对齐方式大概什么样. 进行分析前我们要先...

  • 内存对齐分析

    背景 为何需要内存对齐?计算机从内存中读取数据是按照一个固定长度来的,以32位机为例,计算机每次读取内存32位(b...

  • nginx内存池

    nginx内存池 拿来主义:https://www.cnblogs.com/xiekeli/archive/201...

  • [Daozy][C 语言入门课程]第24课 常见面试题分析

    [Daozy][C 语言入门课程]第24课 常见面试题分析 当前课程对应视频:待实现 题目1:内存对齐 实例代码 ...

  • 内存对齐

    本次主要讨论三个问题: 什么是内存对齐 内存对齐的好处 如何对齐 内存对齐 内存对齐是一种提高内存访问速度的策略。...

  • 关于JS作用域链

    执行上下文 JavaScript引擎并不是一行一行的分析代码,而是一段一段的。在代码运行之前会进行内存分配,代码上...

  • 结构体内存对齐

    对象内存对齐 探讨的问题 1.什么是内存对齐?2.为什么要做内存对齐?3.结构体内存对齐规则4.源码内存对齐算法 ...

网友评论

  • 72ae6551aa0d:对了,之所以是“-a”,是因为“与”之前需要把前面的位变成1。

本文标题:Nginx 内存池一行代码的分析 -- 对齐

本文链接:https://www.haomeiwen.com/subject/jbzvuftx.html