【问题标题】:Beginner quesiton memory allocation c++ [duplicate]初学者问题内存分配c ++ [重复]
【发布时间】:2022-01-08 09:14:35
【问题描述】:

我目前正在学习 C++。在一些堆分配练习中,我试图生成错误的分配。我的物理内存大约是 38GB。为什么可以分配如此大量的内存?我对字节的基本计算是错误的吗?我不明白。任何人都可以给我一个提示吗?谢谢。

#include <iostream>


int main(int argc, char **argv){
    const size_t MAXLOOPS {1'000'000'000};
    const size_t NUMINTS {2'000'000'000};
    int* p_memory {nullptr};

    std::cout << "Starting program heap_overflow.cpp" << std::endl;
    std::cout << "Max Loops: " << MAXLOOPS << std::endl;
    std::cout << "Number of Int per allocation: " << NUMINTS << std::endl;

    for(size_t loop=0; loop<MAXLOOPS; ++loop){
        std::cout << "Trying to allocate new heap in loop " << loop 
                << ". current allocated mem = " << (NUMINTS * loop * sizeof(int)) 
                << " Bytes." << std::endl;

        p_memory = new (std::nothrow) int[NUMINTS];
        if (nullptr != p_memory)
            std::cout << "Mem Allocation ok." << std::endl;
        else {
            std::cout << "Mem Allocation FAILED!." << std::endl;
            break;
        }
    }
    return 0;
}

输出:

...
Trying to allocate new heap in loop 17590. current allocated mem = 140720000000000 Bytes.
Mem Allocation ok.
Trying to allocate new heap in loop 17591. current allocated mem = 140728000000000 Bytes.
Mem Allocation FAILED!.

【问题讨论】:

  • 这就是您所看到的:en.wikipedia.org/wiki/Virtual_memory。基本上,当您不访问它时,操作系统可以将内存“交换”到磁盘。如果您再次需要它,它将确保它被“交换”到内存中。
  • 因为物理页面在 + 之前是分配的,除非你触及你的地址空间。实际上,最初发生的是内核的描述进程地址空间的数据结构被扩展。就这样。只有在您从新的虚拟地址空间加载/存储时,才会发生一些事情——页面错误。 CPU检查TLB,然后检查页表,仍然没有发现,切换到特权模式并跳转到内核,内核实现“OK,这实际上是允许的”,将物理页面映射到虚拟页面 - 那么你真的在使用物理内存。
  • 表达相同原则的另一种方式:未触及的虚拟地址空间保持“纯”虚拟,没有物理内存支持(具有每(巨型)页面粒度)。
  • 感谢您的解释,我想我现在明白了。我将深入研究该主题以增强我的知识。也感谢您的链接。

标签: c++ memory-management


【解决方案1】:

许多(但不是全部)支持虚拟内存的操作系统使用称为按需分页的概念 - 当您分配内存时,您会执行簿记以允许您使用该内存。但是,您当时并没有保留物理内存的实际页面。1

当您实际尝试读取或写入该分配内存的页面中的任何字节时,会发生页面错误。故障处理程序检测到该页面已被预分配但未按需调入。然后它保留一页物理内存,并在将控制权返回给程序之前设置 PTE。

如果您尝试在每次分配后立即写入分配的内存,您可能会发现物理内存耗尽的速度要快得多。

注意事项:

1 可以有一个支持虚拟内存但立即分配物理内存来支持虚拟分配的操作系统实现;虚拟内存是复制实验的必要条件,但不是充分条件。

一条评论提到交换到磁盘。这可能是一条红鲱鱼 - 页面文件大小通常与内存大小相当,总分配量约为 140 TB,比单个磁盘大得多。对空的、未触及的页面进行分页到磁盘也是无效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2021-07-01
    相关资源
    最近更新 更多