49 記憶體管理中的cache

2021-07-11 10:53:23 字數 1088 閱讀 5262

在維基百科中有這樣一段描述: 凡是位於速度相差較大的兩種硬體之間的,用於協調兩者資料傳輸速度差異的結構,均可稱之為cache。 從最初始的處理器與記憶體間的cache開始,都是為了讓資料訪問的速度適應cpu的處理速度, 其基於的原理是記憶體中「程式執行與資料訪問的局域性行為」。 同樣php記憶體管理中的快取也是基於「程式執行與資料訪問的局域性行為」的原理。 引入快取,就是為了減少小塊記憶體塊的查詢次數,為最近訪問的資料提供更快的訪問方式。

首先我們看標識快取和快取的大小限制,在php核心中,是否使用快取的標識是巨集zend_mm_cache(zend/zend_alloc.c 400行), 快取的大小限制與size_t結構大小有關,假設size_t佔4位,則預設情況下,php核心給php記憶體管理的限制是128k(32 * 4 * 1024)。 如下所示**:

#define zend_mm_num_buckets (sizeof(size_t) << 3)

#define zend_mm_cache 1

#define zend_mm_cache_size (zend_mm_num_buckets * 4 * 1024)

如果在某些應用下需要禁用快取,則將zend_mm_cache巨集設定為0,重新編譯php即可。 為了實現這個一處修改所有地方都生效的功能,則在每個需要呼叫快取的地方在編譯時都會判斷zend_mm_cache是否定義為1。

如果我們啟用了快取,則在堆層結構中增加了兩個字段:

struct _zend_mm_heap 

#endif

return;

}#endif

當堆的記憶體溢位時,程式會呼叫zend_mm_free_cache釋放快取中。整個釋放的過程是乙個遍歷陣列, 對於每個陣列的元素程式都遍歷其所在鍊錶中在自己之前的元素,執行合併記憶體操作,減少堆結構中快取計量數字。 具體實現參見zend/zend_alloc.c的909行。

在上面的一些零碎的**塊中我們有看到在zend_mm_cache巨集出現時經常會出現zend_mm_cache_stat巨集。 這個巨集是標記是否啟用快取統計功能,預設情況下為不啟用。快取統計功能也有對應的儲存結構,在分配,釋放快取中的值時, 快取統計功能都會有相應的實現。

記憶體中的cache

在linux的記憶體管理中,這裡的buffer指linux記憶體的 buffer cache。這裡的cache指linux記憶體中的 page cache。翻譯成中文可以叫做緩衝區快取和頁面快取。什麼是page cache?page cache主要用來作為檔案系統上的檔案資料的快取來用,尤其是針對當...

記憶體中的Buffer和Cache

這個介面包含了物理記憶體mem和交換分割槽swap的使用情況,其中包括以用記憶體 快取 可用記憶體等。其中快取是buffer和cache這兩部分的總和。從字面意思理解,buffer和cache分別代表緩衝區和快取的意思,二者都是資料再記憶體中的臨時儲存。buffers是核心緩衝區用到的記憶體,對應的...

linux記憶體中buffer和 cached的比較

經常遇到一些剛接觸linux的新手會問記憶體占用怎麼那麼多?在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方面,區別於windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux 都將...