问题标签 [memory-pool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1238 浏览

c++ - 内存池算法

我正在寻找更智能的算法来处理 OpenGL 中的 VBO。

就目前而言,我目前将每个模型存储在 4MB VBO 中。如果模型大于 4MB,则单独存储。对象的存储使得模型汇集在一起​​,以减少绑定的数量。

我遇到的问题是如何清理未使用的 VBO,这些 VBO 仅使用很少。任何有关我如何更好地管理这些内存池的资源都值得赞赏。

0 投票
6 回答
48902 浏览

c - posix_memalign/memalign 做什么

我试图了解什么功能memalign()posix_memalign()做什么。阅读可用的文档没有帮助。

有人可以帮助我了解它的工作原理以及它的用途吗?或者,也许提供一个使用示例?

我试图了解 linux 内存是如何工作的,我需要编写自己的简单内存池(低碎片堆)。

0 投票
2 回答
5968 浏览

c++ - 利用底层内存池的 C++ 自定义分配器

我正在使用一个内存池类,它重用分配的内存地址和一个包装该类的自定义分配器。以下代码片段为您提供了界面的基本概念。

当然,对这样的东西的需求是有限的。然而,它在您需要的情况下非常有用: - 为一个以非常幼稚的方式使用该分配器的类指定一个分配器类型(例如,避免分配较大的块,即使它是可取的)。- 重复分配和释放相同大小的内存。- 您希望使用分配器的类型非常小(例如,内置类型,如 char、short、int 等)。

从理论上讲,实现可以利用 memory_pool 分配实际分配大小的倍数,每次它需要这样做(来自底层内存管理器)。靠得很近的对象更适合任何缓存和/或预取算法。我已经实现了这样一个内存池,它有一些开销来处理正确的分配、拆分和释放(我们不能释放用户将传递给释放的每个地址。​​我们只需要释放作为我们拥有的每个内存块开头的地址之前已分配)。

我已经使用以下非常简单的代码测试了这两种情况:

std::list正在调用allocactor::allocate(1, 0)每次push_back调用。unique()确保每个元素都会被触摸并与下一个元素进行比较。然而,结果令人失望。管理按块分配内存池所需的最小开销大于系统获得的任何可能优势。

你能想出一个可以提高性能的场景吗?

编辑: 当然,它比std::allocator.

0 投票
5 回答
4620 浏览

c++ - 关于内存池的问题

我需要对内存池的概念和实现进行一些说明。

通过wiki上的内存池,它说

也称为固定大小块分配,...,因为这些实现由于块大小可变而遭受碎片,由于性能原因,不可能在实时系统中使用它们。

“可变块大小导致碎片”如何发生?固定大小的分配如何解决这个问题?这个 wiki 描述对我来说听起来有点误导。我认为固定大小的分配或可变大小无法避免碎片。在内存池上下文中,通过为特定应用程序设计的特定内存分配器可以避免碎片,或者通过限制使用预期的内存块来减少碎片。

同样通过几个实现示例,例如Code Sample 1Code Sample 2,在我看来,要使用内存池,开发人员必须非常了解数据类型,然后将数据切割、拆分或组织到链接的内存中块(如果数据接近链表)或分层链接块(如果数据更分层组织,如文件)。此外,似乎开发人员必须事先预测他需要多少内存。

好吧,我可以想象这对于一组原始数据很有效。内存模型不那么明显的 C++ 非原始数据类呢?即使对于原始数据,开发人员是否应该考虑数据类型对齐?

是否有适用于 C 和 C++ 的良好内存池库?

感谢您的任何评论!

0 投票
1 回答
386 浏览

c++ - 为组件构建数据池

我正在运行带有 Core Duo 的 Windows 7。我已经使用 Codeblocks 一段时间了,我想我已经使用了 GNU 编译器。

我有(或将有)许多从抽象类继承的组件类Component。我需要帮助建立一个系统来容纳未确定数量的组件类型的内存池,每个类型都有未确定数量的组件。也许为了争论后者是固定的,我可以弄清楚在绝对必要时如何改变大小。

此外,方便的是,每种组件类型都有一个unsigned short从 0 到没有孔的 ID ( )。耶!

所以,假设我有一些管理类来跟踪数组大小和事物,这样的事情会起作用吗?

或许sizeof(FooComponent)可以加入Params。

然后(我真的开始不知道该怎么做)在函数内部做一个malloc( START_COUNT * component_size)

我没有这样分配内存的经验。我可以轻松地设置类似

vector< vector<Component*>* >或者
map<unsigned short, vector<Component*> >

但它(对于一个人来说很难看)并没有给我连续的游泳池。我需要缓存友好:)

