减少内存碎片方法,内存碎片的减少内存碎片

seosqwseo4个月前 (08-06)测评日记57

一、如何避免内存碎片

频繁地请求和释放不同大小的内存,必然导致内存碎片问题的产生,结果就是当再次要求分配连续的内存时,即使整体内存是足够的,也无法满足连续内存的需求。该问题也称之为外碎片(external fragmentation)。

解决方案:

避免外碎片的方法有两种:

1、利用分页单元把一组非连续的空闲页框映射到连续的线性地址

2、开发一种适当的技术来记录现存的空闲的连续页框块的情况,以尽量避免为满足对小块的请求而分割大的空闲快

第一种方案的意思是,我们使用地址转换技术,把非连续的物理地址转换成连续的线性地址。

第二种方案的意思是,开发一种特有的分配技术来记录下来空闲内存的情况,从而解决内存碎片问题。

Linux采用了第二种方案,因为在某些情况下,系统的确需要连续的物理地址(DMA处理器可以直接访问总线)。

Linux采用著名的伙伴系统(buddy system)算法来解决外碎片问题。把所有的空闲页框分组为11个块链表,每个链表分别包含大小为1,2,4,8,16,32,64,128,256,512,1024个连续的页框,对1024个页框的大请求对应着4MB大小的连续RAM(每页大小为4KB),每个块的第一个页框的物理地址是该块大小的整数倍,例如,大小为16个页框的块,其起始地址是16*2^12的倍数。

我们通过一个例子来说明伙伴算法的工作原理,假设现在要请求一个256个页框的块(1MB),算法步骤如下:

•在256个页框的链表中检查是否有一个空闲快,如果没有,查找下一个更大的块,如果有,请求满足。

•在512个页框的链表中检查是否有一个空闲块,如果有,把512个页框的空闲块分为两份,第一份用于满足请求,第二份链接到256个页框的链表中。如果没有空闲块,继续寻找下一个更大的块。

以上过程的逆过程,就是页框块的释放过程,也是该算法名字的由来,内核试图把大小为B的一对空闲伙伴块合并为一个2B的单独块,满足以下条件的两个块称之为伙伴:

•两个块具有相同的大小

•他们的物理地址是连续的

第一块的第一个页框的物理地址是2* B* 2^12

该算法是递归的,如果它成功合并了B,就会试图去合并2B,以再次试图形成更大的块。

二、内存碎片的减少内存碎片

内存碎片是因为在分配一个内存块后,使之空闲,但不将空闲内存归还给大内存块而产生的。后这一步很关键。如果内存分配程序是有效的,就不能阻止系统分配内存块并使之空闲。即使一个内存分配程序不能保证返回的内存能与大内存块相连接(这种方法可以彻底避免内存碎片问题),但你可以设法控制并限制内存碎片。所有这些作法涉及到内存块的分割。每当系统减少被分割内存块的数量,确保被分割内存块尽可能大时,你就会有所改进。

这样做的目的是尽可能多次反复使用内存块,而不要每次都对内存块进行分割,以正好符合请求的存储量。分割内存块会产生大量的小内存碎片,犹如一堆散沙。以后很难把这些散沙与其余内存结合起来。比较好的办法是让每个内存块中都留有一些未用的字节。留有多少字节应看系统要在多大程度上避免内存碎片。对小型系统来说,增加几个字节的内部碎片是朝正确方向迈出的一步。当系统请求1字节内存时,你分配的存储量取决于系统的工作状态。

如果系统分配的内存存储量的主要部分是 1~ 16字节,则为小内存也分配 16字节是明智的。只要限制可以分配的大内存块,你就能够获得较大的节约效果。但是,这种方法的缺点是,系统会不断地尝试分配大于极限的内存块,这使系统可能会停止工作。减少大和小内存块存储量之间内存存储量的数量也是有用的。采用按对数增大的内存块存储量可以避免大量的碎片。例如,每个存储量可能都比前一个存储量大 20%。在嵌入式系统中采用“一种存储量符合所有需要”对于嵌入式系统中的内存分配程序来说可能是不切实际的。这种方法从内部碎片来看是代价极高的,但系统可以彻底避免外部碎片,达到支持的大存储量。

将相邻空闲内存块连接起来是一种可以显著减少内存碎片的技术。如果没有这一方法,某些分配算法(如先适合算法)将根本无法工作。然而,效果是有限的,将邻近内存块连接起来只能缓解由于分配算法引起的问题,而无法解决根本问题。而且,当内存块存储量有限时,相邻内存块连接可能很难实现。

有些内存分配器很先进,可以在运行时收集有关某个系统的分配习惯的统计数据,然后,按存储量将所有的内存分配进行分类,例如分为小、中和大三类。系统将每次分配指向被管理内存的一个区域,因为该区域包括这样的内存块存储量。较小存储量是根据较大存储量分配的。这种方案是先适合算法和一组有限的固定存储量算法的一种有趣的混合,但不是实时的。

