我想分配虚拟的连续范围内存,以便在访问数据时可以使用locality属性(空间局部性),同时考虑到更好的性能。我在下一页发现我需要使用vmalloc以获得更好的内存位置访问(如果我输入错误,请更正我,而必须使用kmalloc)。

What is the difference between vmalloc and 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:没有这样的文件或目录错误消息。
在编译C ++程序时,我使用了-L / usr / local / lib -lvmalloc标志。
在台式计算机(在CentOS操作系统下)尝试相同的操作时,我也遇到相同的错误。
这是我的makefile:

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在虚拟内存中创建数据,因此vmalloc非常适合创建支持缓存的应用程序。还有其他方法可以确保按连续顺序创建缓存阵列的所有元素的分配,从而使我能够进行快速查找吗?还有一件事,每个缓存中每个元素的大小都不相同,因此我猜想使用calloc并不是解决方案,但是我可能错了。

最佳答案

Nemo的评论应该已经作为回答:


  该问题中的vmalloc是Linux内核函数。除非您要破解内核或编写设备驱动程序,否则它与您无关。 AT&T Research网站上的vmalloc完全是另外一回事。没有人按照您的想法去做。只需使用malloc


很明显,您不知道“虚拟连续范围”是什么意思,或者您已经意识到malloc必须为您提供;否则,它将根本无法工作。

过早的优化是万恶之源。特别是当您不知道要进行的优化意味着什么时。

10-02 02:19