摘要:只有在真正需要使用資源時(shí)才占用資源,寫時(shí)復(fù)制通常能減少資源的占用。基礎(chǔ)方面規(guī)范新特性性能調(diào)優(yōu)垃圾回收機(jī)制安全攻擊原理和防范攻擊原理和防范注入攻擊防范密碼哈希計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議協(xié)議連接過(guò)程
從一個(gè)例子說(shuō)起:
變量 $foo 賦值給變量 $bar,這兩個(gè)變量具有相同的值,沒(méi)有必要新申請(qǐng)內(nèi)存空間,他們可以共享同一塊內(nèi)存。在很多場(chǎng)景下PHP 的 COW 對(duì)內(nèi)存進(jìn)行優(yōu)化。比如:變量的多次賦值、函數(shù)參數(shù)傳遞,并在函數(shù)體內(nèi)修改實(shí)參等。
什么是“復(fù)制”這是一段摘自鳥(niǎo)哥博客的例子,說(shuō)的比較清楚,就直接貼過(guò)來(lái)了。
很明顯在這段代碼執(zhí)行以后,$var_dup 的值應(yīng)該還是”laruence”, 那么這又是怎么實(shí)現(xiàn)的呢?這就是 PHP 的 copy on write 機(jī)制:
PHP 在修改一個(gè)變量以前,會(huì)首先查看這個(gè)變量的 refcount,如果 refcount 大于1,PHP 就會(huì)執(zhí)行一個(gè)分離的例程, 對(duì)于上面的代碼,當(dāng)執(zhí)行到第三行的時(shí)候,PHP 發(fā)現(xiàn) $var 指向的 zval 的 refcount 大于1,那么 PHP 就會(huì)復(fù)制一個(gè)新的 zval 出來(lái),將原 zval 的 refcount 減 1,并修改 symbol_table,使得 $var 和 $var_dup 分離(Separation)。這個(gè)機(jī)制就是所謂的 copy on write(寫時(shí)復(fù)制)。
寫時(shí)復(fù)制應(yīng)用場(chǎng)景寫時(shí)復(fù)制(Copy on Write,也縮寫為COW)的應(yīng)用場(chǎng)景非常多, 比如Linux中對(duì)進(jìn)程復(fù)制中內(nèi)存使用的優(yōu)化,在各種編程語(yǔ)言中,如C++的STL等等中均有類似的應(yīng)用。 COW是常用的優(yōu)化手段,可以歸類于:資源延遲分配。只有在真正需要使用資源時(shí)才占用資源, 寫時(shí)復(fù)制通常能減少資源的占用。
一個(gè)證明 PHP COW 優(yōu)化內(nèi)存占用的例子:
運(yùn)行結(jié)果:
$ php t . php int(630904) int(10479840) int(10479944) int(10480040)內(nèi)存并沒(méi)有顯著提高。
“寫時(shí)復(fù)制”的原理多個(gè)相同值的變量共用同一塊內(nèi)存的確節(jié)省了內(nèi)存空間,但變量的值是會(huì)發(fā)生變化的,如果在上面的例子中, 指向同一內(nèi)存的值發(fā)生了變化(或者可能發(fā)生變化),就需要將變化的值“分離”出去,這個(gè)“分離”的操作, 就是“復(fù)制”。
在PHP中,Zend引擎為了區(qū)別同一個(gè)zval地址是否被多個(gè)變量共享,引入了ref_count和is_ref兩個(gè)變量進(jìn)行標(biāo)識(shí):
ref_count和is_ref是定義于zval結(jié)構(gòu)體中
is_ref標(biāo)識(shí)是不是用戶使用 & 的強(qiáng)制引用;
ref_count是引用計(jì)數(shù),用于標(biāo)識(shí)此zval被多少個(gè)變量引用,即COW的自動(dòng)引用,為0時(shí)會(huì)被銷毀;
注:由此可見(jiàn), $a=$b; 與 $a=&$b; 在PHP對(duì)內(nèi)存的使用上沒(méi)有區(qū)別(值不變化時(shí));
相信大家也可以了解到PHP中COW的實(shí)現(xiàn)原理: PHP 中的 COW 基于引用計(jì)數(shù)ref_count 和 is_ref 實(shí)現(xiàn), 多一個(gè)變量指針,就將 ref_count 加 1, 反之減去 1,減到 0 就銷毀; 同理,多一個(gè)強(qiáng)制引用 &,就將 is_ref 加 1,反之減去 1。
講堂報(bào)名地址:https://segmentfault.com/l/15...
PHP筆試面試題精選(二) 課程簡(jiǎn)述《PHP筆試面試題精選》課程系列分享關(guān)于 PHP 筆試面試會(huì)問(wèn)到的一些問(wèn)題和知識(shí)點(diǎn),圍繞 PHP、數(shù)據(jù)庫(kù)、計(jì)算機(jī)網(wǎng)絡(luò)、計(jì)算機(jī)操作系統(tǒng)、設(shè)計(jì)模式、WEB安全等多個(gè)方面進(jìn)行。
課程內(nèi)容由于涉及到的問(wèn)題和知識(shí)點(diǎn)比較多,本期主要講 PHP基礎(chǔ)、WEB安全、計(jì)算機(jī)網(wǎng)絡(luò)三個(gè)方面有關(guān)的問(wèn)題。
PHP基礎(chǔ)方面PSR規(guī)范
PHP新特性
PHP_FPM性能調(diào)優(yōu)
Session垃圾回收機(jī)制
WEB安全XSS攻擊原理和防范
CSRF攻擊原理和防范
SQL注入攻擊防范
密碼哈希
計(jì)算機(jī)網(wǎng)絡(luò)HTTP協(xié)議
TCP/IP協(xié)議
WebSocket連接過(guò)程
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28484.html
摘要:引用計(jì)數(shù)變量分離寫時(shí)拷貝我們一步步來(lái)理解語(yǔ)言特性是腳本語(yǔ)言,所謂腳本語(yǔ)言,就是說(shuō)并不是獨(dú)立運(yùn)行的,要運(yùn)行代碼需要解析器,用戶編寫的代碼最終都會(huì)被解析器解析執(zhí)行的執(zhí)行是通過(guò)引擎,是用編寫的用戶編寫的代碼最終都會(huì)被翻譯成的虛擬機(jī)的虛擬指令來(lái)執(zhí)行 zval、引用計(jì)數(shù)、變量分離、寫時(shí)拷貝我們一步步來(lái)理解1、php語(yǔ)言特性PHP是腳本語(yǔ)言,所謂腳本語(yǔ)言,就是說(shuō)PHP并不是獨(dú)立運(yùn)行的,要運(yùn)行PHP...
摘要:變量的分離和引用今天看了一下鳥(niǎo)哥博客變量的分離和引用的內(nèi)容就做了一個(gè)筆記如果我們我們創(chuàng)建一個(gè)變量就分配一次內(nèi)存那么像上邊的代碼那么就會(huì)造成內(nèi)存的極大浪費(fèi)中的變量是一個(gè)指向的符號(hào)那么我們就可以在中來(lái)優(yōu)化上邊的代碼的中有一個(gè)字段用來(lái)記錄當(dāng)前被引 PHP 變量的分離和引用 今天看了一下鳥(niǎo)哥博客變量的分離和引用的內(nèi)容, 就做了一個(gè)筆記! $var = I have a dream; $var2...
摘要:可以看到,該結(jié)構(gòu)體存儲(chǔ)了關(guān)于變量值,有幾個(gè)變量指向該結(jié)構(gòu)體,變量類型,是否為引用變量等信息。這個(gè)就是寫時(shí)復(fù)制,在作怪,他沒(méi)有在賦值的時(shí)候就分裂成兩個(gè)結(jié)構(gòu)體,而是在我們改寫其中一個(gè)變量時(shí)發(fā)生效果,屬于一種慢復(fù)制也稱慢分裂。 想要走到技術(shù)的天花板,那么學(xué)習(xí)過(guò)程中在于知其然且知其所以然。 今天我們來(lái)討論一下PHP底層的寫時(shí)復(fù)制(也稱寫時(shí)分裂)。 首先我們先來(lái)看看一段代碼:showImg(ht...
摘要:用于創(chuàng)建子進(jìn)程等同于當(dāng)前進(jìn)程的副本。這個(gè)函數(shù)會(huì)有兩次返回,將子進(jìn)程的返回給父進(jìn)程,返回給子進(jìn)程。當(dāng)父子進(jìn)程中有更改相應(yīng)段的行為發(fā)生時(shí),再為子進(jìn)程相應(yīng)的段分配物理空間。中斷例程中,就會(huì)把觸發(fā)的異常的頁(yè)復(fù)制一份,于是父子進(jìn)程各自持有獨(dú)立的一份。 前言 只有光頭才能變強(qiáng) 在讀《Redis設(shè)計(jì)與實(shí)現(xiàn)》關(guān)于哈希表擴(kuò)容的時(shí)候,發(fā)現(xiàn)這么一段話: 執(zhí)行BGSAVE命令或者BGREWRITEAOF命令的...
摘要:發(fā)布時(shí)最大的變動(dòng)是對(duì)象處理方式。這很容易被誤解為引用,但是存儲(chǔ)器的引用與引用是完全不同的概念。使用引用是一件不好的事情,除了引用本身不好,并且還會(huì)使性能下降這個(gè)事實(shí)外,使用引用這種方式會(huì)使得代碼難以維護(hù)。 showImg(https://segmentfault.com/img/remote/1460000014082570); 去年我參加了很多次會(huì)議,其中八次會(huì)議里我進(jìn)行了相關(guān)發(fā)言,...
閱讀 663·2023-04-26 02:03
閱讀 1037·2021-11-23 09:51
閱讀 1111·2021-10-14 09:42
閱讀 1738·2021-09-13 10:23
閱讀 927·2021-08-27 13:12
閱讀 839·2019-08-30 11:21
閱讀 1001·2019-08-30 11:14
閱讀 1041·2019-08-30 11:09