有效地利用暂时的局限性通常是很困难的,但值得一提的是,在内存中暂时扩展共处一地的分配程序更容易产生内存碎片。尽管其它技术可以减轻这一问题,但限制不同存储量内存块的数目仍是减少内存碎片的主要方法。

现代软件环境业已实现各种避免内存碎片的工具。例如,专为分布式高可用性容错系统开发的 OSE实时*作系统可提供三种运行时内存分配程序:内核 alloc(),它根据系统或内存块池来分配;堆 malloc(),根据程序堆来分配; OSE内存管理程序 alloc_region,它根据内存管理程序内存来分配。

从许多方面来看,Alloc就是终极内存分配程序。它产生的内存碎片很少,速度很快,并有判定功能。你可以调整甚至去掉内存碎片。只是在分配一个存储量后,使之空闲,但不再分配时,才会产生外部碎片。内部碎片会不断产生,但对某个给定的系统和八种存储量来说是恒定不变的。

Alloc是一种有八个自由表的固定存储量内存分配程序的实现方法。系统程序员可以对每一种存储量进行配置,并可决定采用更少的存储量来进一步减少碎片。除开始时以外,分配内存块和使内存块空闲都是恒定时间*作。首先,系统必须对请求的存储量四舍五入到下一个可用存储量。就八种存储量而言,这一目标可用三个如果语句来实现。其次,系统总是在八个自由表的表头插入或删除内存块。开始时,分配未使用的内存要多花几个周期的时间,但速度仍然极快,而且所花时间恒定不变。

堆 malloc()的内存开销(8~ 16字节/分配)比 alloc小,所以你可以停用内存的专用权。malloc()分配程序平均来讲是相当快的。它的内部碎片比alloc()少,但外部碎片则比alloc()多。它有一个大分配存储量,但对大多数系统来说,这一极限值足够大。可选的共享所有权与低开销使 malloc()适用于有许多小型对象和共享对象的 C++应用程序。堆是一种具有内部堆数据结构的伙伴系统的实现方法。在 OSE中,有 28个不同的存储量可供使用,每种存储量都是前两种存储量之和,于是形成一个斐波那契(Fibonacci)序列。实际内存块存储量为序列数乘以 16字节,其中包括分配程序开销或者 8字节/分配(在文件和行信息启用的情况下为 16字节)。

当你很少需要大块内存时,则OSE内存管理程序适用。典型的系统要把存储空间分配给整个系统、堆或库。在有 MMU的系统中,有些实现方法使用 MMU的转换功能来显著降低甚至消除内存碎片。在其他情况下,OSE内存管理程序会产生非常多的碎片。它没有大分配存储量,而且是一种先适合内存分配程序的实现方法。内存分配被四舍五入到页面的偶数——典型值是 4 k字节。

三、怎么减少内存呢

