问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

LEVEL是什么意思?

发布网友 发布时间:2022-04-23 05:14

我来回答

5个回答

懂视网 时间:2022-05-03 14:30

是什么

内存分配管理器,主要为skiplist即Memtable服务而不是整个项目。申请内存时,将申请到的内存直接放入vector中,在Arena的生命周期结束后,统一释放掉所有申请的内存,内部结构如下图:

技术图片

为什么要用

  • 避免内存碎片,skiplist里面记录的都是用户传进来的key/value,这些字符串有长有短,放到内存中很容易导致内存碎片
  • 学到什么

  • 与(&)操作进行内存对齐
  • atomic保证原子性
  • 使用delete避免拷贝和赋值操作
  • 源码分析

    首先看一下内部成员

     // Allocation state
     char *alloc_ptr_; // 内存偏移量指针,指向未使用内存的首地址
     size_t alloc_bytes_remaining_; // 剩下内存数
    
     // Array of new[] allocated memory blocks
     std::vector<char*> blocks_; // 存储每次分配的内存指针
    
     // Total memory usage of the arena.
     //
     // TODO(costan): This member is accessed via atomics, but the others are
     //  accessed without any locking. Is this OK?
     std::atomic<size_t> memory_usage_;
    

    构造函数和析构函数

    Arena::Arena() // vector调用默认构造函数初始化
     : alloc_ptr_(nullptr), alloc_bytes_remaining_(0), memory_usage_(0) {}
    
    Arena::~Arena() {
     for (size_t i = 0; i < blocks_.size(); i++) {
     delete[] blocks_[i];
     }
    }
    

    拷贝构造和拷贝赋值

     Arena(const Arena&) = delete;
     Arena& operator=(const Arena&) = delete;
    

    主要对外接口

     // Return a pointer to a newly allocated memory block of "bytes" bytes.
     char* Allocate(size_t bytes);
    
     // Allocate memory with the normal alignment guarantees provided by malloc.
     char* AllocateAligned(size_t bytes);
    

    具体实现如下:

    inline char* Arena::Allocate(size_t bytes) {
     // The semantics of what to return are a bit messy if we allow
     // 0-byte allocations, so we disallow them here (we don‘t need
     // them for our internal use).
     assert(bytes > 0);
     if (bytes <= alloc_bytes_remaining_) { // 需要内存小于剩余内存,直接分配
     char *result = alloc_ptr_; // 保存指针,用于返回
     alloc_ptr_ += bytes;
     alloc_bytes_remaining_ -= bytes;
     return result;
     }
     return AllocateFallback(bytes); // 需要内存大于剩余内存
    }
    

    需要内存大于剩余内存时,调用AllocateFallback()分配内存:

  • 如果需要内存大于4096/4,则直接分配一块大小为bytes内存,避免每次剩余内存不可用,造成浪费。
  • 否则,重新分配一个内存块(默认大小4096)用于存储数据,虽然浪费了当前内存块的剩余内存,但当下次再分配小内存时,可以直接使用,减少内存分配次数。
  • 具体实现如下:

    char* Arena::AllocateFallback(size_t bytes) {
     if (bytes > kBlockSize / 4) {
     // Object is more than a quarter of our block size. Allocate it separately
     // to avoid wasting too much space in leftover bytes.
     char *result = AllocateNewBlock(bytes);
     return result;
     }
    
     // We waste the remaining space in the current block.
     alloc_ptr_ = AllocateNewBlock(kBlockSize);
     alloc_bytes_remaining_ = kBlockSize;
    
     char *result = alloc_ptr_;
     alloc_ptr_ += bytes;
     alloc_bytes_remaining_ -= bytes;
     return result;
    }
    

    其中分配新内存块实现如下:
    memory_order_relaxed:针对只要求原子操作,除此之外不需要其它同步保证,计数器是一种典型应用场景。

    char* Arena::AllocateNewBlock(size_t block_bytes) {
     char *result = new char[block_bytes];
     blocks_.push_back(result); // 申请块放入vector,以便析构函数释放内存
     memory_usage_.fetch_add(block_bytes + sizeof(char*),
        std::memory_order_relaxed);
     return result;
    }
    

    对齐内存分配

    char* Arena::AllocateAligned(size_t bytes) {
     const int align = (sizeof(void*) > 8) ? sizeof(void*) : 8; // 与系统相关,4或8
     static_assert((align & (align - 1)) == 0,
      "Pointer size should be a power of 2"); // 确保是2的指数次方
     size_t current_mod = reinterpret_cast<uintptr_t>(alloc_ptr_) & (align - 1); // 当前指针模对齐值
     size_t slop = (current_mod == 0 ? 0 : align - current_mod); // 还差slop个字节对齐
     size_t needed = bytes + slop;
     char *result;
     if (needed <= alloc_bytes_remaining_) { 
     result = alloc_ptr_ + slop; // 对齐地址
     alloc_ptr_ += needed;
     alloc_bytes_remaining_ -= needed;
     } else {
     // AllocateFallback always returned aligned memory
     result = AllocateFallback(bytes);
     }
     assert((reinterpret_cast<uintptr_t>(result) & (align - 1)) == 0);
     return result;
    }
    

    读取内存使用

     // Returns an estimate of the total memory usage of data allocated
     // by the arena.
     size_t MemoryUsage() const {
     return memory_usage_.load(std::memory_order_relaxed);
     }
    

    【LevelDB源码阅读】Arena

    标签:释放   结构   code   系统   access   pre   leveldb   tin   alignment   

    热心网友 时间:2022-05-03 11:38

    LEVEL的意思:

    n.水平,水准;水平线,水平面;水平仪;[物]电平。

    adj.水平的;同高度的;平均的;平稳的。

    vt.使同等;对准;弄平。

    vi.拉平;(用*等)瞄准(与 at 连用);变得平坦;将(话、批评等)对准目标。

    vi.瞄准;拉平;变得平坦。

    音标:level英 [ˈlevl]   美 [ˈlɛvəl]  

    level的用法示例如下:

    He forced his voice to remain level. 

    他竭力使自己的语气保持平静。


    level第三人称单数: levels 复数: levels 现在分词: levelling 过去式: levelled 过去分词: levelled。

    level的记忆技巧:lev 提高 + el 地点 → 举到同一高度 → 平的。

    level, flat这两个词都有“平的”“平坦的”意思。其区别在于:

    1.flat指表面水平或类似水平,即没有显著的起伏与倾斜。

    2.level指“平均”,即没有明显的弯曲与凸凹,但不一定水平。例如:

    This road is level until you get near the hill.

    这条路很平,你可直达附近小山。

    热心网友 时间:2022-05-03 12:56

    level
    KK: []
    DJ: []
    n.
    1. 水平线;水平面[C]
    The village is 1,000 meters above sea level.
    这村子海拔一千米。
    2. 高,高度[C][U]
    The flood rose to a level of 50 feet.
    洪水涨到五十英尺高。
    3. (建筑物的)层[C]
    4. 平坦的表面;平坦地区[C]
    5. (文化等的)水平,程度,标准[C][U]
    These students have not reached an advanced level yet.
    这些学生尚未达到高级班的程度。
    6. 【美】水平仪;水平测量[C]
    7. 级别;地位[C]
    They are holding a conference at ministerial level.
    他们正在举行*级会议。
    a.
    1. 水平的,平的
    Some streets are not level in the city.
    城里有几条街道不平坦。
    2. 同高度的,同水平的,同程度的,并进的[F][(+with)]
    The little girl's head is level with her mother's knee.
    这小女孩已经长到她母亲膝盖那么高了。
    3. 笔直的,直盯着的
    She gave me a level look.
    她直瞪瞪地看我一眼。
    4. 平稳的;冷静的
    He was getting angry but his voice remained level.
    他很生气,但说话的语气仍很平静。
    5. 【口】公平的;诚实的
    vt.
    1. 弄平,推平[(+out/off)]
    The bulldozer leveled the mound of earth.
    推土机把土堆铲平。
    2. 夷平;毁坏;击倒
    The trees were leveled by the typhoon.
    树木被台风刮倒了。
    3. 使平等,使划一
    4. 把...对准[(+at)]
    vi.
    1. 变平
    The deck of the ship leveled as the wind subsided.
    随着风的平息,船甲板也平稳了。
    2. 用*瞄准[(+at)]
    3. 坦率诚实地对待[(+with)]
    4. 对准[(+at)]
    Her eyes leveled at him.
    她的眼睛盯着他。

    热心网友 时间:2022-05-03 14:31

    付费内容限时免费查看回答你好,很荣幸为您解答。意思是:生日的意义在于你在乎的人陪你一起过。

    热心网友 时间:2022-05-03 16:22

    跑跑的L就是等级了
    没别的意思
    跑跑国服还没出L1
    韩服才有

    国服最高是L2
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    有什么好玩且免费的游戏吗??? 有什么游戏比较好玩免费耐玩的吗? 寻找一个真正免费休闲的游戏?不要征途那样的 这几天因为喝酒吃烧烤弄得痔疮犯了,想去看,请问在包头较好治疗的医院... 最近因为工作的原因弄得痔疮犯了,想去看,请问在包头哪里治疗较好?_百度... 现在在包头,这几天因为喝酒弄得痔疮犯了,想去看,请问在哪家医院好?_百 ... 包头痔疮做手术要多少钱 包头痔疮手术需要多少费用 申玉菲那么有钱,为什么还住地下室? 中华英才网工作靠谱吗? 怎样快速醒酒 怎样尽快醒酒啊?快 第二天醒酒快的方法有哪些? 注册过12306什么都忘记了怎么找回啊! 忘记了12306的帐号怎么办? 红酒醒酒需要时间,红酒醒酒需要多长时间? 怎样最快醒酒? 醒酒器的醒酒方法 玩抖音怎么做才能赚到钱? 快速醒酒器的原理是什么? 抖音,快手点赞赚钱是真的吗 什么能醒酒最快速 怎样醒酒快有效简单 12306账号找不回来怎么办? 抖音点赞评论赚钱是真的吗? 快速醒酒器如何醒酒? 抖音点赞挣钱的怎么样啊,是不是骗人的,有知道的吗? 快速醒酒器和传统醒酒器哪个醒酒效果好 玩抖音点赞挣钱会不会触碰法律底线? 抖音点赞多少钱一万 抖音可以出钱买赞吗 level是不是等级的意思? level等级是什么? 请教:Level 是什么意思? level是档次的意思吗? level的英语意思是什么? 快走要多快可以达到减肥的效果,每天走多久 LeVeL中文是什么意思啊? 请问把电脑放在电脑包里再放在棉被里,行李箱是强力挤压合上的,电脑会... 快走减肥要走多长时间,速度多少才能有效果? 档次用英语怎么说? 把笔记本放在电脑包里,然后在放到行李箱里,行李箱放在客车的后备箱里,电脑没事吧? 快走减肥走多少时间开始燃烧脂肪? level是可数吗? 笔记本可以放行李箱里拖着走吗?还是装电脑包里背着? 每天快走多久能减肥 level和standard的区别是什么? 请问,笔记本电脑能装在行李箱里面登机吗? 每天快走40分钟能减肥吗 古风灯笼如何制作? 电工术语中level是什么意思?