zoukankan      html  css  js  c++  java
  • netty中的PoolChunk

    数据结构学的烂,看这个类比较的吃力

    PoolChunk主要使用long allocate(int normCapacity) 在buffer pool中分配buffer。这个类有几个重要的概念:page:是chunk中内存分配的最小单元,chunk:表示一系列的page, 一个chunk的大小chunksize=2{maxorder}*pageSize。

    首先需要分配一个长度等于chunksize的字节数组,当需要从中分配一个bytebuf时,返回一个第一个有足够空间满足这个bytebuf大小的位置。然后标记这块缓冲不可再分配了,除非该bytebuf释放。

    为了在chunk中搜索满足大小的内存快的偏移,我们需要构造一个完全满二叉树,该二叉树使用byte[]存储-memoryMap,该二叉树的深度为maxOrder+1,从0开始计数,

    0                                           1

    1                                    2                  3

    2                                4       5         6       7

    3                            8    9 10  11 12  13  14 15

    maxOrder 

    这个满二叉树,每个叶子结点标识一个page的使用状态,根结点就标识整个chunk的使用状态。 二叉树的length为2{maxorder+1}*pageSize.  [0]不存储值

    在chunk中分配算法如下,如果要分配一个chunksize/2{k},我们将从第k层从左到到右中寻找未使用的节点。

    memoryMap[id]=depth_of_id   =>没有使用

    memoryMap[id]>depth_of_id   =>他的子结点被分配了,该结点不能分配,但是他的子结点还可以被分配。

    memoryMap[id]=maxorder+1   =>子结点完全分配完了

    allocateNode(d)的算法如下:

    1:从root结点开始(depth=0或者id=1)

    2: 如果memoryMap[1]>d 该chunk无缓冲非陪

    3:如果左结点的值<=h,我们从左子树开始一直向左移动

    4:否则试下右子树 

  • 相关阅读:
    [HNOI2008]玩具装箱toy(dp+斜率优化)
    hdu 4597 Play Game(记忆化搜索)
    下载文件,ie文件名称乱码问题
    HDU 2138 How many prime numbers
    Codeforces Round #277 (Div. 2)---A. Calculating Function (规律)
    MapReduce-MulitipleOutputs实现自己定义输出到多个文件夹
    EFM8单片机与I2C外设通信
    linux杂谈(十一):LDAPserver的搭建
    Redis命令学习-string类型操作
    Java 实现单链表反序
  • 原文地址:https://www.cnblogs.com/gaoxing/p/4268990.html
Copyright © 2011-2022 走看看