文档章节

php 内存分配新

o
 osc_y8yehimr
发布于 2019/03/22 11:09
字数 766
阅读 12
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

https://yq.aliyun.com/articles/38307

https://yq.aliyun.com/ziliao/132720

http://blog.liyiwei.cn/%E3%80%8A%E7%AE%97%E6%B3%95%E5%AF%BC%E8%AE%BA%E3%80%8B%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0%EF%BC%9A%E4%BA%8C%E5%8F%89%E6%9F%A5%E6%89%BE%E6%A0%91/

 

为避免系统调用malloc,free, php内核使用内存池来管理已经分配或释放的内存

小内存 数组+链表

大内存 树+链表

存放的是还未使用的内存,以及释放的内存(也可以看做未使用的内存)

有新的内存需要分配时,首先会在 小内存和大内存中查找,如果找不到 再mmap 256K大小的内存, 余下的内存 根据大小 是放到小内存里,还是放到大内存里

假设在大内存里找到了相应的内存,就要把这个结点删除,其实就是二叉有序树的删除,但php相关的源码还是看不懂

如果待删除的结点 同时有左子树和右子树,这时有两种方式
1)查找右子树中最小的结点a,特点就是该 结点 没有 左子树, 假设a的右子树为b,a的父结点为c,那么 c.左子树为b,同时b的父结点为c

2)查找左子树中最大的结点a,特点是该结点没有 右子树,只有左子树,假设 a的左子树为b, a的父结点为c,那么 c的左子树为b,同时b的父结点为c

假设现在的二叉树为

        160

        /

       92

       /\

      84 98

      /\    /\

    76  86  96 106

                        \

                         97

删除92 采用第一种方法,在92的右子树中查找最小左值,就是96,同时97做为98的左结点

        160

        /

       96

       /\

      84 98

      /\    /\

    76  86  97 106

                       

static inline void zend_mm_remove_from_free_list(zend_mm_heap *heap, zend_mm_free_block *mm_block)
{
    zend_mm_free_block *prev = mm_block->prev_free_block;
    zend_mm_free_block *next = mm_block->next_free_block;

    ZEND_MM_CHECK_MAGIC(mm_block, MEM_BLOCK_FREED);

    if (EXPECTED(prev == mm_block)) {
        zend_mm_free_block **rp, **cp;


        rp = &mm_block->child[mm_block->child[1] != NULL];
        prev = *rp;
        if (EXPECTED(prev == NULL)) {
            
        } else {
            while (*(cp = &(prev->child[prev->child[1] != NULL])) != NULL) {
                prev = *cp;
                rp = cp;
            }
            *rp = NULL;

subst_block:
            ZEND_MM_CHECK_TREE(mm_block);
            *mm_block->parent = prev;
            prev->parent = mm_block->parent;
            if ((prev->child[0] = mm_block->child[0])) {
                ZEND_MM_CHECK_TREE(prev->child[0]);
                prev->child[0]->parent = &prev->child[0];
            }
            if ((prev->child[1] = mm_block->child[1])) {
                ZEND_MM_CHECK_TREE(prev->child[1]);
                prev->child[1]->parent = &prev->child[1];
            }
        }
    }
}

 

假设现在的二叉树为

        160

        /

       92

       /\

      84 98

      /\    /\

      76    96 106

 

现在要删除结点92,按上面的代码 

rp = &mm_block->child[mm_block->child[1] != NULL]; rp为92的右子树,即98的地址

prev = *rp; prev为8

while (*(cp = &(prev->child[prev->child[1] != NULL])) != NULL) {
     prev = *cp;
     rp = cp;
}

 

while( *(cp = &98[1]) != NULL){

  prev = 106;

}

 

prev->parent = mm_block->parent;
if ((prev->child[0] = mm_block->child[0])) {
    ZEND_MM_CHECK_TREE(prev->child[0]);
    prev->child[0]->parent = &prev->child[0];
}
if ((prev->child[1] = mm_block->child[1])) {
    ZEND_MM_CHECK_TREE(prev->child[1]);
    prev->child[1]->parent = &prev->child[1];
}    

 

106的父结点 是92的父结点,即106的父结点是160

106的左了树为 92的左子树 即 106的左子结点为84

106的右子树为 92的右子结,即106的右子结点 为98, 是不是不太对劲,这不符合二叉排序树的规则,因为右子树要大于他的父结点的

 

        160

        /

       106

       /\

      84 98

      /\    /\

      76    96 

 

 

上一篇: php-fpm epoll封装
下一篇: php代码的opcode
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
8K
8
opm-server-mirror

代码更新 2009-11-25: 加入反爬虫功能。直接Web访问服务器将跳转到Google。 使用方法 下载index.zip 解压index.zip得到index.php 将index.php传到支持php和cURL的国外服务器上 打开 http:/...

luosheng86
2013/01/29
1K
0
tiny php template--TPT

关于TPT TPT是php实现的用于模板解析小工具,全部实现仅仅60行代码。 配置 DIRCOMPILED和DIRTEMPLATE,分别表示模版编译目录和模版文件目录: define('DIRCOMPILED','/compileddiy');define(......

红猪-侠
2013/03/03
1K
1
PHP web 服务器--YACS

YACS 是一个强大的 PHP 脚本,可以让你维护一个动态的 Web 服务器。 特性: - Runs on your own server, or on a shared web site - Post articles with web forms, by e-mail, or remotely ......

匿名
2013/03/18
864
0
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

旋转子段 (思维stl)

题目: 大概意思就是给你一个序列,你可以选择一段区间使它左右翻折一遍,然后呢,从1到n找一遍,看a[i]==i的数最多是多少。 其实刚才我已经把暴力思路说出来了,枚举每一个区间长度,枚举每...

osc_npw5uz1o
10分钟前
0
0
回忆录

前言? 果然退役的蒟蒻不仅没有留下有价值的学习资料,甚至连能看的颓废资料都没有。 其实这一年时间里一直想写一篇像样的回忆录。 想把高三也写进去?现在高三结束了。没时间写?现在有了。...

osc_z9ptnny9
12分钟前
0
0
mysql启动失败,unit not found

1 mysql启动 Failed to start mysqld.service: Unit not found. 2 查询/etc/init.d/下是否存在mysqld ll /etc/init.d/ | grep mysqld 发现该目录下并没有mysqld的文件,若存在,请备份一下 ...

osc_um3gbrdm
14分钟前
5
0
域名解析到底应该肿么破——详解域名解析类型

原文地址:https://www.wjcms.net/archives/%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%E5%88%B0%E5%BA%95%E5%BA%94%E8%AF%A5%E8%82%BF%E4%B9%88%E7%A0%B4%E8%AF%A6%E8%A7%A3%E5%9F%9F%E5%90%8D%......

神兵小将
14分钟前
0
0
Java并发编程:volatile关键字解析

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

osc_3r4js8qy
15分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部