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

Nie*_*els 2 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);
Run Code Online (Sandbox Code Playgroud)

然后我用dd使用ramdisk或tempfs尝试了它:

mount -t tmpfs /mnt/temp1 /mnt/temp1
dd if=/dev/zero of=/mnt/temp1/test bs=1M
Run Code Online (Sandbox Code Playgroud)

并且,回到磁盘:

dd if=/mnt/temp1/test of=/home/user/test bs=1M
Run Code Online (Sandbox Code Playgroud)

在下表中,我的结果,我也插入了速度记忆7.5.我不明白9.0和memtest与其他数字之间的巨大差异......任何人都能解释一下吗?

结果

nul*_*0tr 5

有许多因素在起作用,我无法迭代它们中的大多数因素而且也无法理解它们.但是这里有一些背景中发生的事情的一瞥:

虚拟内存

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

虚拟内存也有图层.现代处理器包括对虚拟内存的本机支持,并且它通常由与处理器相同或相同芯片上的MMU控制.

许多操作系统也有自己的虚拟内存层,然后它们可以转换为处理器上的MMU托管虚拟内存,也可以直接转换为物理RAM.

只是兔子洞走了多远的一个例子,Linux实际上有懒惰的内存分配.因此,当您第一次分配内存时,它不会传递给CPU,而只保存在内核数据结构中,当您稍后访问内存时,CPU会生成Page Fault.然后,内核的页面错误处理程序会查看该内存是否被延迟分配,如果是,则实际分配它.

内核空间与用户空间

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

图书馆职能

库函数malloc必须实际执行大量的簿记,以确保当您调用free指针时,您只能释放该部分.但他们也分配批量.mallocon*nixes调用syscall mmap来分配页面.后续malloc调用将继续使用该页面,直到您需要更多.

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

上面只是你在处理内存时发生的事情的一瞥,所以你如何分配内存,你传递给系统的数量和标志会改变很多东西,并且可以解释之间的差异结果.

建议

尝试运行strace这些流程,看看他们花费大部分时间的地方!