使用malloc,memtest和dd了解RAM速度

时间:2018-10-05 12:17:47

标签: c memory ram dd

使用新硬件,我编写了一段C代码来测试RAM速度和磁盘速度。从本质上讲,这是3行在RAM中写入5 GB并将其写入文件,在该文件周围我设置了一些计时器:

long long int AMOUNT = 5*1024*1024*1024l;
FILE *file_handle = fopen('test.bin', 'wb');
handle = malloc(AMOUNT);
memset(handle, 0, AMOUNT);
fwrite(handle, AMOUNT, 1, file_handle);

然后我使用ramdisk或tempfs在dd上进行了尝试:

mount -t tmpfs /mnt/temp1 /mnt/temp1
dd if=/dev/zero of=/mnt/temp1/test bs=1M

,然后回到磁盘:

dd if=/mnt/temp1/test of=/home/user/test bs=1M

在下表中,我的结果中,我还插入了速度memtest 7.5。我不明白9.0以及memtest和其他数字之间的巨大区别。有人可以解释吗?

Results

2 个答案:

答案 0 :(得分:5)

有很多因素在起作用,我无法迭代大多数因素,也无法理解它们。但是,这里有一些背景幕发生的事情:

虚拟内存

在大多数现代用户系统上,您实际上没有直接访问RAM的权限。您有多个间接层,其中之一是虚拟内存。 VM是您的进程访问的内存,就好像它是普通的连续RAM一样,但是实际上底层系统会转换为RAM中的正确地址。因此,几乎可以肯定,使用虚拟地址访问物理内存不会为您提供所需的数据。

虚拟内存也具有层次。现代处理器包括对虚拟内存的本机支持,并且通常由MMU来控制,该处理器与处理器位于同一芯片附近或相同的芯片上。

许多操作系统还具有自己的虚拟内存层,然后将它们转换为处理器上MMU管理的虚拟内存或直接转换为物理RAM。

仅举一个例子,Linux实际上有惰性内存分配。因此,当您第一次分配内存时,它不会与CPU通讯,而只会保存在内核数据结构中,因此当您以后访问该内存时,CPU会生成一个Page Fault。然后,内核的页面错误处理程序将查看该内存是否是延迟分配的,如果是,则实际分配它。

内核空间与用户空间

不允许用户空间程序直接修改物理内存,在* nixes的情况下,它们会调用System Calls来为此进行修改。系统调用会更改CPU的操作模式,并且通常是相对较慢的操作。

库函数

malloc这样的库函数实际上必须做大量记账工作,以确保当您在指针上调用free时,只释放了那部分。但是它们也大量分配。 * nixes上的malloc调用系统调用mmap来分配页面。随后的malloc调用将继续使用该页面,直到您需要更多为止。

这与这个问题有什么关系?

上面只是对使用内存时发生的事情的一瞥,因此您如何分配内存,传递给系统的数量和标志数量会改变很多事情,并且可以解释结果之间的差异。

建议

尝试在这些进程上运行strace,以了解他们大部分时间都在哪里!

答案 1 :(得分:0)

由于您还没有意识到表达式和类型提升在C语言中是如何工作的,因此您的整个实验完全落在了脸上。

5*1024*1024*1024l是4个操作数,每个操作数的类型为int。您将结果存储在哪种类型中与计算的执行方式无关。由于每个int的操作数都是*类型,因此它们在int上进行。

在主流的32/64位2上完成。系统中,int的值最大为2 ^ 31 -1 = 21.4亿。因此,该表达式溢出,并且您调用了未定义的行为错误。程序中从那里发生的事情没有意义去讨论。

将所有整数常量更改为带后缀ULL,然后重新开始。