网站运营 | 站长学院 | 技术文档 | 成语 | 歇后语 | 桌面壁纸 | 帝国时代 | 代码收藏 | IP地址查询 | 生活百科 | 生日密码 | CSS压缩 | 用户评论

PHP中copy on write写时复制机制

【 作者:leeon 更新时间:2014-03-01 | 字体:
[导读]什么是写时复制(Copy On Write)?答:在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上,而是在新对象的内存映射表中设置一个指针,指向源对象的位置>,并把那块内存的Copy-On-Write位设置...

什么是写时复制(Copy On Write)>?

答:在复制一个对象的时候并不是真正的把原先的对象复制到内存的另外一个位置上>,而是在新对象的内存映射表中设置一个指针>,指向源对象的位置,并把那块内存的Copy-On-Write位设置为1.这样>>>,在对新的对象执行读操作的时候>,内存数据不发生任何变动>,直接执行读操作>;而在对新的对象执行写操作时,将真正的对象复制到新的内存地址中>,并修改新对象的内存映射表指向这个新的位置>,并在新的内存位置上执行写操作。

这个技术需要跟虚拟内存和分页同时使用,好处就是在执行复制操作时因为不是真正的内存复制,而只是建立了一个指针>,因而大大提高效率。但这不是一直成立的>,如果在复制新对象之后>>,大部分对象都还需要继续进行写操作会产生大量的分页错误>,得不偿失。所以COW高效的情况只是在复制新对象之后>,在一小部分的内存分页上进行写操作。

     在PHP 内核中同样使用了写时复制机制来避免在赋值时导致内存增加>,比如我们在使用foreach循环体时>,可以发现其中的奥秘>>,示例代码:

$m1 = memory_get_usage();

$str=<<<EOF

aaaaaaaaaaaaaa

aaaaaaaaaaaaaa

aaaaaaaaaaaaaa

EOF;

$arr = explode("\n", $str);

$count=0;

foreach($arr as $v){

    $count++;

    //$v='aaaaaaaaaaaaaa';

}

$m2 = memory_get_usage();

echo $m2-$m1;

当我们执行此代码时会得到内存占用为:788 

$m1 = memory_get_usage();

$str=<<<EOF

aaaaaaaaaaaaaa

aaaaaaaaaaaaaa

aaaaaaaaaaaaaa

EOF;

$arr = explode("\n", $str);

$count=0;

foreach($arr as $v){

$count++;

$v='aaaaaaaaaaaaaa';

}

$m2 = memory_get_usage();

echo $m2-$m1;



当我们取消 //$v='aaaaaaaaaaaaaa';  的注释,此时内存占用数值为:840>,注意内存增长了。

$m1 = memory_get_usage();

$str=<<<EOF

aaaaaaaaaaaaaa

aaaaaaaaaaaaaa

aaaaaaaaaaaaaa

EOF;

$arr = explode("\n", $str);

$count=0;

foreach($arr as &$v){

$count++;

//$v='aaaaaaaaaaaaaa';

}

$m2 = memory_get_usage();

echo $m2-$m1;




当我们将foreach中的$v 改写为 &$v 时>,不管是否注释循环体中对$v的注释>>,我们都可以得到内存占用为:788

这里就说明了COW机制的介入,当我们在foreach循环中纯粹的只用到对$v 的读操作时>,PHP内核会将$v这个变量的内存地址指向到$arr中数组这一索引的内存地址,并没有将数组中的数据复制一份给到变量$v>,此时内存占用情况和使用&$v 是一样的。但当我们在循环体内对$v进行写操作时,写时复制机制就被激活了>>,此时PHP会重新开辟一段内存空间给到$v变量,而将原先$v指向数组的内存地址给断开了>,此时内存必然就会增长了>。

这里可以得出另外一个结论:当我们在读取大数据的时候,要注意COW机制引入的内存增长影响>,同样避免不必要的对变量写,可以提高代码运行性能。

原文:http://www.chinawobo.com/a/copy-on-write-in-php

友荐云推荐
  • 转载请注明来源:网站运营 网址:http://www.chinawobo.com/ 向您的朋友推荐此文章
  • 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载>,但请务必注明出处和原始作者。文章版权归文章原始作者所有>>。对于被本站转载文章的个人和网站>,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。
RSS订阅
  • QQ邮箱
  • 填写您的邮件地址>,订阅我们的精彩内容:
更多
© 2014 网站运营 - T086.com(原itlearner.com)
  • 歹徒抢劫超市前请人占卜 梦到头发着火代表会有钱? 2018-05-27
  • 薪资倒退至17年前水平 台北网友叹买房困难 2018-05-27
  • 四川馆藏国家重点档案195万余卷 2018-05-27
  • 张天爱变胖了?淡雅甜笑险露双下巴 2018-05-26
  • 论对汉文化东传的基本认识 2018-05-26
  • 4月台州全市新建商品住宅成交3444套 2018-05-25
  • 河北盐山:“点、线、面”结合推进人才强县 2018-05-25
  • 北京市幼儿园年内完成全员培训 2018-05-25
  • 河南职业技术学院全国技能(导游类)大赛获佳绩 2018-05-24
  • Футбол -- Арены ЧМ-2018 -- Стадион Нижний Новгород 2018-05-24
  • 美媒:美国对华战略缺乏头脑 2018-05-23
  • 中国钢企布局沿海 柳钢瞄准东盟经济圈 2018-05-23
  • 2018的偶像元年是否只是一场美丽的谎言?偶像练习生创造101选秀 2018-05-22
  • 上海临港有个“儿童大学” 2018-05-20
  • 2017年世界大学学术排名发布 清华进前50大学学术排名大学排行榜 2018-05-20
  • 微商货源 | 冠珠陶瓷 | 6688电视家官网 | 中康体检网 | 安徽极热网 | 北京赛车开奖号码 | 快猴网 | 迪威乐云商devmsn | 易奇八字 | wwe美国职业摔角 | 八字算命 | 河南旅游景点大全 | 冠珠陶瓷 | 广东旅游景点大全 |
    RunTime:9.82ms QueryTime:7