2011年7月西安邮电学院学报Ju1.
2011第16卷第4期JOURNALOFXI'ANUNIVERSITYOFPOSTSANDTELECOMMUNICATIONSVo1.
16No.
4Linux内核中内存池的实现及应用王小银,陈莉君(西安邮电学院计算机学院,陕西西安710121)摘要:基于对Linux操作系统内存管理机制、算法和模式的分析,详细解读Linux内核2.
6版本中有关内存池的定义内涵,明确内存池的创建方法和调用原理,并给出内存池在网络文件系统中的应用.
实验表明,在内存实现及用户程序中使用内存池进行内存管理,可以减少内存碎片,提高分配速度,防止内存泄露.
关键词:Linux内核;内存池;内存管理中图分类号:TP316.
1文献标识码:A文章编号:1007—3264(2011}04—0040—04存储器是一种宝贵而又紧俏的资源,如何对它加以有效的管理,不仅直接影响到存储器的利用率,而且还对系统性能有重大影响l-1].
在Linux操作系统中,内核将物理页作为内存管理的基本单位,内存管理单元通常以页为单位进行处理.
通常我们习惯直接使用new、malloc等API函数申请分配内存.
但在申请内存时,由于所申请内存块的大小不定,当频繁使用这些API函数时会造成大量的内存碎片从而降低性能[2].
因此Linux2.
6内核引入了一种更有效的内存分配方式——内存池(MemoryPoo1).
但目前用户的应用程序仍多用默认的内存管理函数new/delete或malloc/ffee分配和释放内存,这样会有一些额外的开销,也有可能导致内存泄露.
本文对Linux操作系统内核管理方法进行分析,研究Linux内核2.
6版本中内存池定义、创建、实现及其在网络文件系统中的应用,从而用户可以在应用程序中采取内存池的分配与释放方法进行内存管理,提高内存的分配速度,防止内存泄露.
1Linux系统内存管理在Linux内存管理中,简化了分段机制,使得虚地址与线性地址总是一致的,线性空间在32位平台上为4GB的固定大小.
Linux内核这4GB的空间分为两部分,其中0至3GB是用户态空间,由各进程独占;3GB到4GB是内核态空间,由所有进程共享,但只有内核态进程才能访问E引.
Linux内存管理采用了伙伴算法,伙伴算法分配内存时,每次至少分配一个页面.
这种方法适合大块内存请求,不适合小内存区请求.
当请求分配的内存大小为几十个字节时需要例外的管理机制.
从Linux2.
2开始,内存分配时采用了一种空间和时间上都具有高效性的内存分配器——slab分配器.
图1是slab分配器的主要结构.
最高层cache—chain是一个slab缓存的链接列表,这对于最佳适配算法非常有用,可以用来查找大小最适合的缓存(遍历列表).
cache—chain的每个元素都是一个kmem_cache结构的引用(称为一个cache).
它定义了一个要管理的给定大小的对象池.
与传统的内存管理模式相比,slab缓存分配器有很多优点.
首先,内核通常依赖于对小对象的分配,它们会在系统生命周期内进行无数次分配.
slab缓存分配器通过对类似大小的对象进行缓存而提供这种功能,从而避免了常见的碎片问题.
其次,slab分配器还支持通用对象的初始化,从而避免了为同一目标而对一个对象重复进行初始化.
最后,收稿日期:2011—03—28基金项目:西安邮电学院中青年科研基金资助项目(103—0439)作者简介:王小银(1976一),女,副教授,硕士,研究方向:操作系统安全、嵌入式系统,E-mail:wangxiaoyinxy@126.
com;陈莉君(1964一),女,教授,硕士,研究方向:Linux操作系统、嵌入式系统.
万方数据第4期王小银,等:Linux内核中内存池的实现及应用·41·slab分配器还可以支持硬件缓存对齐,这允许不同缓存中的对象占用相同的缓存行,从而提高缓存的利用率并获得更好的性能.
Cache_chain图1slab分配器的主要结构2Linux内存池内存池是动态分配内存的设备,只能被特定的内核成分(即池的"拥有者")使用.
拥有者通常不直接使用内存池,当普通内存分配失败时,内核才调用特定的内存池函数来提取内存池,以得到所需的额外内存.
因此内存池只是内核内存的一个储备,用在特定的时刻.
这样做的一个显著优点是尽量避免内存碎片,使得内存分配效率得到提升[5].
一个内存池通常叠加在slab分配器之上——也就是说,它被用来保存slab对象的储备.
但是一般而言,内存池能被用来分配任何一种类型的动态内存,从整个页框到使用kmalloc函数分配的小内存区.
因此,我们可以将一般内存池处理的内存单元看成"内存元素".
引入了内存池之后,Linux内核的内存管理采取两级分配机制,即初始化时将内存池按照内存的大小分成多个级别(每个级别均是8字节的整数倍数,一般是8,16,24,…,128字节),每个级别都预先分配了2O块内存[6].
如果用户申请的内存单元大于预定义的级别(128字节),则直接调用malloc从堆中分配内存.
而如果申请的内存小于128字节,则从最相近的内存大小中申请,如果该组的内存存储量小于一定的值,就会根据算法,再次从堆中申请一部分内存加入内存池,保证内存池中有一定量的内存可以使用[7].
3Linux内核中内存池的实现Linux内核中内存池的数据结构定义在OpE.
3.
1内存池的数据结构Linux内核中内存池mempool—S的定义为typedefstructmempool_s{spinlock_tlock;intmin_nr;void**elements;void*pooldata;mempool_alloc_t*alloe;mempool_free_t*free;wait_queue_head__twait;)mempool_t;结构体中相应的字段描述如下:lock:用来保护对象字段的自旋锁.
min_nr:内存池中元素的最小个数,elements数组中的成员数量.
curr_nr:当前内存池中元素的个数,即当前ele—ments数组中空闲的成员数量elements:用来存放内存成员的二维数组,其长度为ml'n—nr,宽度是上述各个内存对象的长度,因为对于不同的对象类型,会建立相应的内存池对象,所以每个内存池对象实例的宽度都是跟其内存对象有关的.
pool—data:内存池与内核缓冲区的结合使用,这个指针通常是指向这种内存对象对应的缓存区的指针.
由于Linux采用slab技术预先为每一种内存对象分配了缓存区,每当我们申请某个类型的内存对象时,实际是从这种缓存区获取内存.
alloc:用户在创建一个内存池对象时提供的内存分配函数,这个函数可以用户编写,也可以采用内存池提供的分配函数.
free:与alloc功能相反的一个函数,内存释放函数.
wait:当内存池为空时使用的等待队列.
3.
2内存池的创建内存池函数的实现在mm/mempoo1.
C文件中定义.
内存池初始化用到了mempool_create函数,它负责为一类内存对象构造一个内存池,传递的参数包括内存池分配的最小内存成员数量、用户自定义内存分配函数、用户自定义内存析构函数.
该对象的缓存区指针,指向根据用户自定义内存分配函数所提供的可选私有数据.
mempoolcreate函数的具体实现如下:mempool_t*mempool_create(intmin_nr,mempooLalloc_t*alloc—fn,mempool—free—t万方数据·42·西安邮电学院学报2011年7月*free_fn.
void*pooLdata)treturnmempool_create_node(min_nr,alloc_fn,free_fn,pooldata,一1);}函数的形参min_nr表示内存池中最少可以分配的对象数,alloc—fn是由用户定义的对象分配函数名,free—fn是由用户定义的释放对象函数名,pool—data是用户定义对象分配函数可以访问的可选私有数据.
这个函数生成并分配一个一定大小并事先已经分配的内存池.
在mempool—create函数中调用了mempool—create—node函数.
mempool—create_node函数的实现在此不再赘述.
3.
3内存池的使用如果需要使用已经创建的内存池,则需要调用mempool_alloc函数从内存池中申请内存以及调用mempool_free函数将用完的内存归还给内存池.
3.
3.
1内存池调用函数mempool_alloc内存池调用函数mempool—alloc的函数声明如下:void*mempool—allot(mempool—tpool,intgfp_mask);该函数实现时首先进行一些必要的定义和初始化,并将用户传递进来的gfP进行配置.
然后将通过形参传递进来的gfP掩码标志去掉一GFP—WAIT和一GFP_IO两个标志,这样做的作用是试图调用用户自定义分配函数从缓存区申请一个内存对象,而不是首先从内存池中分配,如果申请不到,再从内存池中分配.
接着从内存池中获取一个内存对象,若内存池不为空,则返回给申请者一个内存对象.
并且该函数实现中考虑了在GFP—ATOMIC事件发生时,不能睡眠.
3.
3.
2内存池的释放函数mempoolfree内存池调用结束,应调用mempool_free函数释放内存池,也就是将内存对象重新放置到内存池中.
mempool—free函数声明如下:voidmempool—free(void*element,mempool—t*poo1);mempool—pool函数第一个形参element是指申请的存放内存池成员的数组,第二个形参pool指向由mempool—create()函数分配的内存池.
在mempool—free函数实现时,如果当前内存池已满,则直接调用用户内存释放函数将内存还给系统;如果内存池还有剩余空间,则将内存对象放入池中并唤醒等待队列.
4内存池在网络文件系统中的应用NFS(NetworkFileSystem)是一种分布式文件系统,允许网络中安装不同操作系统的计算机间共享文件和外设.
内存池在网络文件系统中有着广泛的应用.
在linux/fs/nfs/write.
C中,首先定义一个mempool_t类型的指针变量nfs_wdata_mempool:staticmempool—t*nfs_wdata_mempool;然后就可以根据需要申请相应的数据空间,其实现如下:'structnfs—write—data*nfs—writedata—alloc(unsignedintpagecount){structnfs—write—dataP—mempool—al—loc(nfs_wdata_mempool,GFP_NOFS);if(p){memset(p,0,sizeof(p));INIrr_LISTl_HEAD(&p一>pages);p-->npages===pagecount;if(pagecountpage_array))p-->pagevec:==p一>page_array;else(P一~pagevec—kealloc(pagecount,sizeof(struetpage*),GFP_NOFS);if(!
p-->pagevec){mempool_free(p,nfs_wdata_mempoo1);P==NULL;))}free(p);)当内存池调用结束,再将内存对象重新放置到内存池中,其实现如下:voidnfs_writedata_free(structnfs—.
write_data*p){if(p8L&(p-->pagevec!
一l~p-->page—.
array[O]))kfree(p--~pagevec);万方数据第4期王小银,等:Linux内核中内存池的实现及应用·43·mempool_free(p,nfs_wdata_mempoo1);5结束语分析了Linux2.
6内核中内存池的数据结构及实现,并对其在网络文件系统中的应甩进行了研究.
研究表明,使用内存池可以减少内存碎片,提高分配速度,便于内存管理,防止内存泄露.
将内存池的分配方法应用于用户程序,可提高效率.
但是当分配的内存大小增大的时候,使用内存池分配内存的速度有可能会有所降低.
参考文献E13汤小丹,汤子瀛,哲凤屏,等.
计算机操作系统EM].
西安:西安电子科技大学出版社,2007.
E23刘若慧,毛莺池,祁翔.
Linux操作系统EM3.
北京:人民邮电出版社,2008.
[3]陈莉君,康华.
Linux操作系统原理与应用[M].
北京:清华大学出版社,2006.
[4]吴国伟,李张,任广臣.
Linux内核分析及高级编程[M].
北京:电子工业出版社,2008.
[5]李云华.
Linux内核源代码导读[M].
北京:电子工业出版社,2009.
[6I肖竟华,陈岚.
Linux内存管理实现的分析与研究口].
计算机技术与发展.
2007,17(2):187—189.
[7]陈莉君,康华,张波译.
Linux内核设计与实现[M].
北京:机械工业出版社,2006.
[8]任桥伟.
Linux内核修炼之道EM].
北京:人民邮电出版社,2010.
ImplementationandapplicationofthememorypoolinLinuxkernelWANGXiao-yin,CHENLi-jun(SchoolofComputerScienceandTechnology,Xi'anUniversityofPostsandTelecommunications,Xi'an710121,China)Abstract:AfterthatthememorymanagementpatternofLinuxisanalyzed,thedefinitionofthememorypoolinthekernel(version2.
6)ofLinUXisunscrambled,andthemethodstocreateortransferthememo—rypoolarenaileddown,besides,anexampleisgiventOshowhowthememorypoolworksinnetworkfilesystem.
Experimentsshowthat,whenthememorypooIisintroducedformemorymanagementintomemo—ryimplementationanduserprogram,thenumberofmemorypieceswillbereduced,thespeedofdistribu—tionwillbeimproved,andtheleaksolfmemorywillbeavoide&Keywords:Linuxkernel;memorypool【;memorymanagement[责任编辑:祝剑](上接第39页)E7lDr.
RaoMikkilineni,VijaySarathy.
InfrastructuresforCollaborativeEnterprises[C]//18thIEEEIntema—tionalWorkshopsonEnablingTechnologies,2009:57—62.
[8]朱珠.
基于Hadoop的海量数据处理模型和应用[D].
北京:北京邮电大学,2008.
AmethodforfrequentsetminingbasedonMapRedueeI之ONGXiang,LILingjuan(SchoolofComputerScience,NanjingUniversityofPostsandTelecommunications,Nanjing210003,China)Abstract:ToimprovetheclassicApricrialgorithmoftheassociaterulesmining,amethodforfrequentsetminingbasedonMapReduceisproposed.
ThenewmethodcanbeimplementedbasedonaplatformofHa—doop,andthus,anexperimentalresearchcanbegiventOcomparetheperformanceofthenewmethodwiththatoftheApriori.
Theresultshowsthat,thenewmethodcantakeadvantagesofcloudcomputingtogetgoodefficiencywhenminingmassdata.
Keywords:cloudcomputing;Hadoop;Apriori;MapReduce[责任编辑:孙书娜]万方数据
这不端午节和大家一样回家休息几天,也没有照顾网站的更新。今天又出去忙一天没有时间更新,这里简单搜集看看是不是有一些商家促销活动,因为我看到电商平台各种推送活动今天又开始一波,所以说现在的各种促销让人真的很累。比如在前面我们也有看到PacificRack 商家发布过年中活动,这不在端午节(昨天)又发布一款闪购活动,有些朋友姑且较多是端午节活动,刚才有看到活动还在的,如果有需要的朋友可以看看。第一、端...
目前舍利云服务器的主要特色是适合seo和建站,性价比方面非常不错,舍利云的产品以BGP线路速度优质稳定而著称,对于产品的线路和带宽有着极其严格的讲究,这主要表现在其对母鸡的超售有严格的管控,与此同时舍利云也尽心尽力为用户提供完美服务。目前,香港cn2云服务器,5M/10M带宽,价格低至30元/月,可试用1天;;美国cera云服务器,原生ip,低至28元/月起。一、香港CN2云服务器香港CN2精品线...
易探云服务器怎么样?易探云是国内一家云计算服务商家,致力香港云服务器、美国云服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。目前,易探云推出的国内云服务器优惠活动,国内云服务器2核2G5M云服务器低至330元/年起;成都4核8G/200G硬盘/15M带宽,仅1888元/3年起!易探云便宜vps服务器配置推荐:易探云vps云主机,入门型云...
御轩池为你推荐
多家五星酒店回应网传名媛拼单求一电影名字 讲的是一个女孩在酒店打工穿了客人的衣服吸引了住在酒店一个高富帅 最后在一起了 女孩自留学生认证留学生学历认证的意义是什么?同ip网站查询我的两个网站在同一个IP下,没被百度收录,用同IP站点查询工具查询时也找不到我的网站,是何原因?原代码源代码是什么意思啊psbc.com邮政银行卡6215995915000241921是哪个地区的同ip网站同IP网站9个越来越多,为什么?同ip网站同IP的两个网站,做单向链接,会不会被K掉??同一ip网站最近我们网站老是出现同一个IP无数次的进我们网站,而且是在同一时刻,是不是被人刷了?为什么呀?haole018.comhttp://www.haoledy.com/view/32092.html 轩辕剑天之痕11、12集在线观看www.zhiboba.com网上看nba
电信测速器 阿里云os bbr 安云加速器 视频存储服务器 godaddy续费优惠码 天猫双十一秒杀 最好看的qq空间 免费ftp空间申请 京东商城双十一活动 华为网络硬盘 howfile 双十一秒杀 能外链的相册 华为云盘 web服务器搭建 丽萨 dnspod 阿里云免费邮箱 lamp是什么意思 更多