Linux使用内存映射文件做内存池


因为最近项目中需要实现一个临时数据高速存储,所以最近对内存映射文件做了一下了解,写出来与大家分享一下,因为个人水平有限也许会有这样那样的问题也恳请大家指正。

mmap是linux内存映射文件,是将文件映射成为内存地址空间的一种方式,其实,方法很简单。

  1. memfd = open(MEMFILE, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR);  
  2. memd = mmap(NULL, (sizeof(Type)) * size, PROT_WRITE | PROT_READ,  
  3.                 MAP_SHARED, memfd, 0);  
我们的程序现在拥有了一定的地址空间,代码中也获得了一个指向首地址的指针,www.bkjia.com 那我们该怎么使用他呢?其实,大家想怎么用就怎么用,不过我们还是采用一定的方法将这些地址空间管理起来,定义一下结构体来对内存进行结构化管理:
  1. /** 
  2.  * \struct NodeHeader 
  3.  * \brief 节点头 
  4.  */  
  5. struct NodeHeader {  
  6.     unsigned int         size;         /**< 内存尺寸 */  
  7.     bool                 isActive;     /**< 是否使用 */  
  8.     unsigned int         refCount;        /**< 引用数量 */  
  9.     NodeHeader           *next;  
  10. };  
  11.   
  12.   
  13. /** 
  14.  * \struct Node 
  15.  * \brief 节点 
  16.  */  
  17. struct Node {  
  18.     NodeHeader header;       /**< 节点头 */  
  19.     char       *data;         /**< 数据 */  
  20. };  
  21.   
  22.   
  23. /** 
  24.  * \struct NodeList 
  25.  * \brief 节点列表 
  26.  */  
  27. struct NodeList {  
  28.     NodeList           *next;  
  29.     unsigned int       size;         /**< 列表中节点的尺寸 */  
  30.     NodeHeader         *header;         /**< 节点 */  
  31. };  
  32.   
  33. /** 
  34.  * \struct NodeContext 
  35.  * \brief 节点列表目录 
  36.  */  
  37. struct NodeContext {  
  38.     bool         isInit;          /**< 是否已经初始化*/  
  39.     unsigned int refCount;        /**<引用计数器 */  
  40.     NodeList     *list;           /**< 节点列表头 */  
  41. };  
  • 1
  • 2
  • 下一页

相关内容