Khususnya:
Jika pustaka TC_MALLOC Google wujud dalam sistem, gunakan keluarga fungsi tc_malloc dan bukannya keluarga fungsi malloc asal.
Jika sistem semasa ialah sistem Mac, gunakan fungsi peruntukan memori.
Dalam kes lain, medan panjang tetap tambahan diperuntukkan pada permulaan setiap ruang yang diperuntukkan untuk merekodkan saiz ruang yang diperuntukkan.
Kod sumber masing-masing dalam config.h dan zmalloc.c:
/* config.h */
#jika ditakrifkan(USE_TCMALLOC)
#include
#if TC_VERSION_MAJOR >= 1 && TC_VERSION_MINOR >= 6
#define HAVE_MALLOC_SIZE 1
redisize (p)
#endif
#elif defined(__APPLE__)
#include
#define HAVE_MALLOC_SIZE 1
#define redis_malloc_size(size_ployed p )
#endif
/* zmalloc.c */
#ifdef ADA_MALLOC_SIZE
#define PRAFIX
>>
# lain #jika ditakrifkan(__matahari) #takrifkan PREFIX_SIZE (saiz daripada(panjang panjang)) #else #define PREFIX_SIZE size_t )) #endif #endif Kerana tc_malloc dan keluarga fungsi malloc di bawah platform Mac menyediakan fungsi untuk mengira saiz ruang yang diperuntukkan (tc_malloc_size dan malloc_size masing-masing ) , jadi tidak perlu memperuntukkan ruang yang berasingan untuk merekodkan saiz. Untuk platform Linux dan Sun, saiz ruang yang diperuntukkan mesti direkodkan. Untuk linux, gunakan sizeof(size_t) fixed-length field record; untuk sun os, gunakan sizeof(long long) fixed-length record. Itulah makro PREFIX_SIZE dalam kod sumber di atas. Nyatakan semula ayat ini: Tujuan rekod ini adalah untuk mengira berapa banyak memori yang diduduki oleh proses semasa. Dalam zmalloc.c, terdapat pembolehubah statik sedemikian: statik size_t used_memory = 0; Ia merekodkan jumlah memori yang sedang diduduki oleh proses. Setiap kali memori diperuntukkan atau dikeluarkan, pembolehubah ini mesti dikemas kini. Kerana apabila memperuntukkan memori, anda boleh mengetahui dengan jelas berapa banyak memori yang perlu diperuntukkan. Tetapi apabila melepaskan memori, (untuk platform yang tidak menyediakan fungsi malloc_size) anda tidak boleh tahu berapa banyak ruang yang dilepaskan hanya dengan menunjuk ke penunjuk ke memori yang akan dikeluarkan. Dalam kes ini, medan panjang tetap yang ditentukan oleh PREFIX_SIZE akan dimainkan dan saiz ruang boleh diperoleh daripada maklumat yang direkodkan di dalamnya. Fungsi zmalloc adalah seperti berikut (mengalih keluar kod yang tidak berkaitan): void *zmalloc(saiz_t) { void *ptr = malloc(saiz+PREFIX_SIZE); jika (!ptr ) zmalloc_oom(saiz); *((saiz_t*)ptr) = saiz; kemas kini_zmalloc_stat_alloc(saiz+PREFIX_SIZE,saiz); kembalikan (char *)ptr +PREFIX_SIZE; #endif } Apakah kemahiran Redis dalam peruntukan memori dan statistik penggunaanApabila memperuntukkan ruang, bayar perhatian kepada saiz ruang. Apabila berjalan pada sistem Mac atau menggunakan tc_malloc, nilai PREFIX_SIZE adalah sifar. Seterusnya, bait size_t pertama blok memori yang ditunjuk oleh penunjuk ptr akan digunakan untuk merekodkan saiz yang diperuntukkan bagi blok memori. Perkara terakhir yang dikembalikan ialah penunjuk di luar kawasan rekod. Fungsi zfree adalah serupa (mengalih keluar kod yang tidak berkaitan): void zfree(void *ptr) { void *realptr; size_t oldsize; jika ( ptr == NULL) kembali; realptr = (char*)ptr-PREFIX_SIZE; oldsize = *((size_t*)realptr); update_zmalloc_stat_free( oldsize+ PREFIX_SIZE); Percuma(realptr); Akhirnya, kosongkan seluruh ruang. Dua makro update_zmalloc_stat_alloc(__n,__size) dan update_zmalloc_stat_free(__n) bertanggungjawab untuk mengemas kini pembolehubah memori_terpakai apabila memperuntukkan atau melepaskan memori. Mentakrifkannya sebagai makro adalah disebabkan oleh pertimbangan kecekapan. Pulihkannya kepada fungsi, ia kelihatan seperti ini: void update_zmalloc_stat_alloc(__n,__size) );Saiz_t _stat_slot = (__saiz < ZMALLOC_MAX_ALLOC_STAT) __saiz : ZMALLOC_MAX_ALLOC_STAT; jika (_n&(saiz(panjang)-1)) _n += saiz(panjang)-(_n&(saiz(panjang)-1)); jika (zmalloc_thread_safe) { pthread_mutex_lock(&used_memory_mutex); memori_terpakai += _n; zmalloc_allocations[_stat_slot]++; pthread_mutex_unlock(&used_memory_mutex); } lain { memori_terpakai += _n; zmalloc_allocations[_stat_slot]++; } } manakala(0) } batal kemas kini_zmalloc_stat_free(__n) { buat { saiz_t _n = (__n); jika (_n&(saiz(panjang)-1)) _n += saiz(panjang)-(_n&(saiz(panjang)-1)); jika (zmalloc_thread_safe) { pthread_mutex_lock(&used_memory_mutex); memori_terpakai -= _n; pthread_mutex_unlock(&used_memory_mutex); } lain { memori_terpakai -= _n; } } manakala(0) } Selain mengemas kini pembolehubah used_memory dalam kod, terdapat beberapa perkara lain yang perlu diberi perhatian: Pertama, bit tertib rendah _n dibundarkan ke atas, dan akhirnya _n menjadi gandaan sizeof(long). ke atas, dua bit tertib rendah menjadi 0. Jika terdapat berbilang benang dalam proses, kunci mesti dikunci semasa mengemas kini pembolehubah. Terdapat satu lagi statistik yang perlu dikemas kini dalam fungsi zmalloc: zmalloc_allocations[]. Dalam zmalloc.c, zmalloc_allocations ditakrifkan seperti berikut: size_t zmalloc_allocations[ZMALLOC_MAX_ALLOC_STAT+1]; Fungsinya adalah untuk mengira bilangan permintaan untuk saiz ruang yang berbeza apabila program memperuntukkan memori. Ruang statistik berjulat dari 1 bait hingga 256 bait, dan ruang yang lebih besar daripada 256 bait dikira sebagai 256. Keputusan statistik dikembalikan dengan memanggil fungsi zmalloc_allocations_for_size: size_t zmalloc_allocations_for_size(size_t size) { jika (saiz > ZMALLOC_MAX_ALLOC_STAT) kembalikan 0;
Kembalikan zmalloc_allocations[saiz]; zmalloc_thread_safe) pthread_mutex_lock(&used_memory_mutex);
um = used_memory;
if (zmalloc_thread_safe) pthread_mutex_unlock(&used_memory_mutex);
kembali um;
>
Selain itu, zmalloc.c juga melaksanakan fungsi zmalloc_get_rss untuk sistem yang berbeza Dalam Linux Dalam sistem, statistik sistem penggunaan memori diperoleh dengan membaca fail /proc/$pid/stat.Atas ialah kandungan terperinci Apakah teknik untuk peruntukan memori dan statistik penggunaan Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!