国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 網(wǎng)站 > Nginx > 正文

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

2024-08-30 12:22:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
Nginx由其自己實(shí)現(xiàn)的內(nèi)存池結(jié)構(gòu)對(duì)內(nèi)存進(jìn)行管理,這里我們就來(lái)詳解Nginx的基本內(nèi)存池初始化配置,需要的朋友可以參考下

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

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

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

ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));init_cycle.log = log;ngx_cycle = &init_cycle;// 創(chuàng)建內(nèi)存池 1KBinit_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_cycleif (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() */// 對(duì)齊校驗(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 是通過(guò)資源集中管理的方式管理資源的,即打開(kāi)所有即將要用的資源,以備隨時(shí)取用,無(wú)論是文件還是內(nèi)存

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

因此,便有了內(nèi)存池模塊,用來(lái)集中申請(qǐng)內(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ù)是對(duì)系統(tǒng)中按照數(shù)據(jù)對(duì)齊方式分配內(nèi)存的函數(shù)的封裝,在不同的系統(tǒng)中實(shí)現(xiàn)方式不同,通過(guò)宏定義,實(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ù)對(duì)齊的方式進(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ù)對(duì)齊的方式進(jìn)行內(nèi)存分配 {{{void *ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宝山区| 闽侯县| 辰溪县| 依兰县| 铜陵市| 绩溪县| 陆良县| 乐至县| 祁东县| 民乐县| 宁安市| 泸西县| 庆元县| 惠安县| 奇台县| 台北县| 五大连池市| 吉隆县| 苗栗市| 通渭县| 五常市| 开化县| 宽城| 宜昌市| 云龙县| 汪清县| 乌兰县| 云阳县| 丘北县| 西和县| 修水县| 昌邑市| 吐鲁番市| 榆社县| 泗洪县| 都江堰市| 枣强县| 颍上县| 曲靖市| 江城| 高雄市|