6

有没有办法用随机数据填充 linux 机器上的空闲 RAM?

我问这个的原因是:我在一个用 Fortran 进行数值编程的小组工作。有时,人们会搞砸双精度实数,因此应该给出双精度结果的程序只给出单精度。

如果我的理解是正确的,那么在这样的程序中,在单精度限制之后,人们会看到结果的随机波动。也就是说,如果您多次使用相同的输入运行相同的程序,每次都会得到随机不同的结果。您所看到的(随机部分)取决于机器空闲 RAM 中的随机值。但实际上,如果你在同一台机器上重复运行程序,内存的相同部分往往会被重复使用,其中包含相同的随机数据,每次都导致相同的输出。

我的想法是,如果您可以用随机数据覆盖内存,您实际上会看到程序输出中的随机波动。这将使找到这些错误变得容易得多。

这个想法是不是很糟糕,或者如果不是,我该如何填充记忆?我可以通过管道 /dev/random 到 RAM 中吗?

4

7 回答 7

5

如果你有一个最近的(>=2.4)glibc,你可以使用设置环境变量 MALLOC_PERTURB_ 来使 malloc() 返回设置为某个值的内存。请参阅http://udrepper.livejournal.com/11429.html和内部http://people.redhat.com/drepper/defprogramming.pdf

那么问题是您的 Fortran 程序是否使用 glibc malloc(),我想这取决于 Fortran 编译器。

于 2009-08-11T13:55:42.677 回答
5

你的理解是不正确的。您不能在程序开始执行之前用随机数据填充程序的内存,即使可以,它也无法解决您的问题。

如果您的 Fortran 程序声明了一个单精度浮点变量,编译器将在内存中分配一个 32 位单元来保存该值。每次您的程序从变量中读取时,处理器都会从单元中获取一个 32 位的值。每次分配给变量时,处理器都会向单元格写入一个 32 位值。在任何情况下,随机位都不应“渗入”单元格之前或之后的单元格中的值。

虽然浮点运算并不精确,但也不是随机的。如果你计算1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0)一千次,你会得到0.99999...每一次。

第二点是在Linux上执行程序时,所有数据内存都被操作系统小心地预初始化为零。这样做是为了避免您的程序在每次运行时表现不同:那将是一件坏事。编辑:这样做的另一个原因是防止私人信息从一个进程泄漏到另一个进程。

(评论员:请注意,我故意滑过一些问题,以使解释简单。)

于 2009-08-11T14:04:50.713 回答
2

我会尝试使用fUnit 之类的东西编写单元测试,以确保双精度值始终按预期工作,方法是编写一些需要双精度结果的测试,以防经常出现存储单精度结果的情况。

例如:编写一个测试,调用一个具有各种输入的函数,该函数应该生成双精度输出,并测试它是否与 assert() 一起工作。

于 2009-08-11T14:02:39.140 回答
2

你想要实现的目标,虽然意图高尚,构思有趣,但让我想起了 Wile E. Coyote 计划抓住走行者,而步枪和狙击动作将是最好的选择。

如果您遇到问题,则意味着您的代码中存在结构性问题,并且您正在失去对程序的控制。尽管我完全知道软件是如何在学术界和 f​​ortran 中开发的,但仅仅因为世界其他地方都这样做而将自己扔下悬崖是有问题的。

你应该做的是对你的代码进行审计。如果他再把事情搞砸了,就打败某个研究生。

于 2009-08-11T14:32:20.033 回答
2

Linux 为您提供/proc/pid/maps/proc/pid/mem,供您取乐。当然,在那里写作时必须格外小心。另外,请记住,每个进程唯一可用的内存段是它自己的,因此您可能必须进行一些附加和代码修补才能到达您想要的位置。无论如何,祝你好运。:)

编辑:它仍然比代码审计复杂几倍 - 这也有更大的机会揭示问题的实际根源。

于 2009-09-04T09:45:54.987 回答
1

我认为随机数据会使调试变得更加困难。答案的随机性是由内存中的随机值还是计算错误引起的?我认为固定值和已知值会更好。

在 FORTRAN 方面,您是说“混合精度”数字可以互换使用吗?我不清楚实际问题。

但我不知道如何用任何东西填充 Linux 中的空闲内存。

于 2009-08-11T13:47:36.883 回答
1

您已经寻求帮助以实现您对问题的解决方案,即内存随机化。但是,我觉得这是一个奇怪且可能难以调试的解决方案。

在我看来,您将从 - 静态代码分析工具 - 特定单元测试 - 代码审查清单中受益更多,专门针对这个问题

有时,人们可以想出更简单的解决方案;如果您可以不使用单精度数学,则可能会阻止此类库的链接,因此该错误将显示为链接错误;在您的开发过程的早期。祝你好运。

于 2009-08-11T14:04:54.957 回答