windows平台上的一个内存池的实现

.h文件

/**********************说明*************************
* 这是MPool内存池的实现,他具有如下特性:
* 1. 池中的内存块是大小是相同的
* 2. 由宏定义_MP_NO_SERIALIZE决定是否需要多线程同步
* 3. 他利用windows的堆内存API进行内存分配
* 4. 他不能替换crt的malloc和free
* 5. 他不是一个通用型的内存池
* 6. 适用于特定的应用环境(高频率的申请释放内存,如网络服务器),应用环境影响池中内存块的大小,以及是否需要处理多线程同步
*
* 编写这样一个内存池基于这几点原因
* 1. 减少内存碎片(每次分配等长的内存块有利于减少内存碎片,内存块的大小还要考虑内存对齐)
* 2. 提高内存分配效率(非序列化的内存分配可以显著提高效率)
* 3. 网络上很多通用型内存池的做法,本人认为通用型的内存池就应该是操作系统本身的内存管理API,
     在ring3层做通用内存池没有意义,甚至可能起到反效果。这种情况最简单的解决问题的办法是增加物理内存的容量。
     只有针对特定的应用环境编写的内存池才是有意义的。
*/
#ifndef MPOOL_H
#define MPOOL_H

#include <Windows.h>
#include <vector>

using std::vector;

class MPool
{
public:
    MPool(size_t block_size);
    ~MPool();

    void *MPAlloc();
    void MPFree(void *p);
private:
    MPool(const MPool&);
    MPool& operator=(const MPool&);
private:
    RTL_CRITICAL_SECTION *m_pool_lock;
    vector<void*> m_block_list;
    size_t m_block_size;
    size_t m_total_size;
    size_t m_block_count;
    size_t m_reserve_count;
    HANDLE m_heap;
    DWORD m_heap_option;
};

#endif

.cpp文件

#include "mpool.h"

#ifdef _MP_NO_SERIALIZE
#define MPLOCK()
#define MPUNLOCK()
#else
#define MP_LOCK() EnterCriticalSection(m_pool_lock);
#define MP_UNLOCK() LeaveCriticalSection(m_pool_lock);
#endif

MPool::MPool( size_t block_size )
{
    m_block_size = block_size;
    size_t m = m_block_size % 8;
    if(m != 0)
    {
        m_block_size += (8-m);
    }
    _SYSTEM_INFO info;
    memset(&info,0,sizeof(_SYSTEM_INFO));
    GetSystemInfo(&info);
    m_heap_option = 0;
#ifdef _MP_NO_SERIALIZE
    m_heap_option = HEAP_NO_SERIALIZE;
#else
    m_pool_lock = new RTL_CRITICAL_SECTION;
    InitializeCriticalSectionAndSpinCount(m_pool_lock,4000);
#endif
    m_heap = HeapCreate(m_heap_option,info.dwPageSize,0);
    m_block_list.reserve(1024);
}

MPool::~MPool()
{
    while(!m_block_list.empty())
    {
        HeapFree(m_heap,m_heap_option,m_block_list.back());
        m_block_list.pop_back();
    }

#ifndef _MP_NO_SERIALIZE
    DeleteCriticalSection(m_pool_lock);
    delete m_pool_lock;
#endif
}

_inline void * MPool::MPAlloc()
{
    void *ret;
    MP_LOCK();
    if(!m_block_list.empty())
    {
        ret = m_block_list.back();
        m_block_list.pop_back();
    }
    else
    {
        ret = HeapAlloc(m_heap,m_heap_option,m_block_size);
    }
    MP_UNLOCK();
    return ret;
}

_inline void MPool::MPFree( void *p )
{
    if(p)
    {
        MP_LOCK();
        m_block_list.push_back(p);
        MP_UNLOCK();
    }
}

windows平台上的一个内存池的实现

时间: 2024-10-07 08:23:51

windows平台上的一个内存池的实现的相关文章

【翻译自mos文章】在windows平台上怎么启用Oracle database 企业版的partition?

来源于: How to enable Partitioning in Oracle Database Enterprise Edition 11.2 on Windows (文档 ID 1188238.1) 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.1 and later Information in this document applies to any platform. 目标: 在Windows平台上怎么启用Or

亲试,Windows平台上使用Qt5.2.1编写Android

