最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Nginx中基本的內(nèi)存池初始化配置

 更新時(shí)間:2016年07月13日 17:41:38   作者:zeyu203  
Nginx由其自己實(shí)現(xiàn)的內(nèi)存池結(jié)構(gòu)對內(nèi)存進(jìn)行管理,這里我們就來詳解Nginx的基本內(nèi)存池初始化配置,需要的朋友可以參考下

ngx_cycle 的初始化
整個(gè)初始化過程中,最重要的就是全局變量 nginx_cycle 的初始化,很多變量都是在這個(gè)過程中初始化的

nginx_cycle 又是通過兩個(gè)局部變量 init_cycle 和 cycle 實(shí)現(xiàn)初始化的

事實(shí)上,日志初始化也可以算是對 nginx_cyle 的初始化,因?yàn)樵诖a中接下來馬上要發(fā)生的就是一個(gè)賦值

ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));
init_cycle.log = log;
ngx_cycle = &init_cycle;

// 創(chuàng)建內(nèi)存池 1KB
init_cycle.pool = ngx_create_pool(1024, log);
if (init_cycle.pool == NULL) {
 return 1;
}

// 保存調(diào)用參數(shù)到全局變量,init_cycle 只用于提供 log 參數(shù)
if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {
 return 1;
}

// 保存配置文件路徑、程序運(yùn)行路徑、調(diào)用參數(shù)到 init_cycle
if (ngx_process_options(&init_cycle) != NGX_OK) {
 return 1;
}

// 獲取操作系統(tǒng)信息、CPU信息、最大連接數(shù)、是否支持非阻塞連接等
if (ngx_os_init(log) != NGX_OK) {
 return 1;
}

/*
 * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()
 */

// 對齊校驗(yàn)表
if (ngx_crc32_table_init() != NGX_OK) {
 return 1;
}

// 獲取所有繼承連接fd的相關(guān)信息
if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {
 return 1;
}

 

內(nèi)存池
nginx 是通過資源集中管理的方式管理資源的,即打開所有即將要用的資源,以備隨時(shí)取用,無論是文件還是內(nèi)存

這樣做的好處是避免了每次創(chuàng)建、打開資源造成的性能消耗

因此,便有了內(nèi)存池模塊,用來集中申請內(nèi)存資源并進(jìn)行內(nèi)存資源的管理和分配

內(nèi)存池結(jié)構(gòu):

// struct ngx_pool_data_t
// 內(nèi)存池?cái)?shù)據(jù)塊結(jié)構(gòu) {{{
typedef struct {
 u_char    *last;  // 當(dāng)前內(nèi)存分配的結(jié)束位置
 u_char    *end;  // 內(nèi)存池的結(jié)束位置
 ngx_pool_t   *next;  // 下一內(nèi)存池
 ngx_uint_t   failed; // 內(nèi)存分配失敗計(jì)數(shù)
} ngx_pool_data_t; // }}}
// struct ngx_pool_s
// 內(nèi)存池結(jié)構(gòu) {{{
struct ngx_pool_s {
 ngx_pool_data_t  d;  // 內(nèi)存池?cái)?shù)據(jù)塊
 size_t    max;  // 待分配內(nèi)存大小
 ngx_pool_t   *current; // 指向當(dāng)前內(nèi)存池起始位置
 ngx_chain_t   *chain;
 ngx_pool_large_t  *large; // 指向大塊內(nèi)存分配
 ngx_pool_cleanup_t *cleanup; // 析構(gòu)函數(shù)
 ngx_log_t   *log;  // 內(nèi)存分配相關(guān)的log
}; // }}}

在這個(gè)函數(shù)中,使用了一個(gè)封裝好的函數(shù) ngx_memalign,這個(gè)函數(shù)是對系統(tǒng)中按照數(shù)據(jù)對齊方式分配內(nèi)存的函數(shù)的封裝,在不同的系統(tǒng)中實(shí)現(xiàn)方式不同,通過宏定義,實(shí)現(xiàn)了操作系統(tǒng)的適配,這是一個(gè)很漂亮的技巧

#if (NGX_HAVE_POSIX_MEMALIGN)
// void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
// 用數(shù)據(jù)對齊的方式進(jìn)行內(nèi)存分配 {{{
void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
 void *p;
 int err;
 // size 單位是 byte 而不是 bit
 err = posix_memalign(&p, alignment, size);
 if (err) {
  ngx_log_error(NGX_LOG_EMERG, log, err,
      "posix_memalign(%uz, %uz) failed", alignment, size);
  p = NULL;
 }
 ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,
     "posix_memalign: %p:%uz @%uz", p, size, alignment);
 return p;
} // }}}
#elif (NGX_HAVE_MEMALIGN)
// void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
// 用數(shù)據(jù)對齊的方式進(jìn)行內(nèi)存分配 {{{
void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)

