因為最近項目中需要實現一個臨時數據高速存儲,所以最近對內存映射文件做了一下了解,寫出來與大家分享一下,因為個人水平有限也許會有這樣那樣的問題也懇請大家指正。
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);
我們的程序現在擁有了一定的地址空間,代碼中也獲得了一個指向首地址的指針,www.linuxidc.com 那我們該怎麼使用他呢?其實,大家想怎麼用就怎麼用,不過我們還是采用一定的方法將這些地址空間管理起來,定義一下結構體來對內存進行結構化管理:
- /**
- * \struct NodeHeader
- * \brief 節點頭
- */
- struct NodeHeader {
- unsigned int size; /**< 內存尺寸 */
- bool isActive; /**< 是否使用 */
- unsigned int refCount; /**< 引用數量 */
- NodeHeader *next;
- };
-
-
- /**
- * \struct Node
- * \brief 節點
- */
- struct Node {
- NodeHeader header; /**< 節點頭 */
- char *data; /**< 數據 */
- };
-
-
- /**
- * \struct NodeList
- * \brief 節點列表
- */
- struct NodeList {
- NodeList *next;
- unsigned int size; /**< 列表中節點的尺寸 */
- NodeHeader *header; /**< 節點 */
- };
-
- /**
- * \struct NodeContext
- * \brief 節點列表目錄
- */
- struct NodeContext {
- bool isInit; /**< 是否已經初始化*/
- unsigned int refCount; /**<引用計數器 */
- NodeList *list; /**< 節點列表頭 */
- };