php擴展之(zend內存管理及zend引擎)

前面一篇寫了如何生成擴展模塊及書寫一個簡單d擴展模塊,當設計到用c書寫複雜的擴展函數那麼就離不開zend 內存篇了;本文整理內存管理相關內容;


內存管理

  在C語言裏,分配內存有一組alloc函數,比如malloc、calloc、realloc。php爲了更方便,更安全地管理內存,自己提供了一組內存分配的函數:emalloc、ecalloc、erealloc,此外還有estrdup用於拷貝內存,efree用於釋放由前面那些函數分配的內存。他們的用法和標準C函數的一樣。這組e開頭的函數分配的內存空間只存在於一次請求。在請求結束後,php會自動釋放掉。這就減少了由於沒有釋放掉內存而造成的內存泄露的可能。

  如果需要分配的內存在整個進程運行時都保持,而不是在請求處理結束後自動釋放,則還有一組pe開頭的函數,如pemalloc、pecalloc等。這組函數比標準C函數的多一個參數,即分配的內存是否持久,當這個參數爲1時,即表示分配的是持久的內存,不會隨着請求結束而自動釋放。如:pemalloc(sizeof(long) * 100, 1);。

  此外,爲了方便使用,還提供了safe_emalloc和safe_pemalloc這兩個函數。 safe_emalloc的原型如下:void *safe_emalloc(size_t size, size_t count, size_t addtl);。參數分別表示單元的大小,單元的個數,以及偏移。實際分配的空間大小就是size * count + addtl。safe_pemalloc與之類似。這兩個函數還有一個作用就是避免手工做上面的計算時,可能造成整數溢出,而導致分配的內存大小小於預期或者是個負數。

參考一:

PHP 核心:Zend 引擎的黑客指南

地址:http://www.php.net/manual/zh/internals2.php


參考二:《PHP擴展開發及內核應用》

地址:http://phpbook.sinaapp.com/preface.html

目錄中漢字部分代表已經翻譯完成的章節,帶鏈接的表示已經發布的,未待鏈接的表示正在校正即將發佈的。



發佈了50 篇原創文章 · 獲贊 21 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章