国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > PHP > 正文

PHP中copy on write寫時(shí)復(fù)制機(jī)制

2024-09-04 11:50:24
字體:
供稿:網(wǎng)友

什么是寫時(shí)復(fù)制(Copy On Write)?

答:在復(fù)制一個(gè)對(duì)象的時(shí)候并不是真正的把原先的對(duì)象復(fù)制到內(nèi)存的另外一個(gè)位置上,而是在新對(duì)象的內(nèi)存映射表中設(shè)置一個(gè)指針,指向源對(duì)象的位置,并把那塊內(nèi)存的Copy-On-Write位設(shè)置為1.這樣,在對(duì)新的對(duì)象執(zhí)行讀操作的時(shí)候,內(nèi)存數(shù)據(jù)不發(fā)生任何變動(dòng),直接執(zhí)行讀操作;而在對(duì)新的對(duì)象執(zhí)行寫操作時(shí),將真正的對(duì)象復(fù)制到新的內(nèi)存地址中,并修改新對(duì)象的內(nèi)存映射表指向這個(gè)新的位置,并在新的內(nèi)存位置上執(zhí)行寫操作。

這個(gè)技術(shù)需要跟虛擬內(nèi)存和分頁(yè)同時(shí)使用,好處就是在執(zhí)行復(fù)制操作時(shí)因?yàn)椴皇钦嬲膬?nèi)存復(fù)制,而只是建立了一個(gè)指針,因而大大提高效率。但這不是一直成立的,如果在復(fù)制新對(duì)象之后,大部分對(duì)象都還需要繼續(xù)進(jìn)行寫操作會(huì)產(chǎn)生大量的分頁(yè)錯(cuò)誤,得不償失。所以COW高效的情況只是在復(fù)制新對(duì)象之后,在一小部分的內(nèi)存分頁(yè)上進(jìn)行寫操作。

     在PHP 內(nèi)核中同樣使用了寫時(shí)復(fù)制機(jī)制來避免在賦值時(shí)導(dǎo)致內(nèi)存增加,比如我們?cè)谑褂胒oreach循環(huán)體時(shí),可以發(fā)現(xiàn)其中的奧秘,示例代碼:

$m1 = memory_get_usage();$str=<<<EOFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEOF;$arr = explode("/n", $str);$count=0;foreach($arr as $v){    $count++;    //$v='aaaaaaaaaaaaaa';}$m2 = memory_get_usage();echo $m2-$m1;

當(dāng)我們執(zhí)行此代碼時(shí)會(huì)得到內(nèi)存占用為:788 

$m1 = memory_get_usage();$str=<<<EOFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEOF;$arr = explode("/n", $str);$count=0;foreach($arr as $v){$count++;$v='aaaaaaaaaaaaaa';}$m2 = memory_get_usage();echo $m2-$m1;


當(dāng)我們?nèi)∠?nbsp;//$v='aaaaaaaaaaaaaa';  的注釋,此時(shí)內(nèi)存占用數(shù)值為:840,注意內(nèi)存增長(zhǎng)了。

$m1 = memory_get_usage();$str=<<<EOFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEOF;$arr = explode("/n", $str);$count=0;foreach($arr as &$v){$count++;//$v='aaaaaaaaaaaaaa';}$m2 = memory_get_usage();echo $m2-$m1;



當(dāng)我們將foreach中的$v 改寫為 &$v 時(shí),不管是否注釋循環(huán)體中對(duì)$v的注釋,我們都可以得到內(nèi)存占用為:788

這里就說明了COW機(jī)制的介入,當(dāng)我們?cè)趂oreach循環(huán)中純粹的只用到對(duì)$v 的讀操作時(shí),PHP內(nèi)核會(huì)將$v這個(gè)變量的內(nèi)存地址指向到$arr中數(shù)組這一索引的內(nèi)存地址,并沒有將數(shù)組中的數(shù)據(jù)復(fù)制一份給到變量$v,此時(shí)內(nèi)存占用情況和使用&$v 是一樣的。但當(dāng)我們?cè)谘h(huán)體內(nèi)對(duì)$v進(jìn)行寫操作時(shí),寫時(shí)復(fù)制機(jī)制就被激活了,此時(shí)PHP會(huì)重新開辟一段內(nèi)存空間給到$v變量,而將原先$v指向數(shù)組的內(nèi)存地址給斷開了,此時(shí)內(nèi)存必然就會(huì)增長(zhǎng)了。

這里可以得出另外一個(gè)結(jié)論:當(dāng)我們?cè)谧x取大數(shù)據(jù)的時(shí)候,要注意COW機(jī)制引入的內(nèi)存增長(zhǎng)影響,同樣避免不必要的對(duì)變量寫,可以提高代碼運(yùn)行性能。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沈丘县| 赞皇县| 都安| 乳源| 福鼎市| 东至县| 丹棱县| 柏乡县| 红安县| 平乡县| 岳西县| 华宁县| 巴林左旗| 永和县| 泽库县| 浮山县| 渭源县| 康马县| 镇沅| 资兴市| 宜兴市| 苗栗县| 漯河市| 包头市| 从江县| 宁海县| 中卫市| 田林县| 调兵山市| 汉中市| 浮梁县| 永泰县| 莲花县| 镇沅| 若尔盖县| 元阳县| 海城市| 墨脱县| 介休市| 鄂尔多斯市| 鲜城|