`
openxtiger
  • 浏览: 151979 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[APR源码解析]内存分配current_free_index与max_free_index的作用

阅读更多

current_free_index与max_free_index的作用:

我在看源码时,一直不明白current_free_index与max_free_index的作用,看了很多网上是解释,然后看了无数遍的源码,慢慢知道原来如此。

apr_allocator_max_free_set,这个函数用来设置max_free_index的,其实关键一开始不明白的是不知道max_free_index其实就是一个分配子(allocator)允许容纳内存空间的总大小,主要是因为“_index”这个后缀,apr表示内存的大小不是用size,而是用index,size和index的转换是max_free_index = APR_ALIGN(size, BOUNDARY_SIZE) >> BOUNDARY_INDEX; 所以后面会一直出现allocator->current_free_index += node->index + 1;其实就是增加相应内存块大小(原先还一直认为,为什么一直要加上数组下标)

所以现在就好理解了:

max_free_index表示allocator最多能容纳内存空间的大小,只不过用index表示而已。

current_free_index表示allocator还能容纳内存空间的大小(或表示剩余空间的大小),也是用index表示。值越大剩余空间就越大。所以在释放allocator_free时,会拿当前要释放的内存的节点的内存大小(用index表示)和剩余空间的大小比较,如果超过了,就将此node(或node链表,程序会一直判断,直达找到该释放的node)的内存释放到系统中。

if (max_free_index != APR_ALLOCATOR_MAX_FREE_UNLIMITED

            && index + 1 > current_free_index) {

            node->next = freelist;

            freelist = node;

        }

这个是用来处理(或node链表,程序会一直判断,直达找到该释放的node)

do {

} while ((node = next) != NULL);

 

else if (index < MAX_INDEX) {
            /* Add the node to the appropiate 'size' bucket.  Adjust
             * the max_index when appropiate.
             */
            if ((node->next = allocator->free[index]) == NULL
                && index > max_index) {
                max_index = index;
            }
            allocator->free[index] = node;
            if (current_free_index >= index + 1)
                current_free_index -= index + 1;
            else
                current_free_index = 0;
        }

 这个代码是将node放入allocator的“规则块”中。放入时,永远是放在每个node链表的第一个节点中(而不是链表的尾部)allocator->free[index] = node;为链表的第一个节点,以前那个节点被放在node->next上(node->next = allocator->free[index])。如果index对应的free中一开始就没有节点,此index大小大于原来的max_index,就将max_index设置为index最后将剩余空间大小减去放入的节点的大小

 

还有从allocator拿内存时,并不是很死板的去取符合大小的节点。而是取适合大小的节点(就是取和它相同大小或比它大的内存节点,当然此时有可能会浪费内存),这样做的目的是因为取有的总比重新分配的要好的。要知道allocator中有的的内存不用其实比浪费更加浪费,毕竟系统内存是很宝贵的

0
0
分享到:
评论

相关推荐

    APR内存池概述.zip_APR内存池概述_apr内存池_内存池

    2. **内存分配**:在内存池中分配内存时,使用`apr_palloc`或`apr_pcalloc`等函数。这些函数会从内存池中找寻合适的空闲块,而不是每次都向操作系统申请。 3. **内存释放**:当不再需要某块内存时,无需调用释放函数...

    apr-1.7.0-apr_escape_test_char.h.zip

    编译 apr 1.7.0 需要的头文件 apr_escape_test_char.h --------------------- /* this file is automatically generated by gen_test_char, do not edit. "make include/private/apr_escape_test_char.h" to ...

    Apr2006_d3dx9_30_x64

    Apr2006_d3dx9_30_x64

    Apache内存池内幕

    ##### 7.3 current_free_index与max_free_index的作用 除了`current_free_index`外,`max_free_index`也是一个重要的概念,它用于标识最大连续空闲内存块的结束位置。 **共同作用:** - **空闲内存范围确定:** ...

    编译 apr 1.6.5 需要的头文件 apr_escape_test_char.h

    编译 apr 1.6.5 需要的头文件 apr_escape_test_char.h, 放到 include目录下面就可以

    APR2007_d3dx9_33_x64

    APR2007_d3dx9_33_x64

    APR2007_d3dx9_33_x86

    APR2007_d3dx9_33_x86

    Apr2005_d3dx9_25_x86

    Apr2005_d3dx9_25_x86.

    Apr2005_d3dx9_25_x64.cab

    Apr2005_d3dx9_25_x64.cab

    apache APR内存池概述

    在APR中,内存池通过`apr_pool_t`结构体表示,它是所有其他APR对象内存分配的根源。 APR内存池的工作原理: 1. 初始化:首先,通过`apr_pool_create`函数创建一个内存池。这会从操作系统获取一大块内存,并设置初始...

    apr_escape_test_char.h

    《apr_escape_test_char.h:Apache Portable Runtime中的字符转义测试》 在计算机编程领域,尤其是在Web开发和网络通信中,字符转义是一个重要的概念。它涉及到将特定字符转换为安全的表示形式,以避免混淆或破坏...

    Apr2006_d3dx9_30

    Apr2006_d3dx9_30_x64.cab

    Apr2007_reproducible_code_rr.zip_hdr_色调映射_色调映射 matlab_高动态_高动态 ma

    Laurence Meylan的基于色调映射的高动态图像显示算法的MATLAB源代码

    apr.tar.gz_apache apr _apr_apr aprutil .tar_apr t_run

    APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期的Apache版本中,应用程序本身必须能够处理...

    APR2007_d3dx10_33_x64

    APR2007_d3dx10_33_x64

    Apr2006_d3dx9_30_x86.cab

    Apr2006_d3dx9_30_x86.cab (这个文件用于极品飞车安装时提示缺少文件的时候用)

    apr_1.5&apr_util_1.5.4

    标题中的"apr_1.5&apr_util_1.5.4"指的是Apache Portable Runtime (APR)的1.5版本及其配套库APR-Util的1.5.4版本。这两个组件是Apache软件基金会项目的重要组成部分,尤其在构建和运行Apache HTTP服务器时不可或缺。...

    apr_mcast.rar_apr_apr_

    6. **处理多路复用**:由于组播可能会有多个数据源,所以需要使用`apr_pollset_add()`将套接字添加到Apr的pollset中,然后使用`apr_pollset_poll()`进行多路复用,以便同时处理多个事件。 在实际应用中,可能还需要...

Global site tag (gtag.js) - Google Analytics