菜鳥nginx源碼剖析資料結構篇(十一) 共用記憶體ngx_shm_t[轉]

來源:互聯網
上載者:User

標籤:des   style   blog   http   ar   使用   sp   strong   on   

菜鳥nginx源碼剖析資料結構篇(十一) 共用記憶體ngx_shm_t

 

  • Author:Echo Chen(陳斌)

  • Email:[email protected]

  • Blog:Blog.csdn.net/chen19870707

  • Date:Nov 14th, 2014

     

    1.共用記憶體

    共用記憶體是Linux下提供的最基本的進程通訊方法,它通過mmap或者shmget系統調用在記憶體中建立了一塊連續的線性地址空間,而通過munmap或者shmdt系統調用釋放這塊記憶體,使用共用記憶體的好處是多個進程使用同一塊記憶體時,在任何一個進程修改了共用記憶體中的內容後,其它進程通過訪問這段記憶體就能夠得到記憶體變化。

  • 2.原始碼位置

     

    標頭檔:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx.h

    源檔案:http://trac.nginx.org/nginx/browser/nginx/src/core/ngx_shmtx.c

     

    3.資料結構定義

    ngx_shm_t : 用於描述一塊共用記憶體:

       1: typedef struct {
       2:     u_char      *addr;            //指向共用記憶體的起始地址
       3:     size_t       size;            //共用記憶體的長度
       4:     ngx_str_t    name;            //這塊共用記憶體的名稱
       5:     ngx_log_t   *log;             //記錄日誌的ngx_log_t對象
       6:     ngx_uint_t   exists;          //表示共用記憶體是否分配過的標誌位,為1表示已經存在
       7: } ngx_shm_t;
  •  

    4.Linux 共用記憶體介面 

    共用記憶體申請mmap:

       1: #include<sys/mman.h>
       2: void*mmap(void* start,size_t length,int prot,int flags,
       3: int fd,off_t offset);

    mmap可以將磁碟檔案對應到記憶體中,直接操作記憶體時Linux核心將負責同步記憶體和磁碟檔案中的資料,fd參數就執行需要同步的磁碟檔案,而offset則代表從檔案的這個位移量處開始共用,Nginx沒有使用這一特性。當flags參數中加入MAP_ANON或者MAP_ANONYMOUS參數時表示不適用檔案對應方式,這時fd和offset參數就都沒意義了,不需要傳遞了。Nginx中就不需要同步到磁碟。

    length參數就是將要在記憶體中開闢的線性地址空間大小

    port參數表示操作這段共用記憶體的方式(唯讀或者可讀可寫)

    start參數說明希望的共用記憶體起始地址,通常設為NULL

    共用記憶體釋放munmap:

       1: #include<sys/mman.h>
       2: int munmap(void *start,size_t length);

    start所指的映射記憶體起始地址,參數length則是欲取消的記憶體大小

     

  • 5.共用記憶體的主要操作
  • 共用記憶體的主要操作有以下幾種:

  • 共用記憶體的分配 ngx_shm_alloc
    共用記憶體的釋放 ngx_shm_free
    5.1 共用記憶體的分配 ngx_shm_alloc
       1: ngx_int_t ngx_shm_alloc(ngx_shm_t *shm)
       2: {
       3:     //開闢一shm->size大小並且可讀可寫的共用記憶體,記憶體首地址放在shm->addr中
       4:     shm->addr = (u_char *) mmap(NULL, shm->size,
       5:                                 PROT_READ|PROT_WRITE,
       6:                                 MAP_ANON|MAP_SHARED, -1, 0);
       7:  
       8:     if (shm->addr == MAP_FAILED) {
       9:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
      10:                       "mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);
      11:         return NGX_ERROR;
      12:     }
      13:  
      14:     return NGX_OK;
      15: }
    •  5.2 共用記憶體釋放 ngx_shm_free
       1: void
       2: ngx_shm_free(ngx_shm_t *shm)
       3: {
       4:     //使用ngx_shm_t中的addr和size調用munmap釋放共用記憶體
       5:     if (munmap((void *) shm->addr, shm->size) == -1) {
       6:         ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
       7:                       "munmap(%p, %uz) failed", shm->addr, shm->size);
       8:     }
       9: }
  • 6.參考
  •  

  • 《深入理解Ngxin》

菜鳥nginx源碼剖析資料結構篇(十一) 共用記憶體ngx_shm_t[轉]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.