从程序中删除内存

从程序中删除内存

假设您有一个 program.exe,它占用了 100kb 的内存。您能将它减少到 0kb,这样它理论上就无法运行了吗?Taskmgr.exe 可能会显示它正在运行,但如果将它减少到 0kb,那么它的功能就无法运行。

那么,如果一个程序达到 0kb,它还会在 taskmgr 下列出吗?

[编辑] 我假设一种情况,即传统的 taskkill 或 C++ 等效物(忘记了。我正在重新学习 C++)被阻止并且无法工作。

[编辑 2] 我的脚本只是一个简单的批处理脚本。它基本上看起来像这样:

@echo off
:x
taskkill /f /im program.exe
goto x

答案1

如果你设法让内核强制释放已经分配给程序的内存,那么每当它试图访问该内存时,它可能会崩溃。这种事情很可能不受支持:程序不应该一直检查它们正在使用的内存是否的确仍然可以供他们使用,而且程序在这样的环境中运行也是极其困难的。

任何写得好计划将查看在尝试使用堆分配之前,查看堆分配是否成功。如果被拒绝,程序可以检测到这一点(在 C 中,malloc()将返回一个空指针)并选择如何处理它(例如,它可能会打印一条错误消息并退出,或者它可能会继续尝试获取内存)。为了知道您的限制性程序在无法获取任何内存时会做什么,我们需要访问大量文档或其源代码。

假设内核无论如何都会这样做。它为程序分配一块内存foo,该程序使用它来存储一些数据。过了一会儿,内核窃取了这块内存,可能将其重新分配给其他程序(甚至是操作系统)。foo现在应该如何获取其数据?如果它尝试访问曾经保存其数据的内存块,系统应该终止它 — 这是正确的!该内存现在可能包含另一个用户的敏感数据,在这种情况下允许foo读取它将是一个安全漏洞。如果它被分配给以另一个用户身份运行的程序或操作系统,允许foo写入它可能会导致许多糟糕的和不可预测的事情发生。

当然,堆栈中也存储着变量。我从未听说过有方法可以检查那些分配成功;一切似乎都只是假设它们成功了。我会猜测每个程序都会自动获得一定量的内存以供运行;如果没有可用的内存,系统将拒绝启动该程序。

答案2

不是。我不太熟悉 Windows 的架构,但在 Unix 上,您正在寻找该renice命令。这会降低(或增加)进程分配 CPU 时间的优先级。例如,当 niceness 值为 -20 时,程序会分配所有可能的 CPU 时间,而当 niceness 值为 +20 时,只有在没有其他进程需要 CPU 时,它才会运行。

(如果您希望该进程占用零 CPU 时间,您可以通过命令发送SIGSTOP信号强制暂停它kill -STOP,然后SIGCONT使用恢复它kill -CONT。)

相关内容