青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Just enjoy programming

Nginx的內存池實現(轉載)

來源:http://www.tbdata.org/archives/1390#more-1390


Nginx的內存池實現得很精巧,代碼也很簡潔。總的來說,所有的內存池基本都一個宗旨:申請大塊內存,避免“細水長流”。

一、創建一個內存池

nginx內存池主要有下面兩個結構來維護,他們分別維護了內存池的頭部和數據部。此處數據部就是供用戶分配小塊內存的地方。

//該結構用來維護內存池的數據塊,供用戶分配之用。
typedef struct {
u_char *last; //當前內存分配結束位置,即下一段可分配內存的起始位置
u_char *end; //內存池結束位置
ngx_pool_t *next; //鏈接到下一個內存池
ngx_uint_t failed; //統計該內存池不能滿足分配請求的次數
} ngx_pool_data_t;
//該結構維護整個內存池的頭部信息。
struct ngx_pool_s {
ngx_pool_data_t d; //數據塊
size_t max; //數據塊的大小,即小塊內存的最大值
ngx_pool_t *current; //保存當前內存池
ngx_chain_t *chain; //可以掛一個chain結構
ngx_pool_large_t *large; //分配大塊內存用,即超過max的內存請求
ngx_pool_cleanup_t *cleanup; //掛載一些內存池釋放的時候,同時釋放的資源。
ngx_log_t *log;
};


有了上面的兩個結構,就可以創建一個內存池了,nginx用來創建一個內存池的接口是:ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t *log)(位于src/core/ngx_palloc.c中);調用這個函數就可以創建一個大小為size的內存池了。這里,我用內存池的結構圖來展 示,就不做具體的代碼分析了。

ngx_create_pool接口函數就是分配上圖這樣的一大塊內存,然后初始化好各個頭部字段(上圖中的彩色部分)。紅色表示的四個字段就是來自于上 述的第一個結構,維護數據部分,由圖可知:last是用戶從內存池分配新內存的開始位置,end是這塊內存池的結束位置,所有分配的內存都不能超過 end。藍色表示的max字段的值等于整個數據部分的長度,用戶請求的內存大于max時,就認為用戶請求的是一個大內存,此時需要在紫色表示的large 字段下面單獨分配;用戶請求的內存不大于max的話,就是小內存申請,直接在數據部分分配,此時將會移動last指針。

二、分配小塊內存(size <= max)

上面創建好了一個可用的內存池了,也提到了小塊內存的分配問題。nginx提供給用戶使用的內存分配接口有:
void *ngx_palloc(ngx_pool_t *pool, size_t size);
void *ngx_pnalloc(ngx_pool_t *pool, size_t size);
void *ngx_pcalloc(ngx_pool_t *pool, size_t size);
void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment);

ngx_palloc和ngx_pnalloc都是從內存池里分配size大小內存,至于分得的是小塊內存還是大塊內存,將取決于size的大小; 他們的不同之處在于,palloc取得的內存是對齊的,pnalloc則否。ngx_pcalloc是直接調用palloc分配好內存,然后進行一次0初 始化操作。ngx_pmemalign將在分配size大小的內存并按alignment對齊,然后掛到large字段下,當做大塊內存處理。下面用圖形 展示一下分配小塊內存的模型:

上圖這個內存池模型是由上3個小內存池構成的,由于第一個內存池上剩余的內存不夠分配了,于是就創建了第二個新的內存池,第三個內存池是由于前面兩個內存 池的剩余部分都不夠分配,所以創建了第三個內存池來滿足用戶的需求。由圖可見:所有的小內存池是由一個單向鏈表維護在一起的。這里還有兩個字段需要關 注,failed和current字段。failed表示的是當前這個內存池的剩余可用內存不能滿足用戶分配請求的次數,即是說:一個分配請求到來后,在 這個內存池上分配不到想要的內存,那么就failed就會增加1;這個分配請求將會遞交給下一個內存池去處理,如果下一個內存池也不能滿足,那么它的 failed也會加1,然后將請求繼續往下傳遞,直到滿足請求為止(如果沒有現成的內存池來滿足,會再創建一個新的內存池)。current字段會隨著 failed的增加而發生改變,如果current指向的內存池的failed達到了4的話,current就指向下一個內存池了。猜測:4這個值應該是 作者的經驗值,或者是一個統計值。

三、大塊內存的分配(size > max)

大塊內存的分配請求不會直接在內存池上分配內存來滿足,而是直接向操作系統申請這么一塊內存(就像直接使用malloc分配內存一樣),然后將這塊 內存掛到內存池頭部的large字段下。內存池的作用在于解決小塊內存池的頻繁申請問題,對于這種大塊內存,是可以忍受直接申請的。同樣,用圖形展示大塊 內存申請模型:

