linux - 连续的内存块如何减少内存访问时间?

标签 linux memory virtual-memory memory-management

据说当我们使用 kmalloc() 时,该函数返回连续的物理内存块(如果可用),而使用 vmalloc() 时,我们得到非连续的内存块(如果可用)。

进一步说明,与非连续内存块相比,连续内存块的访问速度更快[Source Link] .

更具体地说,让我们考虑两种情况:

设 1 个物理框架 = 4 KB,页面大小 = 4 KB

案例一: 在我的模块代码中,我使用 kmalloc() 将 20 KB 内存分配给一个 char 数组;调用成功。

案例二: 我已经使用 vmalloc() 完成了上述请求并且调用成功了。

我的问题是:

a) 与 vmalloc() 相比,kmalloc() 完成请求所需的时间为何更少?

b) 与非连续分配相比,连续分配如何导致内存的快速访问?

在每种情况下,CPU 生成虚拟地址,提供给 MMU(如果 TLB 未命中),执行页面遍历,识别帧号,然后将虚拟地址转换为物理地址。地址是连续的还是不连续的有什么关系?

最佳答案

对于 kmalloc,整个物理 RAM 已经以偏移量1 1:1 映射,即物理 RAM 地址 N 映射到虚拟地址 N+PAGE_OFFSET。这使得使用 kmalloc 的分配比使用 vmalloc 更简单,因为 vmalloc 必须找到空闲页面并设置页表,以便将页面映射到连续的地址 block 。

访问 kmalloc 与 vmalloc 分配的内存时,访问时间没有差异,除了您链接到的文档中提到的页面错误。

1 物理内存多于为内核保留的虚拟地址空间的系统除外。

关于linux - 连续的内存块如何减少内存访问时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43865379/

相关文章:

linux - 在 linux sk_buff 中,skb->data 是物理地址还是虚拟地址?

c++ - 虚拟内存和对齐——它们如何结合在一起?

c - MPI_Finalize() 没有完成

c++ - 编译器如何以及在内存中的什么位置存储有关变量类型的信息?

linux - 防止服务器因过载而卡住 - linux

c - 我怎么知道函数在内存中结束的位置(获取地址)- c/c++

c# - 值类型变量是否违反栈的LIFO性质

c - 在 WOW64 上运行的 32 位进程的实际页面大小是多少?

linux - GDB 在 Eclipse 中不显示某些值

c# - Gtksharp编程问题