【问题标题】:Fractured Memory Pages during Memory Allocation?内存分配期间的内存页面断裂?
【发布时间】:2016-12-06 10:46:44
【问题描述】:

我目前的情况如下:我用malloc(t) 分配tbytes 然后我用数据填充这个内存(只是为了强制从虚拟内存映射到物理内存)。内存页大小为 4kB。

鉴于这种情况,我有以下问题:

1.) 这使用了多少物理内存(我看到以下选项):

  • 正是tbytes 没有浪费内存(甚至不是部分内存页面)
  • tB + 最多 4kB(一个内存页浪费它可以在同一个进程中使用)。
  • tB + 最多 4kB(一页内存浪费,分配存在时不能使用)
  • 由于映射技术可能会浪费超过一页(2 魔法或页面块的某种力量......其他原因)

2.) 这块连续的虚拟内存(一次分配)是否也会映射到一块连续的物理内存?

3.) 如果有一些浪费,我可以测量我的应用程序的确切内存占用吗?最好来自 C++ 内部。

我应该注意,目前我的代码在 ubuntu linux 机器上运行,但仍然欢迎深入了解其他系统。

【问题讨论】:

  • 2.不,这是虚拟/分页内存背后的想法之一。只要有足够的空闲物理页,您就可以分配新内存。无论它们是在物理地址空间中形成连续区域还是沿其严重分散都无关紧要。
  • 感谢 gudok,虽然我认为可能有一项鼓励“并排映射”的政策,但我也有同样的期待。我认为对于当前的关联缓存和预取器来说可能会更好。
  • 这里有没有答案的问题?因为你还没有关闭它

标签: c++ linux memory memory-management


【解决方案1】:
    • 首先,内存分配总是四舍五入(向上)到页面大小。
    • 我不明白您所说的“存在分配时”...
    • 虽然它会导致很多问题,但进程中每个拥有指向已分配内存的指针的线程都可以访问它(因此您需要同步这些线程等。
  1. 你已经得到了答案。
  2. 您可以使用mmap

【讨论】:

  • 1. - 对于小分配来说,这似乎太贵了(我知道无论如何都不应该使用它们,但每次分配要四舍五入到 4KB?)
  • 虽然分配存在意味着 -- 当分配被释放时,它的内存将再次可用。为什么说并发?这个问题没有提到多个线程。如何使用 mmap 测量内存使用情况?
  • 我真的没有低估你写的东西......无论如何,有很多工具可以测量内存使用情况:mmap,valgrind......取决于你的操作系统
猜你喜欢
  • 2012-01-24
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2012-11-18
  • 2015-05-16
相关资源
最近更新 更多