我想分配几乎连续的范围内存,以便在访问数据时可以使用局部性属性(空间局部性),同时考虑到更好的性能。我在下一页发现我需要使用 vmalloc 来获得更好的内存位置访问(如果我错了,请纠正我并且必须改用 kmalloc)。
我从http://www2.research.att.com/~gsf/cgi-bin/download.cgi?action=list&name=vmalloc下载了 vmalloc 包
我按照安装过程从源文件构建 libmalloc.a 静态库,然后将生成的 libvmalloc.a 库复制到我的 mac 上的 /usr/local/lib 和 /usr/lib 目录。
在我的 C 程序中,我尝试通过以下各种方法包含 vmalloc.h 头文件:
#include <vmalloc.h>
.
#include <linux/vmalloc.h>
.
#include "vmalloc.h"
但他们都没有工作。我总是收到vmalloc.h: No such file or directory错误消息。我在编译 C++ 程序时使用了 -L/usr/local/lib -lvmalloc 标志。在我的台式计算机上(在 CentOS 操作系统下)尝试同样的事情时,我也遇到了同样的错误。
这是我的生成文件:
SHELL = /bin/sh
PROJECT = hw2
TARGET = mkhashtbl
CFLAGS = -O3
LFLAGS = -O3 -L/usr/local/lib -lvmalloc
TFILE = $(PROJECT).tgz
ZFILE = $(PROJECT).zip
PACKFILES = Makefile hashtbl.h hashtbl.c mkhashtbl.c timer.c
all: $(TARGET)
run: all
- ./$(TARGET)
我还尝试如下修改我的链接器标志:
LFLAGS = -O3 -L/usr/local/lib -lvmalloc
我仍然遇到同样的错误。在这种情况下可能有什么问题?我链接库的方式有什么问题,还是 vmalloc 仅适用于某些版本的 Linux?如果是后一种情况,我相信我至少应该仍然能够包含头文件。
编辑
我真正的问题实际上如下:
hashtbl_cache * hashTable_cache; /* Hash table cache */
int i;
hashTable_cache = (hashtbl_cache*)malloc(tbl_size* sizeof(hashtbl_cache));
for( i = 0 ; i < tbl_size; i++ )
{
hashTable_cache[i]. ht_elements = (hashelt_cache*)malloc( hashTable->data_total_size[i] * sizeof(hashelt_cache) ) ;
}
我想确保每个缓存中的所有 ht_elements 都是按顺序创建的。我从一个论坛上读到,vmalloc 非常适合创建缓存感知应用程序,因为数据是在虚拟内存中创建的。是否有任何其他方法可以确保我的缓存数组的所有元素的分配都是按连续顺序创建的,从而使我能够进行快速查找?还有一件事,每个缓存中每个元素的大小都不一样,所以我猜使用 calloc 不是解决方案,但我可能错了。