標籤: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: }
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[轉]