我想分配虛擬連續的範圍內存,以便在訪問數據時使用locality屬性(空間局部性),同時考慮更好的性能。我在下面的頁面發現我需要使用vmalloc來獲得更好的內存局部性訪問(如果我錯了,請更正我,並且必須改用kmalloc)。在Mac和CentOS上使用vmalloc(libvmalloc.a)不能包含vmalloc標題
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適合創建緩存感知應用程序,因爲數據是在虛擬內存中創建的。有沒有其他的方法來確保我的緩存數組的所有元素的分配都是以連續的順序創建的,因此可以使我快速查找?還有一件事,每個緩存中每個元素的大小都不一樣,所以我想用calloc不是解決方案,但我可能是錯的。
該問題中的'vmalloc'是Linux內核函數。除非你正在竊取內核或編寫設備驅動程序,否則這與你無關。 AT&T Research網站上的'vmalloc'完全是另一回事。兩人都沒有做你認爲它的事情。只需使用'malloc'。 – Nemo
是的,我試着用malloc。現在我想創建一個支持緩存的哈希表。如果我使用malloc,我的散列表中的每個元素都將位於不同的內存地址上?因此,在訪問我的散列表中的數據時,我將無法使用locality屬性。我的假設是,如果我使用vmalloc,散列表的所有數據條目都將在1個連續的大塊中創建,因此訪問數據會更快。 另一個問題:如果它是一個Linux內核函數,我怎麼不能將它包含在我的CentOS操作系統計算機上? –
文件系統中的文件「vmalloc.h」在哪裏?當你知道這一點時,你會知道添加到'-I'選項的價值。請注意,'-L'選項與鏈接時查找庫相關,而不是編譯時查找頭文件。另外,庫在哪裏('libvmalloc.so'或'libvmalloc.a')。如果在libvmalloc的構建區域內找不到標題,則需要從構建中重新安裝它,或者重新構建並確保標題已安裝(或手動安裝)。 –