linux下可以分配大容量的虚拟内存吗?

2023-12-26

对于某些目的来说,分配大量的虚拟空间并仅在访问的页面中进行分页会很有效。分配大量内存是瞬时的,并且不会实际抓取页面:

char* p = new char[1024*1024*1024*256];

好吧,上面指出的是错误的,因为它是一个 32 位数字。

我预计 new 正在调用 malloc,而 malloc 又调用 sbrk,并且当我访问超出起始位置 4Gb 的位置时,它会尝试将任务内存扩展那么多?

这是完整的程序:

#include <cstdint>
int main() {
  constexpr uint64_t GB = 1ULL << 30;
  char* p = new char[256*GB]; // allocate large block of virtual space
  p[0] = 1;
  p[1000000000] = 1;
  p[2000000000] = 1;
}

现在,当我尝试分配大量内存时,我得到了 bad_alloc,所以显然 malloc 不起作用。

我的印象是 mmap 会映射到文件,但由于这是建议我正在研究它。

好的,所以 mmap 似乎支持分配大面积的虚拟内存,但它需要一个文件描述符。创建巨大的内存数据结构可能是一个胜利,但如果它们必须由文件支持则不然:

尽管我不喜欢附加到文件的想法,但以下代码使用 mmap。我不知道要在虚拟内存中请求什么数字,所以选择了 0x800000000。 mmap 返回 -1,所以显然我做错了什么:

#include <cstdint>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

