首页 > 其他分享 >brpc - ResourcePool

brpc - ResourcePool

时间:2023-06-04 20:32:06浏览次数:28  
标签:freeChunk ResourcePool brpc resource get 代码 block 资源

资源池 ResourcePool

ResourcePool<T>::singleton()->get_resource(id, arg1);

template <typename T>
class ResourcePool { ... }

是个类模板,单例模式。

主要成员: get_resource / return_resource

有个 LocalPool 成员, 依赖它实现 get 和 return。

LocalPool

有一个概念是 FreeChunk, 用于挂载空闲的资源。

数据结构为 : { nfree,ids[] }

资源池整体的逻辑就是, 先从freeChunk上取,如果freeChunk上没有,那么从大的内存块上切,如果无空间可切了,那就只能返回NULL了。

为什么要先从freeChunk上取呢?因为这里挂载的是旧的 归还的内存地址。 为了尽可能的实现资源的复用,而不是每次都从block上切。毕竟block也是可以有多个的,当前block切完了,可能需要创建新的block。

主要代码:

brpc - ResourcePool_brpc

上面的是取资源的主要逻辑。

而归还资源,肯定是往freeChunk上挂载。


其它

在我的工作中,也实现过功能类似的模块(整体思路基本一致,实现的时候没有任何资源池代码的了解,场景来了,优化思路和实现想法自然就来了),但只是一个单线程的内存池的优化(场景就是单线程),brpc资源池这里对模板的使用还是值得学习一下的(平时自己写模板代码的机会比较少)。

有时候,看别人的代码是一个探索的过程,我觉得比看小说有意思多了,看小说就像看我的这篇唠叨话,这些东西都是喂给你的。而看别人代码,是有一个“猜”与“验证”的环节存在的。 

标签:freeChunk,ResourcePool,brpc,resource,get,代码,block,资源
From: https://blog.51cto.com/u_15370559/6412227

相关文章

  • brpc - Socket::Write
    Socket::Write构建一个WriteRequest,然后调用StartWrite().Socket::StartWrite有一个_write_head成员,每次写入时,会将WriteRequest地址写入这个成员,写入操作会返回旧的req。如果旧的req存在,则req->next=old_req,当前线程直接返回。当前的req会在旧req写完之后被写入。......
  • 又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目
    2023年1月26日,Apache软件基金会(ASF)官方正式宣布ApachebRPC正式毕业,成为Apache的顶级项目。我听到这个消息是挺开心的,毕竟是又一款由国人主导的apche顶级项目,再次证明国内在开源界正在发挥越来越重要的作用。ApachebRPC的历史ApachebRPC的前身是百度内部的一个RPC框......
  • 又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目
    2023年1月26日,Apache软件基金会(ASF)官方正式宣布ApachebRPC正式毕业,成为Apache的顶级项目。我听到这个消息是挺开心的,毕竟是又一款由国人主导的apche顶级项目......
  • brpc内存管理
    内存管理总是程序中的重要一环,在多线程时代,一个好的内存分配大都在如下两点间权衡:线程间竞争少。内存分配的粒度大都比较小,对性能敏感,如果不同的线程在大多数分配时会竞......