- 浏览: 811231 次
文章分类
最新评论
-
469957559:
能受累发个源码包吗 我弄了好几天 没出来 想学习下 469 ...
SWFUpload多文件上传 文件个数限制 setStats() -
flywing521:
为什么配置 web.xml 时报错?
flex实现session -
宅男贰号:
iteye我不常上,回复时请发件通知一下,wooh@163.c ...
flex实现session -
宅男贰号:
ThreadLocal不是线程,可以理解为它是线程变量,你的例 ...
flex实现session -
jstl1point0:
学习了,监听后oncreate和onresum也不会执行了是吧 ...
Android横竖屏的设置和使用
池化技术 漫谈
原文地址:http://blog.csdn.net/magictong/article/details/3143947
池化技术 - 简单点来说,就是提前保存大量的资源,以备不时之需,O(∩_∩)O,对于线程,内存,oracle的连接对象等等,这些都是资源,程序中当你创建一个线程或者在堆上申请一块内存时,都涉及到很多系统调用,也是非常消耗CPU的,如果你的程序需要很多类似的工作线程或者需要频繁的申请释放小块内存,如果没有在这方面进行优化,那很有可能这部分代码将会成为影响你整个程序性能的瓶颈。池化技术主要有线程池,内存池,连接池,对象池等等,对象池就是提前创建很多对象,将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,连接池比较典型的有oracle的连接池,了解不深。
下面主要谈谈线程池和内存池,因为这两种技术的通用性和实用性也是比较强的,描述语言C++,其实线程池的话用什么实现都可以。
先来谈谈线程池技术,线程池的框架早就有先辈给我们想好了,也就不用我们去冥思苦想了,我们要做的就是把先辈的想法发现即可。
其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题?性能!尤其是对于服务器程序尤为重要,服务器程序会先初始化很多线程在那里等待,当有客户连接时,就激活其中的一个线程来处理客户请求,对于不支持动态增加的线程池,如果没有等待线程,客户就必学等待,而对于能动态增加线程的线程池,则可以像线程池中新加一个线程。
下面是一个用c++实现的线程池,支持动态增减线程数量:
- /*-------------------------------------------------------------------------
- //文件名:KThreadPool.h
- //创建者:magicTong
- //创建时间:2008-10-2315:02:31
- //功能描述:线程池声明
- //
- //$Id:$
- //-----------------------------------------------------------------------*/
- #ifndef__KTHREADPOOL_H__
- #define__KTHREADPOOL_H__
- //-------------------------------------------------------------------------
- #include<windows.h>
- #include<list>
- usingnamespacestd;
- //线程函数指针定义
- typedefDWORD(WINAPI*PTHREAD_FUNC_EX)(LPVOIDlpThreadParameter);
- //线程状态枚举
- typedefenum_enumKThreadStatus
- {
- THREADRUN,//运行
- THREADPAUSE,//暂停
- }
- KThreadStatus;
- //-------------------------------------------------------------------------
- //类名:KThread
- //功能:线程类,可动态更换执行函数
- //附注:
- //-------------------------------------------------------------------------
- classKThread
- {
- public:
- //构造
- KThread();
- //析构
- ~KThread();
- //-------------------------------------------------------------------------
- //函数:Init
- //功能:初始化函数
- //返回值:bool
- //附注:
- //-------------------------------------------------------------------------
- boolInit();
- //-------------------------------------------------------------------------
- //函数:Run
- //功能:运行线程
- //返回值:bool
- //附注:
- //-------------------------------------------------------------------------
- boolRun();
- //-------------------------------------------------------------------------
- //函数:Pause
- //功能:暂停线程
- //返回值:bool
- //附注:
- //-------------------------------------------------------------------------
- boolPause();
- //-------------------------------------------------------------------------
- //函数:Join
- //功能:调用Join的线程将阻塞,直到该线程执行完毕
- //返回值:void
- //附注:
- //-------------------------------------------------------------------------
- voidJoin();
- //-------------------------------------------------------------------------
- //函数:SetProc
- //功能:设置线程运行的函数,和要传给线程的参数
- //返回值:void
- //参数:PTHREAD_FUNC_EXproc
- //参数:void*lpParam
- //附注:
- //-------------------------------------------------------------------------
- voidSetProc(PTHREAD_FUNC_EXproc,void*lpParam);
- protected:
- KThread(KThread&){}
- //线程实际运行的函数
- staticDWORDWINAPIRealThreadProc(void*lpParam);
- friendclassKThreadPool;
- protected:
- structKThreadParam
- {
- PTHREAD_FUNC_EXproc;//用户线程函数
- void*lpParam;//用户线程参数
- KThread*pThread;//线程类对象
- };
- HANDLEm_hThread;
- DWORDm_id;
- KThreadParamm_param;
- KThreadStatusm_status;
- HANDLEm_hEvt;
- HANDLEm_hMtx;
- };
- //-------------------------------------------------------------------------
- //类名:KThreadPool
- //功能:线程池类声明
- //附注:
- //-------------------------------------------------------------------------
- classKThreadPool
- {
- public:
- //构造,initNum初始情况线程数量
- KThreadPool(intinitNum);
- //析构
- ~KThreadPool();
- //-------------------------------------------------------------------------
- //函数:DoWork
- //功能:申请线程进行工作,proc工作函数,lpParam工作函数参数,run是否立即运行,返回线程ID
- //返回值:DWORD
- //参数:PTHREAD_FUNC_EXproc
- //参数:void*lpParam
- //参数:boolrun=true
- //附注:
- //-------------------------------------------------------------------------
- DWORDDoWork(PTHREAD_FUNC_EXproc,void*lpParam,boolrun=true);
- //-------------------------------------------------------------------------
- //函数:Run
- //功能:运行线程,id线程ID
- //返回值:bool
- //参数:DWORDid
- //附注:
- //-------------------------------------------------------------------------
- boolRun(DWORDid);
- //-------------------------------------------------------------------------
- //函数:Pause
- //功能:暂停运行线程,id线程ID
- //返回值:bool
- //参数:DWORDid
- //附注:
- //-------------------------------------------------------------------------
- boolPause(DWORDid);
- //调整线程池大小为size,返回调整后线程池大小
- unsignedSetSize(unsignedsize);
- protected:
- list<KThread*>m_lst;
- };
实现:
- /*-------------------------------------------------------------------------
- //文件名:KThreadPool.cpp
- //创建者:magicTong
- //创建时间:2008-10-2315:02:22
- //功能描述:线程池定义
- //
- //$Id:$
- //-----------------------------------------------------------------------*/
- #include"stdafx.h"
- #include"KThreadPool.h"
- //-------------------------------------------------------------------------
- //-------------------------------------------------------------------------
- //KThread类定义开始
- //-------------------------------------------------------------------------
- KThread::KThread():m_hThread(NULL),
- m_status(THREADPAUSE),
- m_hEvt(0),
- m_hMtx(0)
- {
- }
- KThread::~KThread()
- {
- ::CloseHandle(m_hMtx);
- if(::TerminateThread(m_hThread,-1)==0)
- return;
- }
- boolKThread::Init()
- {
- m_hThread=::CreateThread(
- 0,
- 0,
- (PTHREAD_FUNC_EX)(KThread::RealThreadProc),
- (void*)&m_param,
- CREATE_SUSPENDED,
- &m_id);
- //创建线程失败
- if(NULL==m_hThread)
- {
- returnfalse;
- }
- m_param.proc=NULL;
- m_param.lpParam=NULL;
- m_param.pThread=this;
- //自动复位
- m_hEvt=::CreateEvent(0,FALSE,FALSE,0);
- if(m_hEvt==0)
- {
- ::CloseHandle(m_hThread);
- returnfalse;
- }
- m_hMtx=::CreateMutex(0,0,0);
- if(m_hMtx==0)
- {
- ::CloseHandle(m_hEvt);
- ::CloseHandle(m_hThread);
- returnfalse;
- }
- returntrue;
- }
- boolKThread::Run()
- {
- ::WaitForSingleObject(m_hMtx,INFINITE);
- if(m_status==THREADPAUSE)
- if(::ResumeThread(m_hThread)==-1)
- {
- ::ReleaseMutex(m_hMtx);
- returnfalse;
- }
- m_status=THREADRUN;
- ::ReleaseMutex(m_hMtx);
- returntrue;
- }
- boolKThread::Pause()
- {
- ::WaitForSingleObject(m_hMtx,INFINITE);
- if(m_status==THREADRUN)
- if(::SuspendThread(m_hThread)==-1)
- {
- ::ReleaseMutex(m_hMtx);
- returnfalse;
- }
- m_status=THREADPAUSE;
- ::ReleaseMutex(m_hMtx);
- returntrue;
- }
- voidKThread::Join()
- {
- ::WaitForSingleObject(m_hEvt,INFINITE);
- }
- voidKThread::SetProc(PTHREAD_FUNC_EXproc,void*lpParam)
- {
- ::WaitForSingleObject(m_hMtx,INFINITE);
- m_param.proc=proc;
- m_param.lpParam=lpParam;
- ::ReleaseMutex(m_hMtx);
- }
- DWORDWINAPIKThread::RealThreadProc(void*lpParam)
- {
- PTHREAD_FUNC_EXproc;
- KThreadParam*pp=(KThreadParam*)lpParam;
- while(true)
- {
- proc=pp->proc;
- if(proc)
- (*proc)(pp->lpParam);
- pp->proc=NULL;
- pp->lpParam=NULL;
- pp->pThread->Pause();
- ::SetEvent(pp->pThread->m_hEvt);
- }
- }
- //-------------------------------------------------------------------------
- //KThread类定义结束
- //-------------------------------------------------------------------------
- //-------------------------------------------------------------------------
- //KThreadPool类定义开始
- //-------------------------------------------------------------------------
- KThreadPool::KThreadPool(intinitNum)
- {
- KThread*pt;
- for(inti=0;i<initNum;i++)
- {
- pt=newKThread;
- if(pt->Init())
- m_lst.push_back(pt);
- }
- }
- KThreadPool::~KThreadPool()
- {
- list<KThread*>::iteratoritBegin=m_lst.begin();
- list<KThread*>::iteratoritEnd=m_lst.end();
- for(;itBegin!=itEnd;itBegin++)
- {
- delete(*itBegin);
- }
- }
- DWORDKThreadPool::DoWork(LPTHREAD_START_ROUTINEproc,void*lpParam,boolrun)
- {
- list<KThread*>::iteratoritBegin=m_lst.begin();
- list<KThread*>::iteratoritEnd=m_lst.end();
- for(;itBegin!=itEnd;itBegin++)
- {
- if((*itBegin)->m_param.proc==NULL&&(*itBegin)->m_status==THREADPAUSE)
- {
- (*itBegin)->SetProc(proc,lpParam);
- //立即运行
- if(run)
- (*itBegin)->Run();
- return(*itBegin)->m_id;
- }
- }
- //没有空闲线程,新建一个新的线程,加入链表
- KThread*pt=newKThread;
- if(pt->Init())
- m_lst.push_back(pt);
- pt->SetProc(proc,lpParam);
- if(run)
- pt->Run();
- returnpt->m_id;
- }
- boolKThreadPool::Run(DWORDid)
- {
- list<KThread*>::iteratoritBegin=m_lst.begin();
- list<KThread*>::iteratoritEnd=m_lst.end();
- for(;itBegin!=itEnd;itBegin++)
- {
- if((*itBegin)->m_id==id)
- return((*itBegin)->Run());
- }
- returnfalse;
- }
- boolKThreadPool::Pause(DWORDid)
- {
- list<KThread*>::iteratoritBegin=m_lst.begin();
- list<KThread*>::iteratoritEnd=m_lst.end();
- for(;itBegin!=itEnd;itBegin++)
- {
- if((*itBegin)->m_id==id)
- return((*itBegin)->Pause());
- }
- returnfalse;
- }
- //-------------------------------------------------------------------------
- //函数:KThreadPool::SetSize
- //功能:修改线程池的大小
- //返回值:unsigned
- //参数:unsignedsize
- //附注:如果小缩小线程池大小,谨慎使用
- //-------------------------------------------------------------------------
- unsignedKThreadPool::SetSize(unsignedsize)
- {
- unsignednowsize=m_lst.size();
- if(nowsize<=size)
- {
- KThread*pt;
- unsignedinc=size-nowsize;
- for(unsignedi=0;i<inc;i++)
- {
- pt=newKThread;
- if(pt->Init())
- {
- m_lst.push_back(pt);
- }
- }
- returnsize;
- }
- else
- {
- unsigneddec=nowsize-size;
- list<KThread*>::iteratorit=m_lst.begin();
- list<KThread*>::iteratorite=m_lst.end();
- list<KThread*>::iteratoritemp;
- unsignedi=0;
- for(;it!=ite&&i<dec;)
- {
- if((*it)->m_status==THREADPAUSE)
- {
- itemp=it++;
- delete((*itemp));
- m_lst.erase(itemp);
- i++;
- continue;
- }
- it++;
- }
- ::Sleep(100*i);
- returnm_lst.size();
- }
- }
- //-------------------------------------------------------------------------
- //KThreadPool类定义结束
- //-------------------------------------------------------------------------
使用:
要定义一个线程函数,然后再将该函数和线程数量设置到内存池中,测试代码如下:
- DWORDWINAPIthreadFunc(LPVOIDlpThreadParam);
- voidCKThreadPoolExDlg::OnBtnCreate()
- {
- statici=0;
- if(!m_pThreadPool)
- {
- m_pThreadPool=newKThreadPool(1);
- }
- m_pThreadPool->DoWork(threadFunc,this,true);
- i++;
- if(i==4)
- {
- m_pThreadPool->SetSize(10);
- }
- }
- voidCKThreadPoolExDlg::DoSomething()
- {
- //MessageBox("O(∩_∩)O哈哈~");
- while(true)
- {
- ::EnterCriticalSection(&m_cs);
- DWORDid=GetCurrentThreadId();
- CStringcstr;
- cstr.Format("线程%d正在运行...",id);
- m_listInfo.InsertItem(m_listInfo.GetItemCount(),cstr);
- ::LeaveCriticalSection(&m_cs);
- ::Sleep(400);
- }
- }
- DWORDWINAPIthreadFunc(LPVOIDlpThreadParam)
- {
- CKThreadPoolExDlg*pdlg=(CKThreadPoolExDlg*)lpThreadParam;
- pdlg->DoSomething();
- return0;
- }
代码的详细注释我就不写了,想弄懂原理的还是好好研究下再使用,我不保证里面没有BUG。
再来看看内存池的原理,我下面的参考资料里面有几篇文章讲得不错,想了解原理的可以去看看。
如何更好的管理在应用程序中内存的使用,同时提高内存使用的效率,这是值得每一个开发人员深思的问题。内存池(Memory pool)提供了一种比较可行的解决方案。首先是创建内存池。这个过程的主要任务是预先分配足够大的内存,形成一个初步的“内存池”。分配内存,也就是用户请求内存时,会返回内存池中一块空闲的内存,并将其标志置为已使用,当然具体细节和方法有很多。释放内存时,不是真正地调用free或是delete的过程,而是把内存放回内存池的过程。在把内存放入内存池的同时,要把标志位置为空闲。最后在应用程序结束时,要把内存池销毁。这里主要做的工作就是把内存池中的每一块内存释放。
使用内存池的好处:
1、减少了内存碎片的产生。这个可以从创建内存池的过程中看出。我们在创建内存池时,分配的都是一块块比较整的内存块,这样可以减少内存碎片的产生。
2、提高了内存的使用效率。这个可以从分配内存和释放内存的过程中看出。每次的分配与释放并不是去调用系统提供的函数或是操作符去操作实际的内存,而是在复用内存池中的内存。
缺点就是很有可能会造成内存的浪费,原因也很明显,开始分配了一大块内存,不是全部都用得到的。
针对内存池,这里有两个实现,头一个很简单,用到了STL的队列来管理内存池指针,而且如果分配的内存没有显示的归还给内存池的话,即使内存池销毁的时候,这块内存也不会被销毁,就会有内存泄露,当然这个程序还可以改进,另外一个程序是根据:《C++应用程序性能优化》中提到的一种方法来实现的,程序见下面:
简单实现(还有很大的改进余地):
- /*-------------------------------------------------------------------------
- //文件名:MemPool.h
- //创建者:magicTong
- //创建时间:2008-10-2417:50:00
- //功能描述:一个简单的内存池实现
- //
- //$Id:$
- //-----------------------------------------------------------------------*/
- #ifndef__MEMPOOL_H__
- #define__MEMPOOL_H__
- //-------------------------------------------------------------------------
- #include<queue>
- #defineMemoryBlockSize1024
- #defineMemoryBlockNum20
- classKMemPool
- {
- public:
- //构造
- explicitKMemPool(inta_memoryBlockNum=MemoryBlockNum,
- inta_memoryBlockSize=MemoryBlockSize);
- //析构
- virtual~KMemPool();
- //两个主要的操作
- intNewMemBuf(char*&a_recvBuff);
- intDelMemBuf(char*a_recvBuff);
- private:
- void_initMemPool(inta_memoryBlockNum,inta_memoryBlockSize);
- std::queue<char*>m_memPool;
- };
- //-------------------------------------------------------------------------
- //$Log:$
- #endif/*__MEMPOOL_H__*/
实现:
- /*-------------------------------------------------------------------------
- //文件名:MemPool.cpp
- //创建者:magicTong
- //创建时间:2008-10-2417:50:19
- //功能描述:简单内存池实现
- //
- //$Id:$
- //-----------------------------------------------------------------------*/
- #include"stdafx.h"
- #include"MemPool.h"
- //-------------------------------------------------------------------------
- //构造
- KMemPool::KMemPool(inta_memoryBlockNum/*=MemoryBlockNum*/,
- inta_memoryBlockSize/*=MemoryBlockSize*/)
- {
- _initMemPool(a_memoryBlockNum,a_memoryBlockSize);
- }
- //析构
- KMemPool::~KMemPool()
- {
- char*l_tempBuff=NULL;
- while(!m_memPool.empty())
- {
- l_tempBuff=m_memPool.front();
- m_memPool.pop();
- if(l_tempBuff)
- {
- //回收
- delete[]l_tempBuff;
- l_tempBuff=NULL;
- }
- }
- }
- //-------------------------------------------------------------------------
- //函数:KMemPool::_initMemPool
- //功能:
- //返回值:void
- //参数:inta_memoryBlockNum
- //参数:inta_memoryBlockSize
- //附注:
- //-------------------------------------------------------------------------
- voidKMemPool::_initMemPool(inta_memoryBlockNum,inta_memoryBlockSize)
- {
- for(inti=0;i<a_memoryBlockNum;++i)
- {
- char*l_tempBuff=newchar[a_memoryBlockSize];
- if(l_tempBuff==NULL)
- continue;
- m_memPool.push(l_tempBuff);
- }
- }
- //-------------------------------------------------------------------------
- //函数:KMemPool::NewMemBuf
- //功能:申请一块内存,如果内存池空了,这个时候应该再像系统申请,并且在
- //类初始化的时候,加一个增量的变量,也可以提供这样的接口,这里为
- //了简单就没有这么做了,只是为了说明问题而已。
- //返回值:int
- //参数:char*&a_memoryBuff
- //附注:如果成功返回0,如果失败返回-1
- //-------------------------------------------------------------------------
- intKMemPool::NewMemBuf(char*&a_memoryBuff)
- {
- //如果内存池已空,这个时候正确的做法应该是
- //重新申请大块内存
- if(m_memPool.empty())
- {
- _initMemPool(MemoryBlockNum,MemoryBlockSize);
- }
- a_memoryBuff=m_memPool.front();
- m_memPool.pop();
- if(a_memoryBuff==NULL)
- return-1;
- return0;
- }
- //-------------------------------------------------------------------------
- //函数:KMemPool::DelMemBuf
- //功能:回收内存,将其放回队列中
- //返回值:int
- //参数:char*a_memoryBuff
- //附注:
- //-------------------------------------------------------------------------
- intKMemPool::DelMemBuf(char*a_memoryBuff)
- {
- m_memPool.push(a_memoryBuff);
- return0;
- }
- //-------------------------------------------------------------------------
- //$Log:$
根据《C++应用程序性能优化》实现代码如下:
- /*-------------------------------------------------------------------------
- //文件名:MemPoolEx.h
- //创建者:magicTong
- //创建时间:2008-10-2417:49:33
- //功能描述:
- //
- //$Id:$
- //-----------------------------------------------------------------------*/
- #ifndef__MEMPOOLEX_H__
- #define__MEMPOOLEX_H__
- //-------------------------------------------------------------------------
- #include<Windows.h>
- #defineMEMPOOL_ALIGNMENT4
- classKMemBlock
- {
- public:
- KMemBlock(USHORTnTypes=1,USHORTnUnitSize=0);
- virtual~KMemBlock();
- voidoperatordelete(void*p,size_t);
- void*operatornew(size_t,USHORTnTypes,USHORTnUnitSize);
- public:
- USHORTnSize;//内存块的大小每个小块所占内存*小块个数
- USHORTnFree;//空闲块数
- USHORTnFirst;//第一个空闲块
- //USHORTnDummyAlign1;
- KMemBlock*pNext;//下一个Block
- charaData[1];//数据的初始位置
- };
- classKMemPoolEx
- {
- public:
- KMemPoolEx(USHORTuUnitSize,USHORTuInitSize,USHORTuGrowSize);
- virtual~KMemPoolEx();
- void*Alloc();
- voidFree(void*pFree);
- private:
- void_FreeMemeoryBlock(KMemBlock*pMyBlock);
- KMemBlock*pBlock;//第一个block的指针
- USHORTnUnitSize;//每个小内存块的字节数
- USHORTnInitSize;//初始的Block的内存块数目
- USHORTnGrowSize;//增加的Block的内存块数目
- };
- //-------------------------------------------------------------------------
- //$Log:$
- #endif/*__MEMPOOLEX_H__*/
实现部分:
- /*-------------------------------------------------------------------------
- //文件名:MemPoolEx.cpp
- //创建者:magicTong
- //创建时间:2008-10-2417:49:45
- //功能描述:
- //
- //$Id:$
- //-----------------------------------------------------------------------*/
- #include"stdafx.h"
- #include"MemPoolEx.h"
- //-------------------------------------------------------------------------
- //构造
- KMemBlock::KMemBlock(USHORTnTypes,USHORTnUnitSize)
- {
- nFree=nTypes-1;
- pNext=NULL;
- nSize=nTypes*nUnitSize;
- nFirst=1;
- char*pData=aData;
- for(USHORTi=1;i<nTypes;i++)
- {
- *(USHORT*)pData=i;
- pData+=nUnitSize;
- }
- }
- //析构
- KMemBlock::~KMemBlock()
- {
- }
- //-------------------------------------------------------------------------
- //函数:KMemBlock::operatornew
- //功能:
- //返回值:void*
- //参数:size_t
- //参数:USHORTnTypes
- //参数:USHORTnUnitSize
- //附注:
- //-------------------------------------------------------------------------
- void*KMemBlock::operatornew(size_t,USHORTnTypes,USHORTnUnitSize)
- {
- return::operatornew(sizeof(KMemBlock)+nTypes*nUnitSize);
- }
- //-------------------------------------------------------------------------
- //函数:KMemBlock::operatordelete
- //功能:
- //返回值:void
- //参数:void*p
- //参数:size_t
- //附注:
- //-------------------------------------------------------------------------
- voidKMemBlock::operatordelete(void*p,size_t)
- {
- ::operatordelete(p);
- }
- //-------------------------------------------------------------------------
- //线程池定义
- //-------------------------------------------------------------------------
- //构造
- //_uUnitSize每个小内存块的字节数
- //_uInitSize是初始的Block的内存块数目
- //_uGrowSize增加的Block的内存块数目
- KMemPoolEx::KMemPoolEx(USHORT_uUnitSize,USHORT_uInitSize,USHORT_uGrowSize)
- {
- pBlock=NULL;
- nInitSize=_uInitSize;
- nGrowSize=_uGrowSize;
- if(_uUnitSize<=2)
- nUnitSize=2;
- elseif(_uUnitSize>2&&_uUnitSize<=4)
- nUnitSize=4;
- else
- {
- if(_uUnitSize%MEMPOOL_ALIGNMENT==0)
- nUnitSize=_uUnitSize;
- else
- nUnitSize=(_uUnitSize/MEMPOOL_ALIGNMENT+1)*MEMPOOL_ALIGNMENT;
- }
- }
- //析构
- KMemPoolEx::~KMemPoolEx()
- {
- KMemBlock*pMyBlock=pBlock;
- if(pBlock)
- _FreeMemeoryBlock(pMyBlock);
- }
- //-------------------------------------------------------------------------
- //函数:KMemPool::_FreeMemeoryBlock
- //功能:递归释放内存
- //返回值:void
- //参数:KMemBlock*pMyBlock
- //附注:其实这个地方没必要使用递归,迭代实现很容易
- //-------------------------------------------------------------------------
- voidKMemPoolEx::_FreeMemeoryBlock(KMemBlock*pMyBlock)
- {
- if(pMyBlock->pNext)
- _FreeMemeoryBlock(pMyBlock->pNext);
- deletepMyBlock;
- }
- //-------------------------------------------------------------------------
- //函数:KMemPoolEx::Alloc
- //功能:申请内存
- //返回值:void*
- //附注:
- //-------------------------------------------------------------------------
- void*KMemPoolEx::Alloc()
- {
- if(!pBlock)
- {
- //如果是第一次申请
- pBlock=new(nInitSize,nUnitSize)KMemBlock(nInitSize,nUnitSize);
- returnpBlock->aData;
- }
- //如果不是第一次申请
- KMemBlock*pMyBlock=pBlock;
- while(pMyBlock&&!pMyBlock->nFree)
- pMyBlock=pMyBlock->pNext;
- //接下来的两种情况:1.找到有空闲块的block2.找不到
- void*retval;
- //找到了空闲块
- if(pMyBlock)
- {
- pMyBlock->nFree--;
- retval=pMyBlock->aData+nUnitSize*pMyBlock->nFirst;
- pMyBlock->nFirst=*((USHORT*)retval);
- returnretval;
- }
- //没有找到空闲块,要重新申请
- else
- {
- if(!nGrowSize)
- returnNULL;
- KMemBlock*newBlock=new(nGrowSize,nUnitSize)KMemBlock(nGrowSize,nUnitSize);
- if(!newBlock)
- returnNULL;
- newBlock->pNext=pBlock;
- pBlock=newBlock;
- return(void*)(newBlock->aData);
- }
- returnNULL;
- }
- //-------------------------------------------------------------------------
- //函数:KMemPoolEx::Free
- //功能:释放内存
- //返回值:void
- //参数:void*pFree
- //附注:释放内存时,并不真正的归还给堆,而且是回收到内存池中
- //-------------------------------------------------------------------------
- voidKMemPoolEx::Free(void*pFree)
- {
- KMemBlock*pMyBlock=pBlock;
- KMemBlock*pPreBlock=NULL;//pMyBlock指向Block的前一个Block,用于设置pNext
- //如果要求释放的内存并不是内存池里面的内存,则直接返回,不予释放
- while((ULONG)pFree<(ULONG)pMyBlock->aData||(ULONG)pFree>(ULONG)(pMyBlock->aData+pMyBlock->nSize))
- {
- pPreBlock=pMyBlock;
- pMyBlock=pMyBlock->pNext;
- if(!pMyBlock)
- return;
- }
- //是内存池里面分配出去的,回收到内存池,并不真正归还给堆
- if(pMyBlock)
- {
- pMyBlock->nFree++;
- *((USHORT*)pFree)=pMyBlock->nFirst;
- pMyBlock->nFirst=(USHORT)(((ULONG)pFree-(ULONG)pMyBlock->aData)/nUnitSize);
- if(pMyBlock->nFree*nUnitSize==pMyBlock->nSize)//如果全是自由块
- {
- if(!pMyBlock->pNext)//如果这是最后一个block,则将其释放
- {
- deletepMyBlock;//释放
- if(pPreBlock)
- pPreBlock->pNext=NULL;//设置上一块的pNext指向NULL
- else
- pBlock=NULL;
- }
- }
- }
- }
- //-------------------------------------------------------------------------
- //$Log:$
数据库连接池是因为,初始化一个数据库连接是非常消耗系统资源的,因此就在程序开始阶段进行数据库的批量连接,然后把这些连接保存下来,等到要使用的时候才拿出来使用,使用完了再放入连接池中。了解不深就不多说了。
参考资料:
CSDN博客:许式伟 著内存池(MemPool)技术详解http://blog.csdn.net/xushiweizh/archive/2006/11/22/1402967.aspx
IBM技术文档:内存池http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html?ca=drs-cn
Java中数据库连接池原理机制讲解:http://www.68design.net/Development/JSP/20703-1.html
相关推荐
华为防火墙技术漫谈,理论篇共包含十章,涵盖了会话与状态检测、安全策略、攻击防范、NAT、GRE 、L2TP 、IPSec 、SSL、双机热备、出口选路的原理、应用场景及配置方法
华为防火墙技术漫谈完整版共3个压缩卷,此为卷一,全部下载3个压缩卷后,放在同一文件夹下,然后解压缩即可。 华为防火墙技术漫谈》介绍华为传统防火墙关键技术原理、应用场景和配置方法,主要包括安全策略、攻击...
射频识别技术漫谈(1)——概念、分类 射频识别技术漫谈(2)——国际标准 射频识别技术漫谈(3)——能量、调制 。。。。。 射频识别技术漫谈(27)——CPU 卡概述
华为防火墙技术漫谈_PDF电子书下载 高清 带索引书签目录_徐慧洋,白杰,卢宏旺编著_北京:人民邮电出版社_P548_2015.05
超越技术 高级技术分析漫谈
客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析.docx
华为防火墙技术漫谈,高清带目录版完整版本,由于上传大小限制,压缩成两个分卷,必须下载两个分卷放在同一目录才能解压,此为分卷1.
防火墙基本原理、架构入门书籍,高清扫描版,有需要的同学不要错过呀!
本书介绍华为传统防火墙关键技术原理、应用场景和配置方法,主要包括安全策略、攻击防范、NAT、、双机热备、选路,并结合网上案例给出以上技术的综合应用配置举例,以防火墙网上实际需求为导向,采用发现问题——...
MPEG2技术漫谈 MPEG2技术漫谈 MPEG2技术漫谈 MPEG2技术漫谈
2013年9月,华为在首届企业网络大会上发布下一代防火墙USG6600,标志着华为防火墙又进入一个新的历史发展阶段。 2013年12月,在Forrester Research发布的最新关于网络隔离网关报告中,华为下一代防火墙作为唯一的...
电子书下载 高清 带索引书签目录_徐慧洋,白杰,卢宏旺编著_北京:人民邮电出版社 完全版本
虚拟机迁移技术漫谈.doc
大数据视野下的指纹检验技术漫谈.pdf
华为防火墙技术漫谈完整版共3个压缩卷,此为卷三,全部下载3个压缩卷后,放在同一文件夹下,然后解压缩即可。
【精品】垂钓用蚯蚓技术漫谈.pdf
大数据视野下的指纹检验技术漫谈
「工控安全」红队技术漫谈 - APT攻击 基础架构安全 无线安全 数据安全 安全实践 数据安全