php底层--4 写时复制

Posted tianye_guazi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php底层--4 写时复制相关的知识,希望对你有一定的参考价值。

变量的赋值与引用

例如:$a=3;

   $b=$a;

这个时候是否就产生了2个结构体呢?

    No,如果是的话,这两个结构体的type,value全都一样,很浪费呀,所以在php实现的时候并没有copy一个结构体出来,而是$a,$b共用一个结构体。

  在传值赋值时,并没有新生结构体,而是共用的。

$a=3;
产生一个结构体
zvalue:3;
type:IS_LONG;
refcount_gc:1;
is_ref_gc:0;
$b=$a;
这个时候并没有新产生一个结构体,而是原来的结构体
refcount_gc=2;
也就是说,这样一个结构体被$a,$b共用,refcount_gc=2;
a,b在符号表里面都指向了这个结构体的内存地址。
节省了空间,并没有发生结构体的复制。

问题:$a,$b共用一个结构体,如果我修改$b=5,岂不是$a也受到了干扰?按照php 的逻辑,这是传值赋值,

$a=3,$b=5 显然$a是没有受到干扰的,这是什么原理呢?

 答:cow  写时复制。

  当底层发现$b=5;value值变了,这时候在复制出一个新的结构体出来,zvalue=5,refcount_gc=1;

原来$a=3的那个结构体 refcount_gc=1;

  也就是当值不改变的时候,$a,$b共用的一个结构体, refcount_gc=2;当其中一个发生改变时,复制分裂出一个来修改,这样在修改的时候发生结构体的复制改变的过程叫做写时复制(cow copy on write)。

以上是关于php底层--4 写时复制的主要内容,如果未能解决你的问题,请参考以下文章

全方位深度剖析PHP7底层源码

PHP "数组变量"之"写时复制的要点" 只有数组才有的概念。

PHP 内存管理 写时复制 垃圾回收

深入理解变量改变时PHP内核发生的一些变化

写时复制会防止阵列上的数据重复吗?

写时复制会防止阵列上的数据重复吗?