Bagaimana untuk menggunakan memori yang dikongsi dalam nginx

PHPz
Lepaskan: 2023-05-14 15:55:06
ke hadapan
1330 orang telah melayarinya

Penggunaan ngx_shmem

fail ngx_shmem.c/h hanyalah panggilan mudah ke panggilan sistem mmap()/munmap() atau shmget()/shmdt() daripada pembungkusan. Melaksanakan perpustakaan asas gaya ngx, yang boleh memohon dan melepaskan ruang memori dikongsi berterusan. Ia biasanya digunakan untuk data kongsi panjang tetap Panjang data tetap dan tidak akan mengembang atau mengecut semasa digunakan.

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);
Salin selepas log masuk

Proses penggunaan memori yang dikongsi dalam ngxin secara amnya dicipta oleh proses induk, dan proses pekerja memperoleh penunjuk ingatan melalui pewarisan.

Mengenai penggunaan ngx_shmem, anda boleh merujuk kepada beberapa coretan dalam ngx_event_module_init(). ) Kuantiti, dan lakukan operasi statistik penambahan dan penolakan pada pembolehubah ini pada beberapa entri peristiwa utama dalam ngx_event_module. Laksanakan statistik mengenai status permintaan semasa semua proses pekerja.

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);
Salin selepas log masuk

Untuk butiran lanjut tentang fungsi ini, anda boleh melihat kod berkaitan definisi makro ngx_stat_stub dan modul ngx_http_stub_status_module dalam kod.

Penggunaan ngx_slab

ngx_shmem ialah pakej minimalis yang melaksanakan fungsi asas memori kongsi. Walau bagaimanapun, kebanyakan data kongsi adegan dalam program kami tidak mempunyai struktur saiz tetap, tetapi lebih kepada struktur data dengan saiz berubah seperti ngx_array, ngx_list, ngx_queue dan ngx_rbtree.

Kami berharap untuk mempunyai kumpulan memori yang boleh memohon dan melepaskan ruang secara dinamik seperti ngx_pool_t. ngx_slab hanyalah struktur sedemikian Pada dasarnya, ia serupa dengan malloc() sistem kerana ia menggunakan satu siri algoritma untuk memohon dan melepaskan segmen memori. Cuma objek yang dikendalikan oleh ngx_slab adalah memori dikongsi berdasarkan ngx_shmem.

Pertama lihat antara muka ngx_slab

typedef struct {
  ngx_shmtx_t    mutex;
  ...
  void       *data; /* 一般存放从pool中申请获得的根数据地址(pool中第一个申请的数据接口) */
  void       *addr; /* 使用ngx_shmem申请获得的共享内存基地址 */
} 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);
Salin selepas log masuk

Anda dapat melihat bahawa antara muka tidak rumit Perbezaan antara alloc dan calloc adalah sama ada untuk mengosongkan segmen memori yang diperolehi oleh aplikasi penghujung _locked menunjukkan operasi Kolam telah memperoleh kunci. Terdapat mutex ngx_shmtx_t dalam struktur ngx_slab_pool_t, yang digunakan untuk menyegerakkan senario serentak pelbagai proses yang mengakses kolam pada masa yang sama. Ambil perhatian bahawa ngx_slab_alloc() akan mula-mula memperoleh kunci, kemudian memohon ruang, dan akhirnya melepaskan kunci. Dan ngx_slab_alloc_locked() secara langsung digunakan untuk ruang, memikirkan bahawa program itu telah memperoleh kunci dalam logik lain.

Menggunakan ngx_shmem dalam pembangunan nginx secara amnya memerlukan proses pemula berikut:

  • Modul memanggil antara muka ngx_shared_memory_add() semasa proses penghuraian konfigurasi untuk mendaftarkan memori yang dikongsi. Menyediakan fungsi panggil balik untuk saiz memori yang dikongsi dan permulaan memori.

  • Rangka kerja menggunakan ngx_shmem dalam ngx_init_cycle() untuk memohon ingatan, memulakan ngx_slab, dan kemudian memanggil semula fungsi permulaan yang didaftarkan oleh modul

  • Modul menggunakan ngx_slab Mohon/Sama ada antara muka

Dalam proses ini, antara muka ngx_shared_memory_add() dan struktur ngx_shm_zone_t yang sepadan terlibat.

struct ngx_shm_zone_s {
  void           *data;
  ngx_shm_t         shm;
  ngx_shm_zone_init_pt   init;
  void           *tag;
  void           *sync;
  ngx_uint_t        noreuse; /* unsigned noreuse:1; */
};
ngx_shm_zone_t *ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name,
  size_t size, void *tag);
Salin selepas log masuk

Perlu dinyatakan bahawa atribut noreuse mengawal sama ada memori kongsi akan digunakan semula semasa proses muat semula nginx.

Memandangkan fungsi ngx_init_cycle() panjang, proses ini boleh dilihat dengan mencari komen /* create shared memory */ atau objek cycle->shared_memory untuk melihat kod yang berkaitan.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan memori yang dikongsi dalam nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!