所有有關(guān)內(nèi)存分配的系統(tǒng)調(diào)用函數(shù)的封裝都定義在 ngx_alloc.c 文件中

這里用到了 posix_memalign 系統(tǒng)調(diào)用,使用這個(gè)系統(tǒng)調(diào)用分配出來的內(nèi)存是默認(rèn)按照第二個(gè)參數(shù)的大小對齊的,這樣在進(jìn)行數(shù)據(jù)讀寫的時(shí)候,CPU可以周期地對整塊數(shù)據(jù)進(jìn)行讀寫,很大程度的節(jié)省了CPU時(shí)間

這個(gè)系統(tǒng)調(diào)用所分配的內(nèi)存也是存在于堆內(nèi)存中的,可以使用 free 函數(shù)進(jìn)行釋放,不過 malloc 分配的內(nèi)存默認(rèn)也是對齊的,它相對于 malloc 的優(yōu)勢僅僅在于可以指定默認(rèn)對齊大小。
函數(shù)完成了內(nèi)存池的初步分配,執(zhí)行后 pool 取值:

$23 = (ngx_pool_t *) 0x80fe9f0
(gdb) p *init_cycle.pool
$24 = {
 d = {
 last = 0x80fea18, 
 end = 0x80fedf0, 
 next = 0x0, 
 failed = 0
 }, 
 max = 984, 
 current = 0x80fe9f0, 
 chain = 0x0, 
 large = 0x0, 
 cleanup = 0x0, 
 log = 0x80e3020 <ngx_log>
}

如下圖所示:

2016713173754271.png (698×939)

相關(guān)文章

  • 詳解nginx進(jìn)程鎖的實(shí)現(xiàn)

    詳解nginx進(jìn)程鎖的實(shí)現(xiàn)

    nginx是多進(jìn)程并發(fā)模型的應(yīng)用,但為了網(wǎng)絡(luò)請求的安全性,必須要使用到鎖,那么這個(gè)進(jìn)程鎖如何實(shí)現(xiàn)呢
    2021-06-06
  • 升級nginx以支持http2的方法

    升級nginx以支持http2的方法

    本篇文章主要介紹了升級nginx以支持http2的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • centos7編譯安裝nginx的方法步驟

    centos7編譯安裝nginx的方法步驟

    這篇文章主要介紹了centos7編譯安裝nginx的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • 使用nginx設(shè)置代理服務(wù)器

    使用nginx設(shè)置代理服務(wù)器

    今天小編就為大家分享一篇關(guān)于使用nginx設(shè)置代理服務(wù)器,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Windows下Nginx+PHP5的安裝與配置方法

    Windows下Nginx+PHP5的安裝與配置方法

    Nginx 是一個(gè)輕量級的高性能 Http WebServer,以事件驅(qū)動(dòng)方式編寫,因此相比 Apache 而言,Nginx 更加穩(wěn)定、性能更好,而且配置簡單,資源占用較低。
    2010-06-06
  • Nginx日志分割實(shí)戰(zhàn)

    Nginx日志分割實(shí)戰(zhàn)

    Nginx默認(rèn)沒有提供對日志文件的分割功能,本文主要介紹了Nginx日志分割實(shí)戰(zhàn),分割Nginx日志的方法有很多,這里推薦利用Logrotate來完成,感興趣的可以了解一下
    2024-03-03
  • Nginx 403 forbidden的解決辦法

    Nginx 403 forbidden的解決辦法

    這篇文章主要介紹了Nginx 403 forbidden的解決辦法,,需要的朋友可以參考下
    2014-03-03
  • Nginx防盜鏈的3種方法

    Nginx防盜鏈的3種方法

    Nginx防盜鏈的3種方法,需要的朋友可以參考下。
    2010-12-12
  • 圖文詳解nginx日志切割的實(shí)現(xiàn)

    圖文詳解nginx日志切割的實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于nginx日志切割實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Nginx和GeoIP模塊讀取IP所在的地域信息方法

    Nginx和GeoIP模塊讀取IP所在的地域信息方法

    今天小編就為大家分享一篇Nginx和GeoIP模塊讀取IP所在的地域信息方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

娱乐| 碌曲县| 泉州市| 河北区| 湖北省| 凌源市| 漳浦县| 砚山县| 玛纳斯县| 武隆县| 中阳县| 穆棱市| 临朐县| 县级市| 来安县| 襄城县| 开封县| 育儿| 泽普县| 中宁县| 千阳县| 河东区| 长兴县| 安平县| 甘泉县| 甘谷县| 葵青区| 浮梁县| 溧水县| 伽师县| 迭部县| 长海县| 镇巴县| 潍坊市| 房山区| 鲁甸县| 安新县| 页游| 松滋市| 白朗县| 华蓥市|