c++ - 内存分配与 Linux 中的 RSS

标签 c++ linux memory

我正在尝试在 Linux 中以编程方式监视 RSS(驻留集大小)(通过解析 /proc/self/stat),但似乎 RSS 并没有随着我分配内存而增加。

例如,考虑以下分配 10 个 4KB 缓冲区并在每次分配后打印 RSS 的程序。

 int main(int argc, char** argv) {
  const long pageSizeKb = sysconf(_SC_PAGE_SIZE) / 1024;
  cout << "pageSizeKB is " << pageSizeKb << "\n";
  std::vector<std::vector<char>> buffers;
  for (int i = 0; i < 10; i++) {
    buffers.emplace_back(4*1024);
    std::string line;
    getline(ifstream("/proc/self/stat", ios_base::in), line);
    std::vector<string> stats;
    boost::split(stats, line, boost::is_any_of(" "));
    cout << "allocated " << (i+1)*4 << "KB" << "\tRSS is " << stats[23] << "\n";
  }
}

它的输出是:

pageSizeKB is 4
allocated 4KB   RSS is 53507
allocated 8KB   RSS is 53507
allocated 12KB  RSS is 53507
allocated 16KB  RSS is 53507
allocated 20KB  RSS is 53507
allocated 24KB  RSS is 53507
allocated 28KB  RSS is 53507
allocated 32KB  RSS is 53507
allocated 36KB  RSS is 53507
allocated 40KB  RSS is 53507

RSS 不是应该在每次分配后加一吗(页面是 4KB)?

谢谢

最佳答案

不,预计 RSS 不会在每次分配后都增长。

不断向操作系统请求少量内存是低效的,因此一个好的分配器会请求更大的 block ,然后在不让操作系统参与的情况下将其分配出去。

此外,内存是延迟分页的。一个大的、未触及的分配不会对 RSS 有贡献。 (在这种特殊情况下,vector 将确保内存已初始化,因此这不是这里的问题,但如果您使用 .reserve(4096) 分配它可能是问题)。

这意味着您会看到连续多次分配+初始化的内存保持不变,然后突然上升。如果您继续分配更多数据,您可能会看到这种效果。

关于c++ - 内存分配与 Linux 中的 RSS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58699165/

相关文章:

caching - 对于缓存 GPU 来说,哪种内存访问模式更高效?

c++ - 如何在没有源文件的情况下使用静态库(在我的例子中是 assimp)

c++ - C++ 类中的数字加法和减法

c++ - 关于处理超过 1024 个套接字描述符

regex - 从 url (www.google.com=google) 匹配域名

java - flex ant 任务中的 flex 编译器错误(警告)消息

c++ - 类名作为 vector 的对象和 push_back 函数的参数

c++ - 是否可以在不编写复制构造函数的情况下在 main 中的构造函数之间进行选择?

c++ - 宏是否分配内存?

haskell - Haskell程序的-hc配置文件中PINNED是什么意思?