PHP中copy on write写时复制机制介绍

2015-01-24信息快讯网

这篇文章主要介绍了PHP中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机制引入的内存增长影响,同样避免不必要的对变量写,可以提高代码运行性能。

php中字符串和正则表达式详解
PHP制作3D扇形统计图以及对图片进行缩放操作实例
PHP制作图形验证码代码分享
PHP链接MySQL的常用扩展函数
使用PHPMailer实现邮件发送代码分享
php cookie中点号(句号)自动转为下划线问题
php中字符集转换iconv函数使用总结
php json_encode()函数返回json数据实例代码
自定义session存储机制避免会话保持问题
php中json_encode UTF-8中文乱码的更好解决方法
PHP会话控制:Session与Cookie详解
PHP之autoload运行机制实例分析
PHP反射机制用法实例
ThinkPHP的MVC开发机制实例解析
php中Session的生成机制、回收机制和存储机制探究
destoon复制新模块的方法
PHP 之 写时复制介绍(Copy On Write)
php读取富文本的时p标签会出现红线是怎么回事
php的慢速日志引起的Mysql错误问题分析
PHP实现的MongoDB数据库操作类分享
PHP中date与gmdate的区别及默认时区设置
PHP三元运算的2种写法代码实例
php中curl和file_get_content的区别
php中curl、fsocket、file_get_content三个函数的使用比较
codeigniter框架The URI you submitted has disallowed characters错误解决方法
php中session过期时间设置及session回收机制介绍
yii框架配置默认controller和action示例
smarty模板中使用get、post、request、cookies、session变量的方法
Session的工作机制详解和安全性问题(PHP实例讲解)
php自动加载autoload机制示例分享
简单的php缓存类分享 php缓存机制
析构函数与php的垃圾回收机制详解
php删除与复制文件夹及其文件夹下所有文件的实现代码
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
©2014-2024 dbsqp.com