2011-12-21 28 views
2

我正在爲linux構建一個用戶模式的NUMA感知內存分配器。分配器在其初始化期間抓取大塊內存,每個NUMA節點一塊。之後,通過從大塊池中提供儘可能多的內存頁面來滿足用戶請求的內存頁面。如何在用戶模式的NUMA感知內存分配器中實現交織頁面分配?

如果用戶要求n個頁面,很容易給從特定塊n頁。但是現在我想實現一個交織分配策略,用戶從每個塊中獲取一個頁面,循環多達n個頁面。這帶來了這些頁面的虛擬地址不再連續的問題。

Q1:是否有辦法返回虛擬可尋址的連續內存?我能想到的唯一解決方案是使用知道如何從一個頁面跳轉到另一個頁面的「智能」指針。

一個我走這條路的原因是,我不是很滿意的linux MPOL_INTERLEAVE內存分配策略,其循環政策不嚴格(確定性)。

Q2:有沒有知道哪個頁面和NUMA節點給定的虛擬地址範圍映射到的一種廉價的方式?更確切地說,我不知道如何通過讀取/ proc/< proc_id>/numa_maps來獲取細粒度的頁面級信息。

謝謝你的回答。

回答

0

A1。幾乎連續的內存並不意味着物理內存是連續的。在linux中,物理頁面在malloc期間沒有綁定到虛擬頁面,而是在第一頁錯誤期間。

如果你真的想,你應該能夠故障前的頁面將它們綁定到特定的NUMA節點,以創建使用默認分配策略嚴格交織。

例如

N - # numa nodes 
PAGES - # pages in allocation 

for(i=0; i < N; i++): 
    pin current thread to node i 
    for(p=i; p < PAGES; p += N) 
     touch page p; 

設置完成後,您可以選擇預先交錯的連續頁面。 Q2302。 可以通過使用從move_pages<numaif.h> 和傳遞NULL作爲目標節點確定虛擬地址的NUMA節點。當前節點位置將處於狀態返回值。

例如

int status[1]; 
move_pages(0, 1, &ptr_to_check, NULL, status, 0);