php引用计时器和垃圾回收机制

php引用计时器和垃圾回收机制

ID:6493973

大小:103.00 KB

页数:7页

时间:2018-01-15

php引用计时器和垃圾回收机制_第1页
php引用计时器和垃圾回收机制_第2页
php引用计时器和垃圾回收机制_第3页
php引用计时器和垃圾回收机制_第4页
php引用计时器和垃圾回收机制_第5页
资源描述:

《php引用计时器和垃圾回收机制》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、php引用计数器和垃圾回收机制谈到引用计数器和垃圾回收机制,必须得从php变量说起。总所周知,php是一种弱类型,但具体表现在哪里,程序里面又是怎么表现的呢?php里面又是怎样实现引用计数器的,程序如何区分变量引用和复制?php是如何对已用完的变量进行回收,不同的php版本的不同的垃圾回收机制又是如何实现的?1.引用计数器讲到引用计数器,不得不先说一下变量的c语言实现。如下,几个变量的结构体和联合体:zvalue_value联合体:typedef union _zvalue_value {  long lval;                  /* long

2、 value */  double dval;                /* double value */ struct { char *val;  int len; } str; HashTable *ht;              /* hash table value */  zend_object_value obj; } zvalue_value; zval的结构:struct _zval_struct {  /* Variable information */  zvalue_value value;      /* value */ ze

3、nd_uint refcount__gc;  zend_uchar type;    /* active type */  zend_uchar is_ref__gc; }; zval可以看成一个容器,zvalue_value是该容器存储变量值的联合体,refcount__gc是引用计数,记录引用数,is_ref__gc是标志这个容器是否真正的引用,type表示这个变量的类型。zend根据type值来决定访问value的哪个成员,可用值如下:IS_NULLN/AIS_LONG对应value.lvalIS_DOUBLE对应value.dvalIS_STRING对应

4、value.strIS_ARRAY对应value.htIS_OBJECT对应value.objIS_BOOL对应value.lval.IS_RESOURCE对应value.lval根据这个表格可以发现两个有意思的地方:首先是PHP的数组其实就是一个HashTable,这就解释了为什么PHP能够支持关联数组了;其次,Resource就是一个long值,它里面存放的通常是个指针、一个内部数组的index或者其它什么只有创建者自己才知道的东西,可以将其视作一个handle。(1)写复制(CopyonWrite)

5、p=$var;$var=1;?>PHP在修改一个变量以前,会首先查看这个变量的refcount,如果refcount大于1,PHP就会执行一个分离的例程,对于上面的代码,当执行到第三行的时候,PHP发现$var指向的zval的refcount大于1,那么PHP就会复制一个新的zval出来,将原zval的refcount减1,并修改symbol_table,使得$var和$var_dup分离(Separation)。这个机制就是所谓的copyonwrite(写时复制)。题外话:写时复制技术的一个比较有名的应用是在unix类操作系统内核中,当一个进程调用fork函数

6、生成一个子进程的时候,父子进程拥有相同的地址空间内容,在老版本的系统中,子进程是在fork的时候就将父进程的地址空间中的内容都拷贝一份,对于规模较大的程序这个过程可能会有着很大的开销,更崩溃的是,很多进程在fork之后,直接在子进程中调用exec执行另外一个程序,这样原来花了大量时间从父进程复制的地址空间都还没来得及碰一下就被新的进程地址空间代替,这显然是对资源的极大浪费,所以在后来的系统中,就使用了写时复制技术,fork之后,子进程的地址空间还是简单的指向父进程的地址空间,只有当子进程需要写地址空间中的内容的时候,才会单独分离一份(一般以内存页为单位)给子进程

7、,这样就算子进程马上调用exec函数也没关系,因为根本就不需要从父进程的地址空间中拷贝内容,这样节约了内存同时又提高了速度。(2)写改变(changeonwrit)开始在zval里面我们看到一个字段is_ref__gc,到底如何是怎样产生作用的呢?现在我们知道,当使用变量复制的时候,PHP内部并不是真正的复制,而是采用指向相同的结构来尽量节约开销。那么,对于PHP中的引用,那又是如何实现呢?这段代码结束以后,$var也会被间接的修改为1,这个过程称

8、作(changeonwr

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。