首先把工具都下载好: 1. Qt for Android: http://qt-project.org/downloads 2. Android NDK http://developer.android.com/tools/sdk/ndk/index.html 64位可以下载第二个 3. Apache Ant 1.9.3 http://ant.apache.org/bindownload.cgi 4. JDK http://www.oracle.com/technetwork/java/java

Windows平台上安装LaTex工具以及LaTex常见的文件类型汇总

LaTex广泛用于学术报告.paper.学术PPT的撰写和制作,熟练掌握LaTex是在学术界生存的必备基本技能之一.本文简要介绍了在Windows平台上安装LaTex工具的基本方法和流程以及LaTeX常见的文件类型. 1.下载MiKTeX,下载地址为:http://miktex.org/download.MiKTeX的正确读音为/'mik'tek/. 2.安装MikTeX.安装完毕后,在开始菜单会出现"Previewer"和"TeXworks"程序图标.Previe

在Windows平台上安装Node.js及NPM模块管理

1. 下载Node.js官方Windows版程序:   http://nodejs.org/#download   从0.6.1开始,Node.js在Windows平台上提供了两种安装方式,一是.MSI安装文件,另外还有一个.EXE可执行文件.   我选择了.EXE文件.因为.MSI安装文件除了将node.exe复制到C:\Program File (x86)\目录中及修改系统Path之外,没发现还有其他作用.   我使用的版本为0.6.2: http://nodejs.org/dist/v0.

Windows平台上编译Qt-4.8.x Debug版注意事项

Windows平台上编译Qt-4.8.x Debug版注意事项 跳转至: 导航. 搜索 目录 1 为什么要编译qt-4.8.x的Windows Debug版? 2 1 MSVC版本的选择 3 2 WinRAR的问题 4 3 qmake子项目裁剪 5 4 调试QtWebKit 0 为什么要编译qt-4.8.x的Windows Debug版? 目的:为了方便调试qt的代码!VS比Linux gdb好使多了. 1 MSVC版本的选择 最好使用VS2008+,它的安装包自带了Windows SDK,不要

zabbix监控windows服务器上进程的内存使用情况

zabbix监控windows服务器上进程的内存使用情况 由于在windows服务器上不能像linux上一样使用top,或者类似于/pro目录下的数据信息,所以在在windows服务器上获得一个进程的内存或者CPU的使用情况不是很容易. 这里通过在windows服务器上使用python脚本获得进程的内存使用值,通过key传递给zabbix客户端,也就是本机上安装的zabbix客户端. windows上安装zabbix客户端网上的文章很多,这里不再记录. 1,首先安装python环境: 点击这里下

分享一些 Windows 平台上的神器

下面分享一些 Windows 平台上日常开发使用的软件,有些软件我自认为是神器,可以大大提高效率. 编辑器类软件 IntelliJ IDEA IntelliJ IDEA 内部集成 Java 开发环境,具有代码智能提示,智能搜索,代码重构,版本控制工具集成(git,svn等),以及支持主流开源框架,如Spring.另外 IntelliJ IDEA 拥有一个丰富的插件库,可以很方便安装插件.通过安装插件,IDEA 还可以支持其他语言,如 Python. 建议通过 ToolBox 安装 Intelli

Swifter.Json -- 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具。

Swifter.Json Github Wiki 在 .Net 平台上的一个功能强大,简单易用,稳定又不失高性能的 JSON 序列化和反序列化工具. Swifter.Json 已经经过了大量测试和线上项目中运行许久来确保它的稳定性. 特性 1: 支持 .Net 上绝大多是的数据类型,且轻松扩展:包括但不限于:实体,字典,集合,迭代器,数据读取器和表格. 2: 支持 .Net 我已知的大多数平台,包括但不限于:.Net Framework 2.0+, .Net Core 2.0+, .Net St

在Windows平台上远程桌面Redhat 企业版 5和6.

在Windows平台上远程桌面Redhat 企业版 5和6.这个方法主要是使用XManager 3.0来进行远程桌面.1.使用软件:XManager3.0企业版.2.服务器版本:Redhat Enterprise 5&6.3.服务器端详细配置:     3.1.修改/etc/inittab              id:5:initdefault;     3.2.修改/etc/gdm/custom.conf              [xdmcp]              Enable=1