因為最近專案中需要實現乙個臨時資料高速儲存,所以最近對記憶體對映檔案做了一下了解,寫出來與大家分享一下,因為個人水平有限也許會有這樣那樣的問題也懇請大家指正。
mmap是linux記憶體對映檔案,是將檔案對映成為記憶體位址空間的一種方式,其實,方法很簡單。
memfd = open(memfile, o_rdwr | o_creat, s_iwusr | s_irusr);
memd = mmap(null, (sizeof(type)) * size, prot_write | prot_read,
map_shared, memfd, 0);
我們的程式現在擁有了一定的位址空間,**中也獲得了乙個指向首位址的指標,那我們該怎麼使用他呢?其實,大家想怎麼用就怎麼用,不過我們還是採用一定的方法將這些位址空間管理起來,定義一下結構體來對記憶體進行結構化管理:
/**
* \struct nodeheader
* \brief 節點頭
*/struct nodeheader ;
/** * \struct node
* \brief 節點
*/struct node ;
/** * \struct nodelist
* \brief 節點列表
*/struct nodelist ;
/** * \struct nodecontext
* \brief 節點列表目錄
*/struct nodecontext ;
注意,以上結構體本身沒有定義實際儲存資料的空間,而是通過node的data指標來指向資料的空間。我一般會在node之後緊接著根據size大小的資料空間,在分配時直接將指標向下移動相應的數值就可以。這是malloc函式實現中brk ()函式要做的事情,我們自己來做來模擬實現其分配過程。
初始化節點很簡單:
node* allocnode(nodelist *list)
node->data = nodemem + sizeof(node);
nodemem = nodemem + sizeof(node) + list->size; //注意,這裡直接將指標移動過去一定的值來為實際資料保留相應的空間
return node;
}
我們經過一系列初始化過程將這些連續的位址空間進行了分割,這樣我們就可以通過自定義的介面來訪問這些記憶體塊了。不過提醒大家的是由於程序間對映的位址值不同,所以我們把位址乙個放到了對映檔案中,會造成位址訪問的越界。所以以上基於指標的實現只能夠用於程序內,不過大家完全可以只在對映檔案中儲存資料,通過不同程序中相同的記憶體結構來訪問。還有一種方式就是模擬cpu變址定址和linux底層虛擬記憶體來實現,這樣既可以擁有了結構化的資料,又擁有了指標訪問的靈活性。
node* getnode(char *data)
上面的所有的過程都是簡單的對記憶體區域的移動,記得有人說過「程式設計不過就是做一些加法或者將記憶體中的資料從乙個地方搬到另乙個地方」。 使用windows記憶體 記憶體對映檔案
和虛擬記憶體一樣,記憶體對映檔案可以用來保留乙個程序位址區域 但是,與虛擬記憶體不同,它提交的不是物理記憶體或是虛擬頁檔案,而是硬碟上的檔案。將檔案對映成記憶體,我們可以像使用內 存一樣使用檔案.使用場合 它有三個主要用途 系統載入exe和dll檔案 作業系統就是用它來載入exe和dll檔案建立程序...
記憶體對映檔案使用詳細
摘要 本文通過記憶體對映檔案的使用來對大尺寸檔案進行訪問操作,同時也對記憶體對映檔案的相關概念和一般程式設計過程作了較為詳細的介紹。引言檔案操作是應用程式最為基本的功能之一,win32 api和mfc均提供有支援檔案處理的函式和類,常用的有win32 api的createfile writefile...
使用記憶體檔案對映實現共享記憶體
不使用ipc中的共享記憶體 shm 使用記憶體檔案對映的方式來實現共享記憶體 共享記憶體寫入者 使用檔案記憶體對映進行記憶體共享 include include include include include include include include include include using...