想法?模式?成语?帮助?

0 投票
3 回答
3173 浏览

linux - “内存缓存”和“内存池”的区别

通过阅读“understanding linux network internals”和“understanding linux kernel”这两本书以及其他参考资料,我很困惑,需要对“内存缓存”和“内存池”技术进行一些澄清。

1)它们是相同的还是不同的技术?

2)如果不相同,是什么造成了差异或不同的目标?

3) 另外,Slab Allocator是怎么进来的?

0 投票
3 回答
3149 浏览

c++ - 共享内存实现上的 C++ 内存池:这种分配和释放方法是否正确?

我可以要求我的任何响应者只考虑“纯”C/C++(无论这意味着什么)吗?STL 没问题。升压不是。

我正在编写自己的 C++ 内存池类(在 Linux 系统上),用于在共享内存中分配和释放 C++ 对象。我需要这个来通过多个进程访问相同的对象。我将使用 POSIX 信号量控制对内存池对象操作的访问,但我有一个基本的分配/解除分配问题。我的代码仅适用于从同一个池中分配的相同大小的对象。目前,我们可以忽略与池的动态增长和收缩相关的问题。

考虑到我为总共 MAXFOOOBJECTS Foo 对象定义了一个共享内存段。我以以下方式定义共享内存段:

通过使用此共享内存的所有进程,内存将被解释为:

假设我有一个对象 Foo 定义如下:

现在,我的问题是:

  1. 上述方案对你们来说是否可行(每个新的和删除的都是 O (1))还是我错过了一些非常重要的东西?我立即看到的一个问题是,如果 Foo 对象数组被解释为最小堆,例如,我每次执行 new 和 delete 时都会终止堆属性。
  2. 如果我保证这个池不会用于最小堆(例如,根据定时器管理技术的需要),我们对上述方案有什么问题吗?
  3. 另一方面,我可以将共享内存中的 Foo 数组作为最小或最大堆进行管理(即,在新建和删除期间),并且每次新建或删除都会导致 O (lg n) 最坏情况。任何意见?
  4. 还有其他更好的方法吗?
0 投票
1 回答
542 浏览

c++ - 使用带有 boost::bimap 的自定义分配器

我正在努力提高同时使用 Boost Graph Library 和boost::bimap. 分析表明,大部分时间都花在了内存分配和释放上。使adjacency_list图形库的类使用boost::fast_pool_allocator显着提高了性能。大部分剩余内存分配发生在 中boost::bimap,所以我也想尝试在那里使用自定义分配器。文档说您可以将分配器指定为 bimap 的最后一个模板参数,但它没有说明分配器本身的模板参数应该是什么类型。例如,对于类型XY,在

应该填写什么Z

0 投票
0 回答
92 浏览

memory-pool - 池内存中的分配

在过去的几天里,我对此进行了很多搜索,但没有找到任何答案。

我创建了一个大内存池。现在,假设这是我第一次访问该池,我想从该池中分配一个包含 5 个元素的数组。我将它的起始地址提供给数组,以便我可以使用它。

现在我将使用如下循环运行数组:

在正常的分配方式中,当 i=5 时应该会发生异常,但在我的情况下,它不会发生,因为我在给定起始地址之后分配了大内存。如何防止在我不应该写入/访问的地址中写入/访问?有办法吗?

提前致谢。

0 投票
0 回答
530 浏览

java - 从 JVM 中检索 Tenured Generation 内存池

我正在寻找一种在 JVM 中找到 Tunered Generation 池的方法,之前我尝试按名称查找此池:“Tunered Gen”,但在某些情况下,该池名为“PS Old Gen”。所以我想到了更通用的方法来找到存储所有旧对象的池。

你怎么看?也许有人可以提出另一种解决方案?

问候, 马克西姆