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:否则试下右子树 

  • 相关阅读:
    gradle项目与maven项目互转
    GET和POST两种基本请求方法的区别
    gradle项目打war和jar包
    maven项目打war和jar
    winsw打包jar
    前端
    CentOS
    Vue
    Spring
    Vue
  • 原文地址:https://www.cnblogs.com/gaoxing/p/4268990.html
Copyright © 2011-2022 走看看