注意每塊大內存都對應有一個頭部結構(next&alloc),這個頭部結構是用來將所有大內存串成一個鏈表用的。這個頭部結構不是直接向操作系 統申請的,而是當做小塊內存(頭部結構沒幾個字節)直接在內存池里申請的。這樣的大塊內存在使用完后,可能需要第一時間釋放,節省內存空間,因此 nginx提供了接口函數:ngx_int_t ngx_pfree(ngx_pool_t *pool, void *p);此函數專門用來釋放某個內存池上的某個大塊內存,p就是大內存的地址。ngx_pfree只會釋放大內存,不會釋放其對應的頭部結構,畢竟頭部結 構是當做小內存在內存池里申請的;遺留下來的頭部結構會作下一次申請大內存之用。

四、cleanup資源


可以看到所有掛載在內存池上的資源將形成一個循環鏈表,一路走來,發現鏈表這種看似簡單的數據結構卻被頻繁使用。由圖可知,每個需要清理的資源都對應有一 個頭部結構,這個結構中有一個關鍵的字段handler,handler是一個函數指針,在掛載一個資源到內存池上的時候,同時也會注冊一個清理資源的函 數到這個handler上。即是說,內存池在清理cleanup的時候,就是調用這個handler來清理對應的資源。比如:我們可以將一個開打的文件描 述符作為資源掛載到內存池上,同時提供一個關閉文件描述的函數注冊到handler上,那么內存池在釋放的時候,就會調用我們提供的關閉文件函數來處理文 件描述符資源了。

五、內存的釋放

nginx只提供給了用戶申請內存的接口,卻沒有釋放內存的接口,那么nginx是如何完成內存釋放的呢?總不能一直申請,用不釋放啊。針對這個問 題,nginx利用了web server應用的特殊場景來完成;一個web server總是不停的接受connection和request,所以nginx就將內存池分了不同的等級,有進程級的內存池、connection級 的內存池、request級的內存池。也就是說,創建好一個worker進程的時候,同時為這個worker進程創建一個內存池,待有新的連接到來后,就 在worker進程的內存池上為該連接創建起一個內存池;連接上到來一個request后,又在連接的內存池上為request創建起一個內存池。這樣, 在request被處理完后,就會釋放request的整個內存池,連接斷開后,就會釋放連接的內存池。因而,就保證了內存有分配也有釋放。

總結:通過內存的分配和釋放可以看出,nginx只是將小塊內存的申請聚集到一起申請,然后一起釋放。避免了頻繁申請小內存,降低內存碎片的產生等問題

