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

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

nginx中共享內(nèi)存的使用詳解

2024-08-30 12:24:22
字體:
供稿:網(wǎng)友

在nginx的進(jìn)程模型下,類似流量統(tǒng)計、流量控制、數(shù)據(jù)共享、等需要多個工作進(jìn)程共同配合完成任務(wù),共享內(nèi)存是一個重要的進(jìn)程通訊的方案。本文介紹在nginx的代碼中與共享內(nèi)存相關(guān)的功能,包括ngx_shmem與ngx_slab的使用與注意事項,但不包括ngx_slab中實現(xiàn)的內(nèi)存管理算法。

ngx_shmem的使用

ngx_shmem.c/h文件只是對mmap()/munmap()系統(tǒng)調(diào)用或者shmget()/shmdt()的一個很簡單的封裝。實現(xiàn)了ngx風(fēng)格的基礎(chǔ)庫,可以申請和釋放一段連續(xù)的共享內(nèi)存空間。一般用于固定長度的共享數(shù)據(jù)使用,使用過程中數(shù)據(jù)長度固定不會伸縮。

typedef struct {  u_char   *addr;  size_t    size;  ...} ngx_shm_t;ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);void ngx_shm_free(ngx_shm_t *shm);

在ngxin中共享內(nèi)存的使用流程,一般是由master進(jìn)程創(chuàng)建,worker進(jìn)程通過繼承的方式獲得內(nèi)存指針。

關(guān)于ngx_shmem的使用,可以參考ngx_event_module_init()中部分片段,這部分代碼在共享內(nèi)存中創(chuàng)建了若干個變量,用于記錄各個狀態(tài)(accepted/reading/writing...)的請求數(shù)量,并在ngx_event_module中的幾個關(guān)鍵事件入口對這幾個變量進(jìn)行加減統(tǒng)計操作。實現(xiàn)統(tǒng)計所有worker進(jìn)程當(dāng)前的請求狀態(tài)。

shm.size = size;ngx_str_set(&shm.name, "nginx_shared_zone");shm.log = cycle->log;if (ngx_shm_alloc(&shm) != NGX_OK) {  return NGX_ERROR;}shared = shm.addr;...ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl);ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl);ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl);ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl);ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl);ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl);ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl);

關(guān)于這個功能的更多細(xì)節(jié),可以查看代碼中的NGX_STAT_STUB宏定義相關(guān)代碼與ngx_http_stub_status_module。

ngx_slab的使用

ngx_shmem是一層極簡的封裝,實現(xiàn)了共享內(nèi)存的基本功能。但我們程序中大部分的場景共享數(shù)據(jù)并不會一個固定大小的結(jié)構(gòu),而更多是像ngx_array、ngx_list、ngx_queue、ngx_rbtree這類大小可以變化的數(shù)據(jù)結(jié)構(gòu)。

我們期望能有像ngx_pool_t一樣可以動態(tài)申請釋放空間一個內(nèi)存池。ngx_slab正是一個這樣的結(jié)構(gòu)體,原理上與系統(tǒng)的malloc()有相識之處都是通過一系列算法實現(xiàn)對一段段內(nèi)存片段的申請與釋放。只不過ngx_slab操作的對象是基于ngx_shmem的共享內(nèi)存。

先看一下ngx_slab的接口

typedef struct {  ngx_shmtx_t    mutex;  ...  void       *data; /* 一般存放從pool中申請獲得的根數(shù)據(jù)地址(pool中第一個申請的數(shù)據(jù)接口) */  void       *addr; /* 使用ngx_shmem申請獲得的共享內(nèi)存基地址 */} ngx_slab_pool_t;void ngx_slab_init(ngx_slab_pool_t *pool);void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);void *ngx_slab_calloc(ngx_slab_pool_t *pool, size_t size);void *ngx_slab_calloc_locked(ngx_slab_pool_t *pool, size_t size);void ngx_slab_free(ngx_slab_pool_t *pool, void *p);void ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p);            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 内乡县| 陆丰市| 新乡县| 山东省| 紫阳县| 砚山县| 长宁区| 大名县| 玉环县| 郧西县| 宝丰县| 蓬莱市| 通河县| 宁蒗| 望谟县| 丰城市| 通山县| 阿拉善右旗| 务川| 阳高县| 德保县| 时尚| 滁州市| 浦北县| 嵩明县| 彝良县| 平谷区| 阿拉善左旗| SHOW| 乐陵市| 天长市| 宾川县| 广宁县| 武宁县| 瑞丽市| 永德县| 灵璧县| 江达县| 霍城县| 金平| 黄大仙区|