2013.3.26 nginx 共享内存学习
2013-03-26 15:48
417 查看
搜索ngx_shm ngxin中出现:
#include <ngx_shmem.h>
#include <ngx_shmtx.h>
都是干啥使得呢?
ngx_shmem.h 定义了 ngx_shm_t结构体及 共享内存的实际分配及释放
typedef struct {
u_char *addr;
size_t size;
ngx_str_t name;
ngx_log_t *log;
ngx_uint_t exists; /* unsigned exists:1; */
} ngx_shm_t;
ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);
void ngx_shm_free(ngx_shm_t *shm);
ngx_shmem.c是两个函数使用mmap和mumap的具体实现
ngx_int_t
ngx_shm_alloc(ngx_shm_t *shm)
{
shm->addr = (u_char *) mmap(NULL, shm->size,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_SHARED, -1, 0);
if (shm->addr == MAP_FAILED) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
"mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);
return NGX_ERROR;
}
return NGX_OK;
}
void
ngx_shm_free(ngx_shm_t *shm)
{
if (munmap((void *) shm->addr, shm->size) == -1) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
"munmap(%p, %uz) failed", shm->addr, shm->size);
}
}
mmap 定义: mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。
ngx_shmtx.h
使用共享内存时的互斥操作
typedef struct {
ngx_atomic_t lock;
#if (NGX_HAVE_POSIX_SEM)
ngx_atomic_t wait;
#endif
} ngx_shmtx_sh_t;
typedef struct {
#if (NGX_HAVE_ATOMIC_OPS)
ngx_atomic_t *lock;
#if (NGX_HAVE_POSIX_SEM)
ngx_atomic_t *wait;
ngx_uint_t semaphore;
sem_t sem;
#endif
#else
ngx_fd_t fd;
u_char *name;
#endif
ngx_uint_t spin;
} ngx_shmtx_t;
ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr,
u_char *name);//创建
void ngx_shmtx_destroy(ngx_shmtx_t *mtx);//销毁
ngx_uint_t ngx_shmtx_trylock(ngx_shmtx_t *mtx);//尝试加锁 不等待
void ngx_shmtx_lock(ngx_shmtx_t *mtx);//尝试加锁 一直尝试直到加锁成功
void ngx_shmtx_unlock(ngx_shmtx_t *mtx);//解锁
ngx_uint_t ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid);//强制解锁
共享内存除了互斥还有就是slab(内存分配机制)
ngx_init_zone_pool来实现的
static ngx_int_t
ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)
{
u_char *file;
ngx_slab_pool_t *sp;
sp = (ngx_slab_pool_t *) zn->shm.addr;
if (zn->shm.exists) {
if (sp == sp->addr) {
return NGX_OK;
}
ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
"shared zone \"%V\" has no equal addresses: %p vs %p",
&zn->shm.name, sp->addr, sp);
return NGX_ERROR;
}
sp->end = zn->shm.addr + zn->shm.size;
sp->min_shift = 3;
sp->addr = zn->shm.addr;
#if (NGX_HAVE_ATOMIC_OPS)
file = NULL;
#else
file = ngx_pnalloc(cycle->pool, cycle->lock_file.len + zn->shm.name.len);
if (file == NULL) {
return NGX_ERROR;
}
(void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name);
#endif
if (ngx_shmtx_create(&sp->mutex, &sp->lock, file) != NGX_OK) {
return NGX_ERROR;
}
ngx_slab_init(sp);
return NGX_OK;
}
#include <ngx_shmem.h>
#include <ngx_shmtx.h>
都是干啥使得呢?
ngx_shmem.h 定义了 ngx_shm_t结构体及 共享内存的实际分配及释放
typedef struct {
u_char *addr;
size_t size;
ngx_str_t name;
ngx_log_t *log;
ngx_uint_t exists; /* unsigned exists:1; */
} ngx_shm_t;
ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);
void ngx_shm_free(ngx_shm_t *shm);
ngx_shmem.c是两个函数使用mmap和mumap的具体实现
ngx_int_t
ngx_shm_alloc(ngx_shm_t *shm)
{
shm->addr = (u_char *) mmap(NULL, shm->size,
PROT_READ|PROT_WRITE,
MAP_ANON|MAP_SHARED, -1, 0);
if (shm->addr == MAP_FAILED) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
"mmap(MAP_ANON|MAP_SHARED, %uz) failed", shm->size);
return NGX_ERROR;
}
return NGX_OK;
}
void
ngx_shm_free(ngx_shm_t *shm)
{
if (munmap((void *) shm->addr, shm->size) == -1) {
ngx_log_error(NGX_LOG_ALERT, shm->log, ngx_errno,
"munmap(%p, %uz) failed", shm->addr, shm->size);
}
}
mmap 定义: mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。
ngx_shmtx.h
使用共享内存时的互斥操作
typedef struct {
ngx_atomic_t lock;
#if (NGX_HAVE_POSIX_SEM)
ngx_atomic_t wait;
#endif
} ngx_shmtx_sh_t;
typedef struct {
#if (NGX_HAVE_ATOMIC_OPS)
ngx_atomic_t *lock;
#if (NGX_HAVE_POSIX_SEM)
ngx_atomic_t *wait;
ngx_uint_t semaphore;
sem_t sem;
#endif
#else
ngx_fd_t fd;
u_char *name;
#endif
ngx_uint_t spin;
} ngx_shmtx_t;
ngx_int_t ngx_shmtx_create(ngx_shmtx_t *mtx, ngx_shmtx_sh_t *addr,
u_char *name);//创建
void ngx_shmtx_destroy(ngx_shmtx_t *mtx);//销毁
ngx_uint_t ngx_shmtx_trylock(ngx_shmtx_t *mtx);//尝试加锁 不等待
void ngx_shmtx_lock(ngx_shmtx_t *mtx);//尝试加锁 一直尝试直到加锁成功
void ngx_shmtx_unlock(ngx_shmtx_t *mtx);//解锁
ngx_uint_t ngx_shmtx_force_unlock(ngx_shmtx_t *mtx, ngx_pid_t pid);//强制解锁
共享内存除了互斥还有就是slab(内存分配机制)
ngx_init_zone_pool来实现的
static ngx_int_t
ngx_init_zone_pool(ngx_cycle_t *cycle, ngx_shm_zone_t *zn)
{
u_char *file;
ngx_slab_pool_t *sp;
sp = (ngx_slab_pool_t *) zn->shm.addr;
if (zn->shm.exists) {
if (sp == sp->addr) {
return NGX_OK;
}
ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
"shared zone \"%V\" has no equal addresses: %p vs %p",
&zn->shm.name, sp->addr, sp);
return NGX_ERROR;
}
sp->end = zn->shm.addr + zn->shm.size;
sp->min_shift = 3;
sp->addr = zn->shm.addr;
#if (NGX_HAVE_ATOMIC_OPS)
file = NULL;
#else
file = ngx_pnalloc(cycle->pool, cycle->lock_file.len + zn->shm.name.len);
if (file == NULL) {
return NGX_ERROR;
}
(void) ngx_sprintf(file, "%V%V%Z", &cycle->lock_file, &zn->shm.name);
#endif
if (ngx_shmtx_create(&sp->mutex, &sp->lock, file) != NGX_OK) {
return NGX_ERROR;
}
ngx_slab_init(sp);
return NGX_OK;
}
相关文章推荐
- nginx源码学习4——重写共享内存锁类
- 进程间通信学习小结(共享内存)
- Dll学习三_Dll 相互间以及主程序间的数据共享——测试未通过,应该用内存映射
- Nginx内存管理及数据结构浅析–共享内存的实现
- linux c 共享内存编程学习记录
- Linux 驱动学习笔记05--字符驱动实例,实现一个共享内存设备的驱动
- Unix System V共享内存学习笔记(共享内存、信号量)
- Dll学习三_Dll 相互间以及主程序间的数据共享——测试未通过,应该用内存映射
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
- 共享内存mmap学习 及与 shmxxx操作的区别
- 进程间通信学习小结(共享内存)
- 共享内存进一步学习
- nginx - 共享内存与锁的实现
- php 共享内存学习(APC扩展)
- 信号量学习 & 共享内存同步
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
- Dll学习三_Dll 相互间以及主程序间的数据共享——测试未通过,应该用内存映射
- UNIX/LINUX编程学习之进程通信--共享内存
- 基于system V共享内存学习
- nginx 进程通信--共享内存