为什么Windows 10允许无限制地消耗所有内存?

为什么Windows 10允许无限制地消耗所有内存?

我用 C++ 编写了一个最愚蠢的程序并用 g++ 编译来测试我的操作系统:

int main()
{
    while (true)
    {
        new int;
    }
}

出于纯粹的好奇心,我想了解 Windows 将如何响应一个不断分配内存的程序。我预计它会在某个时候崩溃,或者 Windows 会介入并释放所有内存。令我惊讶的是,它并没有这样做,相反,Windows 只是让它运行,导致整个 PC 无法使用。任务管理器仍然可以显示一些变化,而我的 32 GB 内存已被完全使用,直到它冻结。然后,什么都行不通了。我仍然可以使用鼠标,我可以每 20 或 30 秒左右移动一次鼠标,移动一帧。CTRL-C 不起作用,但我不知道它是否识别出我之前从任务管理器切换到命令行。当我注意到我的 SSD 使用率很高(LED 一直亮着)时,我决定对我的硬盘最好的办法是:硬重置……这引出了一个问题:

为什么 Windows 10 允许程序无限期地消耗所有资源并让 PC 完全无法使用?

人们会认为一个编写良好的操作系统 - Linux 会如何响应? - 会采取一些安全措施来防止程序消耗所有资源。我认识到可能存在完全有必要使用所有可用资源的情况,但它是否应该通过简单的malloc(或在这种情况下new)来提供?或者只是我的系统有问题?

注意:我强烈建议不要执行上述程序,因为它可能会导致严重崩溃。

答案1

因为分配内存并不被认​​为是“错误”的事情,也不是计算中的任何类型的非法操作。每个现代操作系统都允许使用虚拟内存物理内存可以写入磁盘,因此使用的内存远远超过物理可用内存。

您所做的事情并不被计算机视为错误。程序员编写的程序要么无意中,要么故意泄漏内存,并导致此类“拒绝服务“自计算诞生以来就存在的问题。

你偶然发现的是最简单的“记忆炸弹”,类似于叉子炸弹它运行并快速消耗系统资源,直到系统变得毫无用处。

过去,在 32 位系统上,您只能在单个进程中分配 2 到 4GB 的 RAM,否则会达到内存限制,进一步的分配将失败,但实际上您会看到同样的问题。任何 RAM 少于您尝试分配的 RAM 的系统都会继续填充 RAM,当 RAM 已满时,会将该 RAM 推送到页面文件,然后继续分配更多 RAM。在实际 RAM 超过 4GB 的现代系统上,运行执行您正在执行的操作的 32 位程序将很快达到 32 位限制(最高 4GB),然后无法分配更多内存。64 位程序将能够分配比物理可用内存更多的内存。

但是由于极端的内存压力(您造成的),系统将 RAM 推送到磁盘所花费的时间比任何其他操作都要多,结果您的硬盘灯一直亮着,您的系统实际上无法使用。

有一些操作系统方法来限制允许分配的内存,但它们往往更多地用于多用户系统,以防止一个用户或程序拒绝为其他用户提供服务。例如Linuxcgroups。这些系统通常不适用于或不为“普通”计算机设置,因为用户可以触发的唯一拒绝是针对他们自己,而解决方案通常只是重新启动系统并告诉用户不要再这样做。

您看到的并不是任何类型的崩溃或故障,而是 100% 的操作员错误,系统按设计运行。

相关内容