int main() {
  constexpr uint64_t GB = 1ULL << 30;
  void *addr = (void*)0x8000000000ULL;
  int fd = creat("garbagefile.dat", 0660);
  char* p = (char*)mmap(addr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
  p[0] = 1;
  p[1000000000] = 1;
  p[2000000000] = 1;
  close(fd);
}

有没有办法分配大块虚拟内存并稀疏地访问页面,或者这是不可行的?


linux下可以分配大容量的虚拟内存吗?

可能吧。但您可能需要将其配置为允许:

Linux内核支持以下几种过载处理模式

0 - 启发式过量使用处理。明显的地址过量使用 空间被拒绝。用于典型系统。它确保了认真 疯狂分配失败,同时允许过度使用以减少交换 用法。 root 可以在此分配稍微多一点的内存 模式。这是默认设置。

1 - 总是过度投入。适用于某些科学应用。 经典示例是使用稀疏数组并仅依赖于 虚拟内存几乎完全由零页组成。

2 - 不要过度投入。系统的总地址空间提交 不允许超过交换+可配置的金额(默认为 50%) 的物理 RAM。取决于您使用的量,在大多数情况下 这意味着进程在访问时不会被终止 页,但会在适当的情况下收到内存分配错误。

对于想要保证内存的应用程序很有用 未来将可以进行分配,而无需 初始化每个页面。

过量使用策略是通过 sysctl ‘vm.overcommit_memory’ 设置的。

因此,如果您想分配比物理内存更多的虚拟内存,那么您需要:

# in shell
sysctl -w vm.overcommit_memory=1

RLIMIT_AS 进程虚拟内存(地址空间)的最大大小(以字节为单位)。此限制会影响对 brk(2)、mmap(2) 和 mremap(2) 的调用,超过此限制后,这些调用会失败并出现错误 ENOMEM。此外,自动堆栈扩展也会失败(如果没有通过 sigaltstack(2) 提供可用的备用堆栈,则会生成 SIGSEGV 来终止进程)。由于该值是 long,因此在具有 32 位 long 的计算机上,此限制最多为 2 GiB,或者此资源是无限的。

所以,你想要:

setrlimit(RLIMIT_AS, {
    .rlim_cur = RLIM_INFINITY,
    .rlim_max = RLIM_INFINITY,
});

或者,如果您无法授予进程执行此操作的权限,那么您可以在 /etc/security/limits.conf 中永久配置它,这将影响(用户/组的)所有进程。


好的,所以 mmap 似乎支持...但它需要一个文件描述符。 ...可能是一个胜利,但如果它们必须有文件支持则不然...我不喜欢附加到文件的想法

您不需要使用文件支持的 mmap。有 MAP_ANONYMOUS 来解决这个问题。

我不知道要输入什么号码来请求

然后使用空值。例子:

mmap(nullptr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)

也就是说,如果您已经按照描述配置了系统,那么new应该同样有效mmap。大概会用到malloc这可能会使用mmap对于像这样的大分配。


额外提示:您可能会受益于使用巨大的TLB页面 https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/mm/hugetlbpage.rst.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下可以分配大容量的虚拟内存吗? 的相关文章

随机推荐

  • 当List填充数组时,如何在SwiftUI中获取List中元素的索引?

    在我的 SwiftUI 应用程序中 我有一个项目列表 我正在使用 MenuItems 数组来填充列表 struct MenuItem Identifiable Equatable var id UUID var text String st
  • 错误:Ionic 的构造函数参数中没有 http 提供程序

    我正在学习葡萄牙语教程 该教程教授如何构建您的第一个 Ionic 应用程序 使用最新版本安装 npm node js Angular Ionic 和 Cordova 后 我开始编写代码 代码本身非常简单 import Component f
  • 适用于 ios 应用程序的 django csrf for api

    我正在构建一个 ios 应用程序 它与服务器通信以获取数据 如果它只是一个普通的应用程序 我可以通过表单发送 csrf 令牌 因为全部来自同一域 但是 对于 ios 应用程序 我认为我无法设置 csrf token 因此 当从 ios 应用
  • 通过 MVC 和 RAZOR 编写 JSON

    我有一个 ASP NET MVC 4 应用程序 这个应用程序有一个视图 页脚中有一个 JavaScript 块 我正在使用 RAZOR 视图引擎 我正在尝试弄清楚如何将结果集转换为 JSON 数组 目前 我正在执行以下操作
  • 在 Ubuntu 中安装 npm 包时出错 [重复]

    这个问题在这里已经有答案了 我有一个项目 以前工作正常 突然开始显示此错误 这是一个使用create react app创建的react项目 同样的错误npm install and npm f install sudipt sudo De
  • 想要通过在 swift 中使用滑动手势在选项卡栏之间导航

    我想使用滑动手势在选项卡栏控制器之间导航 同时保留默认选项卡栏 我使用了这段代码 但显示错误 import UIKit class FirstViewController UIViewController override func vie
  • 模拟指标有什么影响?

    使用 xib 文件时 更改模拟指标会对您的代码 应用程序产生什么影响 或者它只是为了您的利益而作为预览工具 实际上 更改模拟指标确实会以一种非常隐蔽的方式影响您的应用程序 我发现在使用 SwipeView 库时 我的幻灯片都受到更改模拟指标
  • Ubuntu 上的 Haskell (GHC) 中的线程延迟问题

    我注意到我的一些机器上 GHC Conc 中的 threadDelay 函数有奇怪的行为 以下程序 main do print start threadDelay 1000 1000 print done 正如预期的那样 运行需要 1 秒
  • 使用BackgroundWorker处理多个操作

    我在 winform 上有一个 DataGridView 我在表单的加载方法中动态添加 DatagridViewButtonColumn 按钮名称为 btnAction 文本显示为 Process 因此 网格中的每一行的最后一列都会有此 处
  • 使用导航视图菜单项上的选择器添加自定义形状波纹

    我想添加带有圆角矩形的波纹效果以及导航视图项目的选择器 但它不断添加灰色矩形波纹效果 导航视图
  • Chrome 的“跨源读取阻止 (CORB) 阻止了跨源响应”离子

    我正在尝试对用户进行身份验证 但由于以下原因我无法调用 Api跨源读取阻止 CORB 被阻止问题我的login ts代码是 if this plugins isOnline if this wait true return else if
  • 如何在c#中找到驱动器的空闲百分比

    如何在c 中找到驱动器的百分比 例如 如果 c 为 100 GB 并且已用空间为 25 GB 则可用百分比应为 75 Use the DriveInfo class http msdn microsoft com en us library
  • Facebook Webforms 应用程序获取 app_data 查询字符串

    如何从 Facebook Webforms 应用程序获取 app data 查询字符串 我希望能够在查询字符串中发送一些信息 以便我可以在我的应用程序上显示不同的主屏幕 该应用程序位于页面选项卡中 例子 如何从 app data 获取 Pa
  • 显示图像并转换为灰度 - OpenCV for Android、Java API

    我正在 Eclipse 中编写一个 Android 应用程序 它使用OpenCV4Android http code opencv org projects opencv wiki OpenCV4AndroidAPI 我怎样才能显示一个Ma
  • 从 C++ 本机插件更新 Vector3 数组

    Marshal Copy 方法仅支持少数数组类型 现在我只知道如何复制IntPtr 从 C 代码指向浮点数组 float IntPtr pvertices GetVerticesFromCPP float vertices new floa
  • 使用 linq 删除代码时出现错误

    我遇到有关使用组合框删除数据的问题 该错误提示我不知道如何解决 任何人都可以帮助我吗 private void btnDel Click object sender EventArgs e using testEntities Setupc
  • ByVal 与 ByRef VBA

    我尝试过 JaredPar 回答的问题ByRef 与 ByVal 说明 https stackoverflow com questions 4383167 byref vs byval clarification ByVal在 VB NET
  • ant 构建文件设置 javac 位置

    我正在编辑一个旧项目的构建文件 当我向使用 Java 1 6 的项目添加一些 jar 文件时 它不会构建 它说 javac javac invalid target release 1 6 很明显 我需要告诉 ant 构建文件使用 java
  • 在 C++0x 中专门化 lambda 模板

    我编写了一个特征类 它可以让我提取有关 C 0x 中函数或函数对象的参数和类型的信息 使用 gcc 4 5 0 进行测试 一般情况处理函数对象 template
  • linux下可以分配大容量的虚拟内存吗?

    对于某些目的来说 分配大量的虚拟空间并仅在访问的页面中进行分页会很有效 分配大量内存是瞬时的 并且不会实际抓取页面 char p new char 1024 1024 1024 256 好吧 上面指出的是错误的 因为它是一个 32 位数字