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

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

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

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

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

有帮助吗?

解决方案

Linux的为您提供/proc/pid/maps/proc/pid/mem,为自己的快乐。当然,你必须有写时要格外小心。此外,请记住提供给每个进程的唯一内存段是它自己的,所以你可能必须做一些附着和代码补丁,以得到你想要的。祝你好运,反正。 :)

编辑:这仍然是相当几次比代码审计更为复杂 - 其中也有更多的机会来揭示问题的实际来源

其他提示

您的理解不正确。你不能用随机数据填充程序的内存就开始执行之前,即使你能,它不会解决你的问题。

如果您的Fortran程序声明了一个单精度浮点变量,编译器将在存储器中分配一个32位单元来保存该值。每次您的程序从读出的变量,处理器将取从所述小区中的32位值。每个分配给可变的时间,处理器将写入一个32位值至细胞。在任何情况下之前或之后的细胞应该随机比特“渗出”到从单元的值。

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

的第二点是,当在Linux上被执行的程序,所有的数据存储器被仔细由操作系统预先初始化到零。这样做是为了避免你的程序每次运行时行为是不同的:这将是一件坏事。编辑:这样做的另一个原因是防止私人信息的泄漏从一个过程到另一个

(评论者:请注意,我故意在滑冰的一些问题,以简化说明)

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

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

我会尝试写使用像フニツ单元测试,以确保双精度值总是工作通过写入一些测试需要在情况下,一个单精度结果被存储经常显示了一个双精度结果如预期。

例如:写一个测试调用与各种输入的函数应当生成双精度输出,并测试,这可与一个assert()

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

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

您应该做的是审核您的代码。如果某个研究生再次搞砸了,他就会殴打他。

我认为随机数据将使调试更加困难得多。是造成内存或计算错误的随机值的答案的随机性?我thnk 固定已知值会更好。

在该FORTRAN侧,你说“混合精度”号被互换使用?我不是对实际问题的明确。

但我不知道如何来填补空闲内存在Linux中有什么发现。

您已经要求帮助ITO实现你的解决问题的办法,是内存随机化。不过,我觉得这是一个奇怪的,可能很难调试解决方案。

在我看来,你会从中受益更多   - 静代码分析工具   - 具体的单元测试   - 为代码评审清单,特别在此问题针对性

有时,一个能想到的解决方案更简单;如果你能不单精度数学你可能会阻止这种库的链接,所以错误会出现链接错误;早在开发过程中。好运。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top