加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

在32位Linux内核上使用c在堆上分配超过2GB的空间

发布时间:2020-12-14 01:00:51 所属栏目:Linux 来源:网络整理
导读:这似乎是一个非常普遍的问题,但我还没有找到明确的答案. 我可以访问运行linux的服务器,具有16 GB的RAM和16核(64位)的CPU (/ proc / cpuinfo给出“Intel(R)Xeon(R)CPU E5520 @ 2.27GHz”).但是,内核 是32位(uname -m给出i686).当然,我没有root权限,所以我无法
这似乎是一个非常普遍的问题,但我还没有找到明确的答案.

我可以访问运行linux的服务器,具有16 GB的RAM和16核(64位)的CPU
(/ proc / cpuinfo给出“Intel(R)Xeon(R)CPU E5520 @ 2.27GHz”).但是,内核
是32位(uname -m给出i686).当然,我没有root权限,所以我无法改变
那.

我正在运行一个我编写的C程序,它做了一些需要内存的计算,所以我
我需要一个大堆 – 但每当我尝试分配超过2GB时,我得到一个badalloc,
虽然ulimit返回“无限”.
为简单起见,我们只说我的程序是这样的:

#include <iostream>
#include <vector>

int main() {
    int i = 0;
    std::vector<std::vector<int> > vv;
    for (;;) {
        ++i;
        vv.resize(vv.size() + 1);
        std::vector<int>* v = &(vv.at(vv.size() - 1));
        v->resize(1024 * 1024 * 128);
        std::cout << i * 512 << " MB.n";
    }
    return 0;
}

用g(无标志)编译后,输出为:

512 MB.
1024 MB.
1536 MB.
2048 MB.
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

据我了解,这是32位系统的限制,显然是因为32位指针
可以只容纳2 ^ 32个不同的地址(如果我编译了相同的程序,我是否正确
在同一台服务器上,但该服务器运行的是64位内核,而不是程序可以分配的内核
2GB?)

这不是分配的内存是否是连续的问题,如果我切片更薄
示例程序,同样的问题发生了,在我的实际程序中,没有大块的
记忆,只是很多小的.

所以我的问题是:
有什么我能做的吗?我无法更改操作系统,但当然我可以修改我的源代码,
使用不同的编译选项等……
但我确实需要超过2GB的内存,而且没有明显的方法可以进一步优化
程序使用的算法.

如果答案是明确的“不”,那么知道这一点仍然是好的.

谢谢,
卢卡斯

解决方法

如果你需要一次性内存,不,没有更改为64位内核就没有办法做到这一点(是的,允许你在一个进程中分配更多的内存)

也就是说,如果您不需要同时使用内存,而只需快速访问,则可以随时将部分内存存储卸载到另一个进程.

例如,这可以通过将数据存储在另一个进程中来工作,并让您的进程在需要时临时将共享内存从该进程映射到其自己的内存空间.它仍将存储在内存中,但在切换内存范围时会有一些开销.如果开销是否可接受将取决于您的内存访问模式.

这不是一个非常简单的方法,但是如果不改变内核来为你提供64位的地址空间,听起来你有点像绑定.

编辑:您可以通过重新配置内核将限制提高到2GB以上,但这只意味着您将在那里达到硬限制.此外,这将需要root访问权限.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读