posted on 2011-06-15 16:27 周強 閱讀(567) 評論(0)  編輯 收藏 引用 所屬分類: nginx


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美1区视频| 亚洲美女精品成人在线视频| 欧美交受高潮1| 中文在线不卡| 日韩亚洲综合在线| 亚洲人www| 91久久精品国产91久久| 欧美黑人在线观看| 亚洲高清不卡| 亚洲精品四区| 亚洲视频碰碰| 99精品久久久| 亚洲视频狠狠| 中文日韩电影网站| 国产性猛交xxxx免费看久久| 欧美巨乳在线| 国产亚洲观看| 一本久久综合亚洲鲁鲁五月天| 日韩视频免费看| 欧美在线一级视频| 毛片av中文字幕一区二区| 欧美激情在线观看| 午夜视频精品| 欧美精品在线网站| 国产日韩一区二区| 一区二区三区蜜桃网| 久久久久久91香蕉国产| 亚洲人体影院| 你懂的国产精品| 国产一区二区三区自拍| 亚洲一区二区三区四区视频| 欧美91视频| 亚洲欧美成人一区二区在线电影| 麻豆成人精品| 一区在线观看| 久久综合99re88久久爱| 中文国产成人精品| 欧美日韩精品免费看| 亚洲精品一区在线观看香蕉| 久久理论片午夜琪琪电影网| 亚洲欧美日韩精品| 国产久一道中文一区| 久久欧美中文字幕| 一区二区三区日韩在线观看| 亚洲精品孕妇| 亚洲欧洲在线观看| 欧美日韩国产色站一区二区三区| 日韩视频久久| 亚洲精品美女免费| 欧美二区在线播放| 欧美精品激情| 香港成人在线视频| 欧美成人午夜激情在线| 99综合视频| 亚洲一区成人| 亚洲精品视频在线| 一区二区精品国产| 狠狠色丁香久久婷婷综合_中| 你懂的国产精品永久在线| 欧美高清视频一区| 欧美一区二区三区日韩视频| 久久精品视频免费| 亚洲尤物在线视频观看| 欧美一区二区精美| 中文在线资源观看视频网站免费不卡| 亚洲一区在线看| 一区二区三区蜜桃网| 欧美成人国产一区二区| 欧美一区1区三区3区公司| 麻豆国产精品777777在线| 亚洲欧美日韩综合国产aⅴ| 每日更新成人在线视频| 久久成人综合网| 国产精品欧美在线| 一区二区三区免费观看| 亚洲美女一区| 欧美日韩久久不卡| 亚洲精品一区二区三区婷婷月| 亚洲激情在线视频| 免费一级欧美片在线观看| 欧美大秀在线观看| 91久久精品国产| 欧美日韩国产va另类| 亚洲日本理论电影| 欧美日本国产精品| 亚洲国产精品一区二区www| 亚洲国产一区二区a毛片| 欧美成人免费在线观看| 久久综合狠狠综合久久综合88 | 欧美一区二区视频97| 黄色日韩在线| 猛男gaygay欧美视频| 亚洲国内精品在线| 亚洲视频电影在线| 国产字幕视频一区二区| 欧美激情一区| 欧美一区二区在线免费播放| 乱人伦精品视频在线观看| 亚洲精品国产精品乱码不99| 欧美天堂亚洲电影院在线播放 | 一区二区三区高清在线| 欧美人成在线| 久久久久亚洲综合| 亚洲一区制服诱惑| 亚洲国产精品视频一区| 久久久国产精彩视频美女艺术照福利| 91久久国产自产拍夜夜嗨 | 99天天综合性| 欧美成人精品一区| 久久国产精品99国产| 亚洲视频一二| 一区二区三区日韩在线观看| 亚洲日本理论电影| 亚洲第一精品影视| 国产一区二区三区的电影 | 美腿丝袜亚洲色图| 久久国产精品第一页| 亚洲欧美日韩国产综合精品二区| 亚洲精品国产视频| 亚洲激情欧美激情| 亚洲国产精品尤物yw在线观看| 久久在线免费观看视频| 久久久久青草大香线综合精品| 性欧美精品高清| 久久九九电影| 欧美aⅴ99久久黑人专区| 亚洲高清视频中文字幕| 亚洲黄色成人久久久| 激情另类综合| 欧美日韩一级黄| 国产日韩欧美综合精品| 一区二区三区在线观看欧美| 亚洲国产天堂久久国产91| 亚洲国产精品123| 亚洲毛片在线免费观看| 在线视频你懂得一区| 欧美主播一区二区三区美女 久久精品人 | 国产伪娘ts一区| 国产视频亚洲精品| 亚洲国产天堂久久综合| 亚洲综合国产| 亚洲福利视频免费观看| 性欧美办公室18xxxxhd| 欧美日韩国产天堂| 亚洲国产精品热久久| 午夜在线一区二区| 9色国产精品| 麻豆视频一区二区| 尤物视频一区二区| 亚洲视频网在线直播| 久久综合综合久久综合| 亚洲一区二区少妇| 国产精品久久久久久久久搜平片| 国产视频久久| 欧美一区二区高清在线观看| 欧美va天堂va视频va在线| 亚洲一区在线看| 国产丝袜一区二区| 久久精品99国产精品| 欧美影院在线| 亚洲黄色天堂| 亚洲啪啪91| 欧美日韩小视频| 午夜精品久久久久久久99水蜜桃 | 久久久久中文| 久久久久久久97| 亚洲免费大片| 亚洲香蕉视频| 一区二区亚洲| 亚洲狼人综合| 国产一区日韩二区欧美三区| 久久亚洲不卡| 国产精品久久久久久久7电影| 久久精品成人一区二区三区蜜臀 | 欧美日韩国产综合视频在线观看中文 | 久久久久久香蕉网| 欧美顶级大胆免费视频| 亚洲欧美久久久久一区二区三区| 午夜精品亚洲一区二区三区嫩草| 国内精品免费午夜毛片| 99国内精品久久久久久久软件| 国产亚洲欧洲| 亚洲一区二区日本| 日韩视频在线一区| 久久久999精品| 午夜在线一区二区| 久久一区欧美| 国产精品毛片a∨一区二区三区|国 | 欧美怡红院视频| 欧美激情视频一区二区三区在线播放| 欧美在线一区二区| 欧美三区在线观看| 日韩亚洲一区在线播放| 日韩视频一区二区三区| 欧美chengren| 亚洲精品自在在线观看| 日韩视频一区二区三区在线播放免费观看 | 亚洲美女电影在线| 欧美激情一区二区在线| 亚洲国产精品小视频|