`
Poechant
  • 浏览: 229494 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24321
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22103
社区版块
存档分类
最新评论

Nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c

 
阅读更多

Nginx源码完全注释(1)ngx_alloc.h / ngx_alloc.c


首先看 ngx_alloc.h 文件,主要声明或宏定义了 ngx_alloc,ngx_calloc,ngx_memalign,ngx_free。


/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#ifndef _NGX_ALLOC_H_INCLUDED_
#define _NGX_ALLOC_H_INCLUDED_


#include <ngx_config h=""><span class="preprocessor" style="color: rgb(136, 0, 0); ">#include </span><ngx_core h=""><span class="keyword" style="font-weight: bold; ">void</span> *ngx_alloc(size_t size, ngx_log_t *log);
<span class="keyword" style="font-weight: bold; ">void</span> *ngx_calloc(size_t size, ngx_log_t *log);

<span class="comment" style="color: rgb(136, 136, 136); ">// 宏命名 free 为 ngx_free,Nginx 的习惯</span>
<span class="preprocessor" style="color: rgb(136, 0, 0); ">#define ngx_free          free</span>


<span class="comment" style="color: rgb(136, 136, 136); ">/*
 * Linux has memalign() or posix_memalign()
 * Solaris has memalign()
 * FreeBSD 7.0 has posix_memalign(), besides, early version's malloc()
 * aligns allocations bigger than page size at the page boundary
 */</span>

<span class="preprocessor" style="color: rgb(136, 0, 0); ">#if (NGX_HAVE_POSIX_MEMALIGN || NGX_HAVE_MEMALIGN)</span>

<span class="keyword" style="font-weight: bold; ">void</span> *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log);

<span class="preprocessor" style="color: rgb(136, 0, 0); ">#else</span>

<span class="preprocessor" style="color: rgb(136, 0, 0); ">#define ngx_memalign(alignment, size, log)  ngx_alloc(size, log)</span>

<span class="preprocessor" style="color: rgb(136, 0, 0); ">#endif</span>

<span class="comment" style="color: rgb(136, 136, 136); ">// 声明三个可以被外部使用的变量</span>
<span class="keyword" style="font-weight: bold; ">extern</span> ngx_uint_t  ngx_pagesize;
<span class="keyword" style="font-weight: bold; ">extern</span> ngx_uint_t  ngx_pagesize_shift;
<span class="keyword" style="font-weight: bold; ">extern</span> ngx_uint_t  ngx_cacheline_size;


<span class="preprocessor" style="color: rgb(136, 0, 0); ">#endif /* _NGX_ALLOC_H_INCLUDED_ */</span>
</ngx_core></ngx_config>

再来看 ngx_alloc.c,实现了内存分配函数 ngx_alloc,ngx_calloc,ngx_


/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#include <ngx_config h=""><span class="preprocessor" style="color: rgb(136, 0, 0); ">#include </span><ngx_core h="">


ngx_uint_t  ngx_pagesize;
ngx_uint_t  ngx_pagesize_shift;
ngx_uint_t  ngx_cacheline_size;

<span class="comment" style="color: rgb(136, 136, 136); ">/*
 * 封装malloc,增加分配失败判断及调试日志
 */</span>
<span class="keyword" style="font-weight: bold; ">void</span> *
ngx_alloc(size_t size, ngx_log_t *log)
{
    <span class="keyword" style="font-weight: bold; ">void</span>  *p;

    p = malloc(size);
    <span class="keyword" style="font-weight: bold; ">if</span> (p == NULL) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      <span class="string" style="color: rgb(136, 0, 0); ">"malloc(%uz) failed"</span>, size);
    }

    <span class="comment" style="color: rgb(136, 136, 136); ">/* 在编译时指定debug模式是否开启,如果不开启则此句仅是括号中的逗号表达式 */</span>
    ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, <span class="number" style="color: rgb(0, 136, 0); ">0</span>, <span class="string" style="color: rgb(136, 0, 0); ">"malloc: %p:%uz"</span>, p, size);

    <span class="keyword" style="font-weight: bold; ">return</span> p;
}

<span class="comment" style="color: rgb(136, 136, 136); ">/*
 * 封装ngx_alloc,如果分配成功,初始化为0
 */</span>
<span class="keyword" style="font-weight: bold; ">void</span> *
ngx_calloc(size_t size, ngx_log_t *log)
{
    <span class="keyword" style="font-weight: bold; ">void</span>  *p;

    p = ngx_alloc(size, log);

    <span class="comment" style="color: rgb(136, 136, 136); ">/* 初始化为 0 */</span>
    <span class="keyword" style="font-weight: bold; ">if</span> (p) {
        ngx_memzero(p, size);
    }

    <span class="keyword" style="font-weight: bold; ">return</span> p;
}


<span class="preprocessor" style="color: rgb(136, 0, 0); ">#if (NGX_HAVE_POSIX_MEMALIGN)</span>

<span class="comment" style="color: rgb(136, 136, 136); ">// 封装 posix_memalign,如果是 Solaris 则封装 memalign</span>
<span class="keyword" style="font-weight: bold; ">void</span> *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
    <span class="keyword" style="font-weight: bold; ">void</span>  *p;
    <span class="keyword" style="font-weight: bold; ">int</span>    err;

    <span class="comment" style="color: rgb(136, 136, 136); ">/*
     * 背景:
     *      1)POSIX 1003.1d
     *      2)POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于
     *      任何的C类型来说都是对齐的
     * 功能:由posix_memalign分配的内存空间,需要由free释放。
     * 参数:
     *      p           分配好的内存空间的首地址
     *      alignment   对齐边界,Linux中,32位系统是8字节,64位系统是16字节
     *      size        指定分配size字节大小的内存
     *
     * 要求:
     *      1)要求alignment是2的幂,并且是p指针大小的倍数
     *      2)要求size是alignment的倍数
     * 返回:
     *      0       成功
     *      EINVAL  参数不满足要求
     *      ENOMEM  内存分配失败
     * 注意:
     *      1)该函数不影响errno,只能通过返回值判断
     *
     */</span>
    err = posix_memalign(&amp;p, alignment, size);

    <span class="keyword" style="font-weight: bold; ">if</span> (err) {
        ngx_log_error(NGX_LOG_EMERG, log, err,
                      <span class="string" style="color: rgb(136, 0, 0); ">"posix_memalign(%uz, %uz) failed"</span>, alignment, size);
        p = NULL;
    }

    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, <span class="number" style="color: rgb(0, 136, 0); ">0</span>,
                   <span class="string" style="color: rgb(136, 0, 0); ">"posix_memalign: %p:%uz @%uz"</span>, p, size, alignment);

    <span class="keyword" style="font-weight: bold; ">return</span> p;
}

<span class="preprocessor" style="color: rgb(136, 0, 0); ">#elif (NGX_HAVE_MEMALIGN)</span>

<span class="keyword" style="font-weight: bold; ">void</span> *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
    <span class="keyword" style="font-weight: bold; ">void</span>  *p;

    <span class="comment" style="color: rgb(136, 136, 136); ">// 与 posix_memalign 的不同是其将分配好的内存块首地址做为返回值</span>
    p = memalign(alignment, size);
    <span class="keyword" style="font-weight: bold; ">if</span> (p == NULL) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      <span class="string" style="color: rgb(136, 0, 0); ">"memalign(%uz, %uz) failed"</span>, alignment, size);
    }

    ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, <span class="number" style="color: rgb(0, 136, 0); ">0</span>,
                   <span class="string" style="color: rgb(136, 0, 0); ">"memalign: %p:%uz @%uz"</span>, p, size, alignment);

    <span class="keyword" style="font-weight: bold; ">return</span> p;
}

<span class="preprocessor" style="color: rgb(136, 0, 0); ">#endif</span>
</ngx_core></ngx_config>

-

转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant

-

分享到:
评论

相关推荐

    ngx_devel_kit-0.3.0

    ngx_devel_kit,简称NDK,是一款专为Nginx设计的第三方模块开发工具,其核心目的是简化和加速Nginx模块的开发过程。在Nginx的生态系统中,NDK扮演着至关重要的角色,它提供了一系列的API和宏,帮助开发者更高效地...

    Nginx源代码分析.pdf

    主要在 os/unix/ngx_alloc.{h,c} 和 core/ngx_palloc.{h,c} 下。其中 os/unix/ngx_alloc.{h,c} 封装了最基本的内存分配函数,是对 C 原有的 malloc/free/memalign 等原有的函数的封装,對應的函数為: * ngx_alloc ...

    Nginx源码剖析

    ### Nginx源码剖析:进程模型、内存管理与请求处理 #### 1.1 Nginx 的进程模型 Nginx 是一款广泛使用的高性能 Web 和反向代理服务器,其核心设计之一是高效的进程模型。Nginx 采用的是 Master-Worker 模型,其中...

    Nginx源代码分析

    Nginx对C语言的字符串类型进行了简单的封装,core/ngx_string.h/c里面包含这些封装的内容。包括: * ngx_str_t:字符串类型,包含字符串长度和字符串数据 * ngx_keyval_t:键值对类型,包含键和值的字符串 * ngx_...

    nginx slab内存管理精简源码及注释

    通过把nginx slab的精简,把需要的头文件单独整理出来,增加了main方法,可以单独运行,代码包含了大量的中文注释,方便了了解和学习slab的运行机制 int main(int argc, char **argv) { ngx_log_t log; ngx_shm_t ...

    nginx源码分析--带注释

    在本文中,我们将深入探讨Nginx的源代码分析,主要关注那些被特别注释的部分,以帮助我们更好地理解和利用这个高性能的Web服务器和反向代理。Nginx以其高效、稳定和模块化的架构而闻名,是许多大型网站和应用程序的...

    Nginx 内存模型.

    ### Nginx内存模型详解 #### 一、引言 Nginx作为一款高性能的Web服务器及反向代理服务器,在其设计与实现中充分考虑到了性能优化的重要性。尤其是在内存管理方面,Nginx采取了一种非常高效的方式,既保证了程序...

    nginx中一个请求的count计数跟踪浅析.docx

    当一个HTTP请求到达时,Nginx会创建一个新的请求对象,通过`ngx_http_alloc_request`函数,此时`count`属性被初始化为1。这表示当前请求是一个顶级请求,没有父请求。 2. **模块处理与子请求创建**: 请求进入...

    自实现nginx-palloc的内存池

    Nginx使用了一种称为“内存池”的特殊内存分配策略,名为`ngx_palloc`,以提高内存分配和释放的效率,减少碎片并优化性能。本文将深入探讨“自实现nginx-palloc的内存池”这一主题,揭示其设计原理、优势以及如何...

    Nginx常见错误

    17. **`"ngx_slab_alloc() failed: no memory in SSL session shared cache"`**:SSL session cache大小不足。 18. **`"could not add new SSL session to the session cache while SSL handshaking"`**:无法将新的...

Global site tag (gtag.js) - Google Analytics