<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 內存池[](http://tengine.taobao.org/book/chapter_10.html#id1 "永久鏈接至標題") [](http:// "點擊提交Issue,反饋你的意見...") ### 簡介:[](http://tengine.taobao.org/book/chapter_10.html#id2 "永久鏈接至標題") Nginx里內存的使用大都十分有特色:申請了永久保存,抑或伴隨著請求的結束而全部釋放,還有寫滿了緩沖再從頭接著寫.這么做的原因也主要取決于Web Server的特殊的場景,內存的分配和請求相關,一條請求處理完畢,即可釋放其相關的內存池,降低了開發中對內存資源管理的復雜度,也減少了內存碎片的存在. 所以在Nginx使用內存池時總是只申請,不釋放,使用完畢后直接destroy整個內存池.我們來看下內存池相關的實現。 [](http:// "點擊提交Issue,反饋你的意見...") ### 結構:[](http://tengine.taobao.org/book/chapter_10.html#id3 "永久鏈接至標題") [](http:// "點擊提交Issue,反饋你的意見...") struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain_t *chain; ngx_pool_large_t *large; ngx_pool_cleanup_t *cleanup; ngx_log_t *log; }; struct ngx_pool_large_s { ngx_pool_large_t *next; void *alloc; }; typedef struct { u_char *last; u_char *end; ngx_pool_t *next; ngx_uint_t failed; } ngx_pool_data_t; ![](https://box.kancloud.cn/2015-08-12_55cb06b256f42.PNG) [](http:// "點擊提交Issue,反饋你的意見...") ### 實現:[](http://tengine.taobao.org/book/chapter_10.html#id4 "永久鏈接至標題") 這三個數據結構構成了基本的內存池的主體.通過ngx_create_pool可以創建一個內存池,通過ngx_palloc可以從內存池中分配指定大小的內存。 [](http:// "點擊提交Issue,反饋你的意見...") ngx_pool_t * ngx_create_pool(size_t size, ngx_log_t *log) { ngx_pool_t *p; p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log); if (p == NULL) { return NULL; } p->d.last = (u_char *) p + sizeof(ngx_pool_t); p->d.end = (u_char *) p + size; p->d.next = NULL; p->d.failed = 0; size = size - sizeof(ngx_pool_t); p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL; p->current = p; p->chain = NULL; p->large = NULL; p->cleanup = NULL; p->log = log; return p; } 這里首申請了一塊大小為size的內存區域,其前sizeof(ngx_pool_t)字節用來存儲ngx_pool_t這個結構體自身自身.所以若size小于sizeof(ngx_pool_t)將會有coredump的可能性。 我們常用來分配內存的有三個接口:ngx_palloc,ngx_pnalloc,ngx_pcalloc。 分別來看下它們的實現: [](http:// "點擊提交Issue,反饋你的意見...") void * ngx_palloc(ngx_pool_t *pool, size_t size) { u_char *m; ngx_pool_t *p; if (size <= pool->max) { p = pool->current; do { m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT); if ((size_t) (p->d.end - m) >= size) { p->d.last = m + size; return m; } p = p->d.next; } while (p); return ngx_palloc_block(pool, size); } return ngx_palloc_large(pool, size); } void * ngx_pnalloc(ngx_pool_t *pool, size_t size) { u_char *m; ngx_pool_t *p; if (size <= pool->max) { p = pool->current; do { m = p->d.last; if ((size_t) (p->d.end - m) >= size) { p->d.last = m + size; return m; } p = p->d.next; } while (p); return ngx_palloc_block(pool, size); } return ngx_palloc_large(pool, size); } void * ngx_pcalloc(ngx_pool_t *pool, size_t size) { void *p; p = ngx_palloc(pool, size); if (p) { ngx_memzero(p, size); } return p; } ngx_pcalloc其只是ngx_palloc的一個封裝,將申請到的內存全部初始化為0。 ngx_palloc相對ngx_pnalloc,其會將申請的內存大小向上擴增到NGX_ALIGNMENT的倍數,以方便內存對齊,減少內存訪問次數。 Nginx的內存池不僅用于內存方面的管理,還可以通過`ngx_pool_cleanup_add`來添加內存池釋放時的回調函數,以便用來釋放自己申請的其他相關資源。 從代碼中可以看出,這些由自己添加的釋放回調是以鏈表形式保存的,也就是說你可以添加多個回調函數來管理不同的資源。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看