减少电脑内存有如下方法\x0d\x0a一、每天关机前要做的清洗双击“我的电脑”——右键点C盘——点“属性”——点“磁盘清理”——点“确定”——再点“是”——再点“确定”。 \x0d\x0a清理过程中,您可看得到未经您许可(您可点“查看文件”看,就知道了)进来的“临时文件”被清除了,盘的空间多了。对D,E,F盘也用此法进行。 \x0d\x0a二、随时要进行的清理怎么看电脑内存打开网页——点上面一排里的“工具”——点“Internet选项”——再点中间的“Internet临时文件”中的“删除文件”——再在“删除所有脱机内容”前的方框里打上勾——再点“确定”——清完后又点“确定”。这样,可为打开网页和空间提速。 \x0d\x0a三、一星期进行的盘的垃圾清理 \x0d\x0a点“开始”——用鼠标指着“所有程序”,再指着“附件”,再指着“系统工具”——点“磁盘粹片整理程序”——点C盘,再点“碎片整理”(这需要很长时间,好在您去吃饭和没用电脑时进行。清理中您可看到您的盘里的状况,可将清理前后对比一下)——在跳出“清理完成”后点“关闭”。按上述方法,对D,E,F盘分别进行清理。还有一招:给宽带加速,一分钟学会释放电脑保留的20%宽带资源 \x0d\x0a 1、单击“开始——运行”,输入gpedit.msc回车后即可打开“组策略对象编辑器”。 2、展开“计算机配置——管理模板——网络——QoS数据包计划程序”,双击右面设置栏中的“限制可保留带宽”,在打开的属性对话框中的“设置”选项卡中将“限制可保留带宽”设置为“已启用”,然后在下面展开的“带宽限制(%)”栏将带宽值“20”设置为“0”即可。 \x0d\x0a3、修改完之后,我们可以重新打开IE浏览器或者用BT或者迅雷**文件,发现上网和**的速度是不是明显提升了?一个字爽啊。 \x0d\x0a4、此项修改对XP和VISTA均有效 \x0d\x0a5、将电脑屏幕下面的一行东西,只留下**软件的实时监控图标和左面的“开始”,其他的全部删除,因为占系统资源,而且有很多东西根本不用。即使用的在“开始”菜单里也全有。可以将常用的软件的快捷方式添加在开始菜单,将次常用的添加在程序菜单。 \x0d\x0a6、将桌面墙纸和屏幕保护程序都设置为“无”.\x0d\x0a 7、选择左下角的“开始”——“程序”——“附件”——“系统工具”——“维护向导”,选择“修改我的维护设置或安排”确定,再选择“自定义”,下一步,“自定义”,再下一步,出现一个对话框“更加快速地启动Windows”,将里面的对勾全部取消啊,这是开机时启动的程序,有的根本不用的,如果用再启动也很快的。然后下一步,选择“否”再下一步,再选“否”,再下一步,还是“否”,然后“完成”。OK! \x0d\x0a8、选择左下角的“开始”——“程序”——“附件”——“系统工具”——“磁盘扫描程序”,选中上面的“自动修复错误”然后“开始”,很快就修复完毕,把你所有的硬盘C、D、E、F都修复一遍,然后“关闭”退出。\x0d\x0a 9、选择左下角的“开始”——“程序”——“附件”——“系统工具”——“磁盘碎片整理程序”,下拉菜单中选择“所有的硬盘”然后确定,然后你就等着吧,可以去休息一会了,呵呵。如果以前从来没有运行过这个程序的话,而且你的硬盘很大,那么可能得1个小时多的时间(如果觉得时间长,可以停下来,分几次以后再运行也可以)。这个程序以后应该1个月左右运行一次,第二次以后运行时间就短多了。 \x0d\x0a10、电脑桌面上的东西越少越好,我的电脑桌面上就只有“我的电脑”和“回收站”。东西多了占系统资源。虽然在桌面上方便些,但是是要付出占用系统资源和牺牲速度的代价。解决办法是,将桌面上快捷方式都删了,因为在“开始”菜单和“程序”栏里都有。将不是快捷方式的其他文件都移到D盘或E盘,不要放在C盘。C盘只放WINDOWS的文件和一些程序安装必须安装在C盘的,其他一律不要放在C盘,放在D盘或E盘。 \x0d\x0a11、右键单击“我的电脑”,选择“属性”,再选择“性能”,单击左面“文件系统”,有一个“此计算机的主要用途(T)”选项,下拉那个箭头,将“台式机”改为“网络服务器”,然后确定。再选择右面的“虚拟内存”,选择“用户自己指定虚拟内存设置(M)”,然后将大值和小值都改为你电脑内存的数值乘以2,比如是128兆内存,则设置为“256”,然后确定,不用理会显示的提示,确定以后需要重新启动。\x0d\x0a 12、打开“我的电脑”,打开C盘,有一个Windows文件夹,打开它,找到一个“Temp文件夹”,把里面的文件全部删除,(需要事先关闭其他应用程序)。在“Temp文件夹”旁边有个“Temporary Internet Files文件夹”,打开,把里面的内容全部删除。一定注意啊,“Temp文件夹”和“Temporary Internet Files文件夹”不要也删了,是删文件夹里面的所有东西。切记!!!\x0d\x0a这样的*作好一个月进行一次。电脑内存清理,养成电脑定时清理的习惯,才能把自己的电脑保养的好,延长电脑的使用寿命。

相关文章

TCL电视85V6E测评使用介绍

TCL电视85V6E测评使用介绍

很多小伙伴在关注TCL电视85V6E怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

三星(SAMSUNG)65英寸Q70C系列使用感受分享

三星(SAMSUNG)65英寸Q70C系列使用感受分享

很多小伙伴在关注三星(SAMSUNG)65英寸Q70C系列怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一...

Vidda海信电视测评使用介绍

Vidda海信电视测评使用介绍

很多小伙伴在关注Vidda海信电视怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

海信电视EK552023款质量测评好不好

海信电视EK552023款质量测评好不好

很多小伙伴在关注海信电视EK552023款怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

川宇USB3.0高速读卡器多功能二合一tf内存卡sd单反相机读卡器C396使用感受分享

川宇USB3.0高速读卡器多功能二合一tf内存卡sd单反相机读卡器C396使用感受分享

很多小伙伴在关注川宇USB3.0高速读卡器多功能二合一tf内存卡sd单反相机读卡器C396怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,...

闪迪(SanDisk)128GBTF(MicroSD)存储卡口碑好不好

闪迪(SanDisk)128GBTF(MicroSD)存储卡口碑好不好

很多小伙伴在关注闪迪(SanDisk)128GBTF(MicroSD)存储卡怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款...