内存优化

2024-06-22

内存优化(精选10篇)

内存优化 篇1

内存是影响Microsoft SQL Server系统性能的一个重要因素,和所有的32位的Windows程序一样,SQL Server也是使用Windows的内存管理机制来分配、释放通用内存管理资源。也就是说,SQL Server和其他Windows程序一样通过Win32API函数和操作系统提供的内存管理资源交互。为了确定SQL Server系统最适宜的内存需求,可以从总的物理内存中减去Windows需要的内存以及其他一些内存需求后综合确定,理想的情况是给SQL Server分配尽可能多的内存,而不产生页面调度。根据物理内存合理规划SQL Server可用内存。

几乎所有的SQL Server内存分配都是使用虚拟内存,大部分的内存分配的代码分解到最后都是调用Win32的VirtualAllo和VirtualFree API函数。SQL Server通过调用VirtualAllo函数来预留和提交虚拟内存,通过VirtualFree函数来释放内存。

因此通过合理优化内存配置、扩充虚拟内存提高计算机运算速度也就成了一项很重要的应用技术手段。

1 优化Windows系统内存配置

以Windows2000 Server为例,Windows2000 Server系统建议最少256MB RAM。如果再添加一些服务和应用程序,则其对于内存的需求就会增大。如:

(1)添加网络服务需要4MB内存空间。

(2)容错功能和系统保护功能需要8MB内存(如磁盘镜像和分条功能)。

(3)进行图形图像处理需要增加16MB内存空间。

(4)安装VC、VB开发系统需要增加16MB内存空间。

另外,如在Windows NT上构建大型数据库如SYBASE、Microsoft SQL Server等,对内存的需求就更多了。

为了使Windows NT不过分占用较多的内存或者浪费处理器的时间用于换页,可以采用关闭不需要的服务程序或驱动程序、尽量不要在服务器上使用其他应用程序等方法优化内存性能。

设置合适的虚拟内存也将提高系统的性能。在设置Windows NT虚拟内存时需要合理确定各个驱动器分页文件的“起始大小”和“最大值”两个参数,它们用于指定分页文件的起始空间和最大空间。分页文件起始大小应保留缺省设置,一般情况下不要改动;分页文件理想的最大尺寸为系统物理内存尺寸的2.5倍至4倍。需要说明的是:如果系统工作时不需要大量内存,请选择靠近下限的值,即用系统物理内存的2.5倍作为这个尺寸的起始值;如果系统工作时需要大量内存,请选择靠近上限的值。

此外,尽可能设立专用硬盘配置内存交换区,或将交换空间放到主硬盘的另一个分区,同时应降低主硬盘的交换文件大小,这样主硬盘(分区)仅用来放置操作系统和应用程序,就可以减少交换次数,防止频繁交换耗费大量CPU时间。

虚拟内存技术的确改善了Windows NT系统的性能,但也受到机器硬盘空间大小、硬盘速度、处理器速度的影响,从理想角度出发,要提高计算机的性能就必须减少交换操作的次数,但是没有一个Windows NT计算机不发生交换,这就要求计算机要有足够的物理内存,以保持最少的交换操作。

2 优化数据库内存配置

Microsoft SQL Server 2000的内存管理组件消除了对SQL Server可用的内存进行手工管理的需要。SQL Server在启动时根据操作系统和其他应用程序当前正在使用的内存量,动态确定应分配的内存量。当计算机和SQL Server上的负荷更改时,分配的内存也随之更改。

(1)min server memory:服务器配置选项可用于确保SQL Server至少以最小的分配内存量启动,并且内存低于该值时不会释放内存。可以基于SQL Server的大小及活动将该配置选项设置为特定的值。

(2)max server memory:服务器配置选项可用于:在SQL Server启动及运行时,指定SQL Server可以分配的最大内存量。

不要将min server memory和max server memory服务器配置选项设置为相同的值,这样做会使分配给SQL Server的内存量固定。也就是说一旦分配给数据库引擎的内存达到该值,数据库引擎将停止动态释放和获取内存。动态内存分配可以随时间提供最佳的总体性能。

(3)max worker threads:服务器配置选项可用于指定为用户连接到SQL Server提供支持的线程数。255这一默认设置对一些配置可能稍微偏高,这要具体取决于并发用户数。一般情况下,应将该配置值设置为并发连接数,但不能超过1,024。当SQL Server运行在Microsoft Windows 95或Microsoft Windows 98上时,最大工作线程服务器配置选项不起作用。

(4)index create memory:服务器配置选项控制创建索引时排序操作所使用的内存量。增加该值可提高索引创建的性能。

(5)min memory per query:服务器配置选项可用于指定分配给查询执行的最小内存量。当系统内有许多查询并发执行时,增大min memory per query的值有助于提高消耗大量内存的查询的性能。

参考文献

[1](美)Jenney Lynne Fields著,袁勤勇,等译.Microsoft SQL Server2000优化指南.清华大学出版社.

[2]张璞.大型数据库应用系统中的数据库性能优化方法[期刊论文].现代计算机(专业版),2004(11).

[3]王书海,刘明生,马银华,李金英.基于多表连接的分组查询语句的性能分析与优化[期刊论文].电脑知识与技术,2000(7).

内存优化 篇2

1、及时释放内存。如果你发现系统的内存不多了,就要注意释放内存。所谓释放内存,就是将驻留在内存中的数据从内存中释放出来。释放内存最简单、最有效的方法,就是重新启动计算机;另外就是关闭暂时不用的正在运行的程序,包括在后台运行的程序。平时就要养成这样的好习惯,随时关闭那些暂时不用的程序、文件或窗口。有些应用程序不能用一般的方法关闭,这时就要进行热启动,如按下“CTRL+ALT+DEL”;另外要注意剪贴板中如果存储了一幅图片或图像,图片或图像是要占用大量内存的,这时只要剪贴几个字,就可以把内存中剪贴板上原有的图片冲掉,从而将它所占用的大量的内存释放出来;还有,在后台打印文件,也会占用大量的内存空间。

2、提高提高系统其它部件的性能。计算机其它部件的性能,对内存的使用也有较大的影响,如总线类型、CPU、硬盘、显存等。如果显存太小,而显示的数据量很大,再多的内存也是不可能提高其运行速度和系统的效能的。如果硬盘的速度太慢,特别是平均寻道时间和速度太慢,则会严重影响系统的虚拟内存的读写速度和使用效能,导致整个系统的效能下降。

3、优化内存中的数据。在Windows中,驻留内存中的数据越多,如桌面上的快捷图标、任务栏中的图标、系统托盘中的时间等,都要占用内存资源。所以,桌面上和任务栏中的快捷图标不要设置得太多。如果内存资源较为紧张,可以考虑优化这些项目,尽量少用各种后台驻留的程序,特别是设计不好的程序,要占用大量内存资源。平时在操作电脑时,不要打开太多的文件或窗口,或者在程序中打开太多的数据文件,如果打开了,不再用时要及时关闭这些文件或窗口。另外,长时间地使用计算机后,如果没有重新启动计算机,内存中的数据排列就有可能比较混乱而导致系统的性能下降,这时你就要考虑重新启动计算机。

内存优化 篇3

关键词:Windows操作系统;内存;优化管理

中图分类号:TP316.7文献标识码:B文章编号:1673-8454(2008)24-0060-02

一、引言

内存是计算机的数据存储设备之一,它与CPU、高速缓存器等共同决定计算机的运行速度。因此,如何优化内存的管理,提高内存的使用效率,是提高计算机运行速度的重要手段。下面就Windows操作系统,谈谈优化内存管理、提高内存的使用效率的八种方法。

二、提高内存使用效率的八种方法

1.改变页面文件的位置

改变页面文件的位置目的主要是为了保持虚拟内存的连续性。因为硬盘读取数据是靠磁头在磁性物质上读取,页面文件放在磁盘上的不同区域,磁头就要跳来跳去,自然不利于提高效率。而且系统盘文件众多,虚拟内存肯定不连续,因此要将其放到其他盘上。

改变页面文件位置的方法是:用鼠标右键点击“我的电脑”,选择“属性→高级→性能设置→高级→更改虚拟内存”,在驱动器栏里选择想要改变到的位置即可。值得注意的是,当移动好页面文件后,要将原来的文件删除(系统不会自动删除)。

2.改变页面文件的大小

改变了页面文件的位置后,我们还可以对它的大小进行一些调整。调整时需要注意,不要将最大、最小页面文件设为等值。因为通常内存不会真正“塞满”,它会在内存储量到达一定程度时,自动将一部分暂时不用的数据放到硬盘中。最小页面文件越大,所占比例就越低,执行的速度也就越慢。最大页面文件是极限值,有时打开很多程序,内存和最小页面文件都已“塞满”,就会自动溢出到最大页面文件。所以将两者设为等值是不合理的。一般情况下,最小页面文件设得小些,这样能在内存中尽可能存储更多数据,效率就越高。最大页面文件设得大些,以免出现“满员”的情况。

3.调整高速缓存区域的大小

可以在“计算机的主要用途”选项卡中设置系统利用高速缓存的比例。如果系统的内存较多,可选择“网络服务器”,这样系统将用较多的内存作为高速缓存。在CD-ROM标签中,可以直接调节系统用多少内存作为CD-ROM光盘读写的高速缓存。

4.监视内存

系统的内存不管有多大,总是会用完的。虽然有虚拟内存,但由于硬盘的读写速度无法与内存的速度相比,所以在使用内存时,就要时刻监视内存的使用情况。Windows操作系统中提供了一个系统监视器,可以监视内存的使用情况。一般如果只有60%的内存资源可用,这时就要注意调整内存了,不然就会严重影响电脑的运行速度和系统性能。

5.及时释放内存空间

如果发现系统的内存不多了,就要注意释放内存。所谓释放内存,就是将驻留在内存中的数据从内存中释放出来。释放内存最简单有效的方法,就是重新启动计算机。另外,就是关闭暂时不用的程序。还有要注意剪贴板中如果存储了图像资料,是要占用大量内存空间的。这时只要剪贴几个字,就可以把内存中剪贴板上原有的图片冲掉,从而将它所占用的大量的内存释放出来。 6.优化内存中的数据

在Windows操作系统中,驻留内存中的数据越多,就越要占用内存资源。所以,桌面上和任务栏中的快捷图标不要设置得太多。如果内存资源较为紧张,可以考虑尽量少用各种后台驻留的程序。平时在操作电脑时,不要打开太多的文件或窗口。长时间地使用计算机后,如果没有重新启动计算机,内存中的数据排列就有可能因为比较混乱,从而导致系统性能的下降。这时可以重新启动计算机。

7.扩大虚拟内存容量

如果计算机的硬盘够大,可以打开“控制面板”中的“系统”,在“性能”选项中打开“虚拟内存”,选择第二项,用户自己设定虚拟内存设置,指向一个较少用的硬盘,并把最大值和最小值都设定为一个固定值,大小为物理内存的2倍左右。这样,虚拟存储器在使用硬盘时,就不用迁就其忽大忽小的差别,而将固定的空间作为虚拟内存,加快存取速度。虚拟内存的设置最好在“磁盘碎片整理”之后进行,这样虚拟内存就分布在一个连续的、无碎片文件的空间上,可以更好地发挥作用。

8.提高系统其他部件的性能

计算机其他部件的性能对内存的使用也有较大的影响,如总线类型、CPU、硬盘和显存等。如果显存太小,而显示的数据量很大,再多的内存也是不可能提高其运行速度和系统效率的。如果硬盘的速度太慢,则会严重影响整个系统的工作。

三、结束语

当然, 优化内存管理,提高内存的使用效率的方法并不仅限于这八种,还有诸如优化BIOS的设置、整理优化注册表等等。只有根据计算机工作的具体状态,采取恰当的方式、方法,才能取得令人满意的优化效果。

参考文献:

[1]李笑梅,王新川.谈微机的优化内存管理[J].河北省科学院学报,2000(4).

[2]朱文鸣.加强Windows系统的内存管理[J].科学时代,2007(3).

内存优化 篇4

一般DDR系统都可以更加细致地设置内存的其他几项延迟时间。以nforce2主板为例, 进入BIOS主页面的“Advanced”页, , 再进入“Advanced Chipset Features”项, 先在“System Performance”项目中选择“User Defined”进行手动调节, 然后再在下面的“Memory Timings”里面选择成几种不同的模式。BIOS默认的是“Optimal”优化方式, 这是最保守的设置, 如果用户希望得到最高的性能, 可以选择第二项“Aggressive”, 系统会自动降低内存延迟时间的各项设置, 尽可能地提高性能;最后还有手动调节“User Defined”模式, 设置手动模式后, 下面的四项内存高级设置即被打开。

第一项“SDRAM Active Precharge Delay”就是上面说到的Bank预充电时间延迟, 缩写是“”tRP”或“t (RP) ”, 有的主板BIOS写为“Time of Row Prechange”, 这个项目默认值视内存而定, 可以设置为4、3或2。

第二项“SDRAM RAS to CAS Delay”是行地址选中后经过多少周期就到了列地址选中的时间, 有的主板写为“Time of RAS to CAS Delay”, 缩写为“tRCD”或“t (RCD) ”, 默认数值视内存而定, 可以设置为4、3或2。

第三项是“SDRAM RAS Prechange Delay”, 这就是行地址选中前的延迟时间, 有的主板写为“Time of Row Address Strobe”, 缩写为“tRAS”或“t (RAS) ”, 默认数值一般为8, 为提高性能可以设置为7、6甚至5。

第四项是“SDRAM CAS Latency”, 有的主板写成“CAS Latency”, 缩写为“CL”, 意义为在列地址选中经过几个时钟周期后才能进行数据传输, 默认数值一般为3或2.5, 为了提高性能可以在高品质的内存上将它的数值缩小为2。如果在此选择了“Auto”, 就是通过内存的SPD自动读取信息。

优化系统内存可采用那些措施

(1) 关闭系统中平常不用的服务或程序, 以减少物理内存的常驻程序。

(2) 把虚拟内存设置在非系统盘中, 例如D盘, 最好是经过磁盘整理的逻辑分区。

(3) 启用用户的硬盘缓存, 提高虚拟内存页交换的速度。

(4) 如果用户的CPU和主板都支持, 设置启用CPU的二级缓存, 能充分利用物理内存而减少虚拟内存的使用。

怎样通过Windows操作系统优化内存管理

在软件优化方面, 我们将利用操作系统自身的调节功能来优化内存, 这主要是通过关闭视觉效果、修改系统项目设置和修改注册表三种方法来实现的。

(1) 关闭不必要的视觉效果以节约内存

WindowsXP操作系统提供了许多令人赏心悦目的新效果, 这些效果很占用内存, 把一些没必要的视觉效果关闭, 可以释放更多的内存空间用于其他应用程序。首先进入“控制面板”, 选择“系统”, 在“高级”页中点击“性能”项目里的“设置”, 进行“视觉效果”设置。页面为了最大限度地提高系统的性能, 在此可以选择“调整为最佳性能”, 然后点击“应用”使设置生效。高级用户可以手动定义开启哪些设置和关闭哪些设置, 这在“自定义”选项下面可以手动更改。

(2) 更改系统项目设置优化内存管理

接下来设置Windows的虚拟内存。在“性能”的“高级”选项中选择更改虚拟内存大小。使用512MB及以上内存的用户, 可以考虑选择关闭虚拟内存, 这样在一般的应用程序运行时就不会频繁地读取硬盘上面的数据, 加快系统软件的运行效能。具体做法是选择“无分页文件”, 然后按下“设置”按钮确定以上的设置。对于普通用户而言, 一般虚拟内存数量设置为物理内存容量的一倍半到两倍, 并最好将虚拟内存数量固定下来以避免Windows频繁更改降低性能。用户可以在“自定义大小”内手动选择虚拟内存数量的最大值和最小值。比如256MB内存的用户可以将虚拟内存的最大值与最小值都设定为376MB或是512MB。虚拟内存是以名为Pagefile.sys的交换文件保存在硬盘上。

在默认的设置下, 如果系统发生了严重的错误, 操作系统会转储很多内存中的数据到硬盘上, 以便管理人员根据这些数据排除错误。不过这功能对于一般用户没有什么用处, 反而浪费了硬件资源, 因此普通用户可以设置禁止系统转储。在系统属性的高级选项卡下, 单击“启动和故障恢复”按钮, 打开一个新的窗口, 在“系统失败”配置项下, 取消对“将事件写入系统日志”、“发送管理警报”和“自动重新启动”三个选项, 并在“写入调试信息”的下拉菜单下选择“无”。经过这样的设置, 就可以避免系统做大量的无用功。

在写入调试信息的下拉菜单下, 可以看见四个不同的选项, 它们分别会占用不同数量的硬盘空间来保存数据: (1) “无”:在发生错误的时候不写入任何信息, 在系统崩溃时也不会写入任何数据, 不会占用硬盘空间; (2) “小内存转储 (64KB) ”:这个选项将在系统崩溃时写入最少的转储信息, 基本上会占用2MB左右的硬盘空间; (3) “核心内存转储”:这个选项将在系统崩溃时转储全部的核心内存, 这会占用50MB左右的硬盘空间; (4) “完全内存转储”, 这个选项会在系统崩溃时转储全部的内存, 这将会耗费和物理内存一样多的空间用来保存数据。

(3) 更改系统注册表优化内存管理

Windows的注册表中保存了很多高级的系统设置信息, 一些第三方软件可以实现对这些项目的变更, 例如windows优化大师、魔法兔子之类的软件。不过这些第三方软件在使用时稍不小心就会带来一些副作用, 因此为了安全起见, 还是手动修改注册表更为保险和稳妥一些。

首先, 让我们将注册表备份, 以便一旦修改发生错误, 我们可以随时恢复。以Windows2000为例, 打开注册表, 依次进入“HKLM_LOCAL_MACHINE/System/CurrentControlSet/Control/Session Manager/Memory Management”, 可以看到以下选项:

(1) DisablePagingExecutive

双击左键来打开这个项目, 然后将它的"数值数据从“0”改为“1”, 这个项目会禁止Win XP/Win2k执行文件分页, 使所有数据驻留在RAM内存而不是被转移到虚拟内存。打开这个设置可以提升整个系统的性能, 但由于它对用户系统内存的占用很高, 所以只有当用户的物理内存数量达到128MB或以上时, 才建议打开它。

(2) LargeSystemCache

Win2K处理系统高速缓存 (在Win9x中叫Vcache) 的方式在很大程度上随着用户所用版本的不同而不同。打开这个设置, 可以使实际的磁盘I/O数据传输加快。不过, 与前者一样, 该项也要求用户具有较大的物理内存才可以使用。

(3) IOPageLockLimit

这个项目Win XP的用户不会看到, 这个设置有可能优化用户的电脑, 但也可能不会。如果用户的电脑有很多的IO数据传输, 它可以从根本上提升用户电脑的性能。这个项目也同样不建议小内存用户使用。大部分的大内存 (128MB内存以上) 用户会发现当设置在8和16MB之间时, 他们的电脑性能会有显著的提升。

(4) Pagingfiles

操作系统临时性页面交换文件 (Pagingfiles) 的最优值一般是系统物理内存的1.5倍左右。比如128MB内存的用户, 页面文件可以设置为192MB。这个项目等同于我们上面所说的手动选择虚拟内存数量的最大值和最小值的设置, 不过这个数值还是固定下来, 而不要让系统自己去改变。

如何利用工具优化内存

可以使用如下两款释放内存的工具: (1) 小巧玲珑的Mem

Mem是微软官方发布的一款内存释放工具软件, 其前身是Windows 2003中的一个名为Empty.exe的小程序。Mem小巧玲珑, 非常适合小内存用户在游戏之前使用。用法很简单, 只需双击这个软件, 被占用的物理内存就释放出来了。

但是, Mem没有实时监控功能, 也不支持图形界面。让它帮助我们自动整理内存要用到“计划任务”。单击“开始”→“设置”→“控制面板”→“计划任务”→“添加任务计划”, 打开“任务计划向导”。单击“下一步”, 在接下来的窗口中单击“浏览”, 在浏览窗口中选择Mem程序。注意:Mem必须放在英文文件夹中才能正常使用, 千万不能把它放在中文文件夹中。建议将Mem放在C盘某个文件夹下。

在随后的窗口中依次设置“任务名称”, 任务执行方式为“每天”, 以及每天执行该任务的时间, 最后输入管理员账号和密码即可。

(2) 实时快速的Memory Cleaner

该软件体积也很小 (仅72KB) , 而且界面也很简洁。Memory Cleaner的工作原理和Mem一样, 不是简单地把普通程序从物理内存“转移”到虚拟内存中, 而是整理这些程序所占用的多余的内存。

Memory Cleaner是一款绿色的软件, 不必安装, 运行后可看到当前的内存信息, 非常简单明了。单击“设置”按钮, 就可以打开设置窗口, 设置内存整理方案。然后直接单击“打扫内存”按钮, 就可以开始整理内存, 整理后的效果还是非常明显的。Memory Cleaner可以设置为常驻内存, 间隔一定的时间自动整理内存。

上述两款软件下载地址:http://download.cpcw.com。其中, Mem很适合于服务器用户, 优化效果最好, 稳定性也有保证;而Memory Cleaner支持实时监控和自动优化, 占用系统资源很少, 是个人用户的最佳选择。

内存优化软件都做了什么工作

内存优化软件在进行优化时只是机械地根据设置的数值尽可能将占用物理内存的程序搬到硬盘的虚拟内存中, 而不考虑某个程序是否正在使用。所以, 虽然空余物理内存增加了, 但当用户继续使用某个已经打开的程序时 (而它恰恰又被不恰当地移动到了虚拟内存中) , Windows就必须再次将它从硬盘虚拟内存中读取到物理内存中, 这样给系统增加额外的开销, 因此用户会发现继续运行优化前正在使用的程序时, 会有停顿。内存优化惟一的好处是:在将占用物理内存的程序移动到虚拟内存后, 再启动新程序, 速度会变得更快。

当用户再运行已经被移动到硬盘中的程序时, 它还必须重新加载到物理内存中, 因此即使只是单击一个最小化的程序, 看上去也会花费了较长时间来还原其窗口。此外, 在物理内存中的程序被清空后, 硬盘中等待激活的程序常常被立即放回到物理内存中去。也就是说, 用户辛辛苦苦用内存优化软件“节省”出来的可用内存, 会一点点被等待激活的程序慢慢吞噬。

内存优化 篇5

Redis存储机制分成两种Snapshot 和 AOF,无论是那种机制,Redis都是将数据存储在内存中。

Snapshot工作原理: 是将数据先存储在内存,然后当数据累计达到某些设定的伐值的时候,就会触发一次DUMP操作,将变化的数据一次性写入数据文件(RDB文件)。

AOF 工作原理: 是将数据也是先存在内存,但是在存储的时候会使用调用fsync来完成对本次写操作的日志记录,这个日志揭露文件其实是一个基于Redis网络交互协议的文本文件。AOF调用fsync也不是说全部都是无阻塞的,在某些系统上可能出现fsync阻塞进程的情况,对于这种情况可以通过配置修改,但默认情况不要修改。AOF最关键的配置就是关于调用fsync追加日志文件的平率,有两种预设频率,always每次记录进来都添加,everysecond 每秒添加一次。两个配置各有所长后面分析。由于是采用日志追加的方式来持久话数据,所以引出了第二个日志的概念:rewrite. 后面介绍它的由来。

存储模式性能和安全比较:

1.性能:Snapshot方式的性能是要明显高于AOF方式的,原因有两点:

采用2进制方式存储数据,数据文件比较小,加载快速.

存储的时候是按照配置中的save策略来存储,每次都是聚合很多数据批量存储,写入的效率很好,而AOF则一般都是工作在实时存储或者准实时模式下。相对来说存储的频率高,效率却偏低。

2.数据安全:AOL数据安全性高于Snapshot存储,原因:

Snapshot存储是基于累计批量的思想,也就是说在允许的情况下,累计的数据越多那么写入效率也就越高,但数据的累计是靠时间的积累完成的,那么如果在长时间数据不写入RDB,但Redis又遇到了崩溃,那么没有写入的数据就无法恢复了,但是AOF方式偏偏相反,根据AOF配置的存储频率的策略可以做到最少的数据丢失和较高的数据恢复能力。

说完了性能和安全,这里不得不提的就是在Redis中的Rewrite的功能,AOF的存储是按照记录日志的方式去工作的,那么成千上万的数据插入必然导致日志文件的扩大,Redis这个时候会根据配置合理触发Rewrite操作,所谓Rewrite就是将日志文件中的所有数据都重新写到另外一个新的日志文件中,但是不同的是,对于老日志文件中对于Key的多次操作,只保留最终的值的那次操作记录到日志文件中,从而缩小日志文件的大小。这里有两个配置需要注意:

auto-aof-rewrite-percentage 100 (当前写入日志文件的大小占到初始日志文件大小的某个百分比时触发Rewrite)

auto-aof-rewrite-min-size 64mb (本次Rewrite最小的写入数据良)

两个条件需要同时满足,

2.Redis内存优化理解

Redis内部有很多的数据类型,这些在官方文档上都可以看到,下面是其内部优化的一些细节点:

1. String 和 数字,在Redis中如果存储的是“123”Redis是能够识别出来这是一个数字并且按照数字来存储,节省存储空间,当然除了这个优化之外,Redis内部会构建一个数字池,默认是10000,那么如果是在这个池子的数字就只需要用一个简单的索引来引用进来就可以,而不需要把重复的数字都分开存储。这个数值可以调整源代码的宏:REDIS_SHARED_INTEGERS来扩大和缩小池子的大小。

2.复杂类型的存储优化,比如Map,List,Set等,这些集合都有一个特点可大可小,根据实际场景来定,一般情况下如果这些集合所包含的Entry不多,并且每个Entry所包含的Value不是很长的情况下,Redis内部使用紧凑格式来存储数据,紧凑格式存储数据在查询场景的算法复杂度是O(N),而类似Map或者Set他们的查询算法复杂度都是O(1)那为什么要这么做呢 ?为了能够节省内存空间,在N很小的时候其实和O(1)没什么区别。所以这里不的不介绍紧凑格式的代表ZIPMap,他的数据结构是这样:

可以看出,这个结构中初始情况只有2个字节,随着操作的增加它会变长,其中最关键的是一个关于Free这个字段的理解,以Map为例,如果新插入一个Key,那么对应ZipMap就会多出来一长串数据:。从图中可以看到插入key1的时候只有绿色的一串,当key2插入的时候就会又出来一个类似的黄色结构串。free的功能是在插入的时候用来冗余空间的,当key所对应的数值发生变化的时候,如果数据变的比之前短了,那么free的长度就变大,这个时候不需要做ZipMap的resize操作,如果数据长度变长了,并且在free能够足以支持新数据的范围之内,那么free就被利用起来,并且也不需要做Resize。这个时候会有空间的浪费或者说碎片。空间换时间吧,没什么好说的。当然Redis的代码中还有另外一个参数ZIPMAP_VALUE_MAX_FREE,这个参数可以用来设置如果Free的大小超过了这个值,那么ZipMap会发生Resize(收缩),从而节约空间。

接触的不久,先说这么多好了。

作者 DAGiGi

★ 基于关系数据库的地籍空间数据存储结构

★ 网络存储技术初探

★ 随笔感想:存储记忆

★ 超短激光脉冲在共振光子带隙结构中的存储

★ 网络存储技术比较研究论文

★ 分布式存储解决方案:Skylable SX

★ 议论文结构

★ 桃花源记结构

★ 短语结构

内存优化 篇6

小张:“我的才怪呢,BIOS倒是显示4GB,可系统却只认到3GB。”

这到底是怎么回事,好端端的内存怎么就无缘无故消失了?难道是内存兼容性问题,非得用相同品牌的内存不可吗?

这样的猜测毫无意义,即便是无限循环也是无济于事,因为945系列芯片组无论如何都不能完全支持4GB内存。芯片组支持4GB内存的前提是提供最少32位的内存寻址线,945系列芯片组虽然具备32位内存寻址线,但它仅有32条,已经没有设计剩余的地址总线来供操作系统调配,这是原因之一。

原因之二就是,物理内存的编址必须是连续的,不能被割断,系统开机必须先从4GB内存的顶端地址读取BIOS数据,而实际上内存地址的顶部大量空间已被划作为各种系统资源的内存映射来使用,这样一来就导致系统无法进行正常的自检。

至于小张的异事,纯属厂商搞的小把戏。上面不是讲到4GB内存的顶部大量空间被占用,既然空间被占用那就开机的时候将它释放不就得了。于是厂商在主板上加入了内存重映射技术,将系统资源内存映射的区域重新映射到4GB内存地址相应的空间,使所有地址完全由内存支配,从而保证内存能被正确的识别。

内存优化 篇7

随着半导体技术的飞速发展,处理器的计算能力不断被突破,导致较低处理能力和较少内存配置的移动手持设备可以完成应用和视频游戏的计算负载同时,还能保持较低的价格。但多数低端手持设备的软件并不是按照系统软件进行设计和开发,其中预置的应用和游戏和操作系统联编后烧入ROM中,这决定了低端手持设备不支持软件和游戏的下载和动态执行。一种支持elf文件动态加载执行的中间件平台打破了这种局面,它基于手持设备软件系统中的基础I/O、显示缓冲、Socket连接界面封装出低级和高级应用开发接口给第三方软件开发商使用,在其启动时从内存中申请一块固定大小的内存池(600K-800K),将存放文件系统中基于中间件接口开发并编译成elf格式的文件载入到该块内存以动态链接的方式执行。用户程序通过中间件集成的Doug lea内存分配算法从内存池中获得和释放制定的内存块。

在现今网络数据通信环境下,应用服务平台实际运营过程中一般要求图形密集型应用和视频游戏的尺寸控制在300k-400k。我们以QVGA16位色深的手机屏幕为例,两张整屏位图的尺寸150 x 2=300k,因此中间件平台压缩图片格式(一般为Gif图片格式)的解码库需要充分利用有限内存,提高内存利用率。

2、Gif中LZW解码算法

GIF文件,是可交换的图像文件格式(Graphics Interchange Format)的简称,它是比较流行的图像文件格式之一[1]。GIF文件中的图像数据采用LZW的派生算法进行无损压缩,可以将多幅图像数据以帧形式顺序存放,并且通过时间延迟方式顺序播放帧实现图像动态显示。GIF图像支持的是索引图像且最大支持256色。

GIF的图像数我据经过LZW压缩后存储在图像数据块的图像数据(Table Based Image Data)中,对GIF解码实质是对图像数据(Table Based Image Data)进行LZW解码。一个GIF文件中可以存储多帧图像数据,每帧图像解码对应一次LZW解码过程。GIF文件图像数据块中图像数据存储的并不是像素颜色值的压缩数据,而是相对于全局颜色表或局部颜色表的索引,在LZW解码完成后得到了颜色索引,还应该根据索引映射到颜色表的表项输出最终的颜色值。LZW算法一种可以适配多种类型数据的通用压缩算法,可以高速完成压缩和解压工作,过程不需要进行浮点运算,这一点十分适合低端ARM版本。LZW解码算法的核心思想是:根据LZW解码字典的基础表项实时构造新的字典项,根据当前LZW码查找并输出已存在的字典表项中的符号串[2]。

LZW解码算法伪代码描述如下:

在LZW解码的具体实现中,需要维护一个字符串字典,记录LZW每个压缩码所代表的字符串。由于LZW解码过程完全基于该字典进行,会频繁对字典数据进行查询、读取和写操作,因此LZW解码字典的设计方法直接影响到LZW解码的内存峰值和解码效率。

3、Doug Lea's Malloc

由于低端ARM平台,比如ARM7中不存在内存管理单元,因此一般采用Doug Lea内存管理算法对连续的内存空间进行内存动态分配和回收,本课题所基于的中间件平台最大可支配连续内存一般为600KB-800KB。

在Doug Lea内存管理算法中,分配的每一个内存块,都要耗费8字节的簿记开销(Book Keep Overhead),并且内存块大小8字节对齐[3,4]。它的内存块头部结构如下:

其中,prev_foot和head是内存块头部管理结构[5]。当申请的内存小于8字节时,实际申请得到的字节大小是16字节,内存有效利用率仅为50%,Doug Lea内存管理算法的这种特性,使得在使用小内存节点时会引起比较严重的内存浪费。

而基于Gif图片的游戏中,Gif图片使用数量比较大,一般会有几十张的Gif解码数据同时驻存在系统内存中,这种情况下,对Gif解码内存的峰值要求比较严格,因此,LZW解码实现要尽可能地降低Gif图片解码时的小内存利用,提高内存使用效率。

4、LZW解码优化

在LZW解码中,对于一个新构造的LZW字典表项来说,所代表的解码字符串有两部分组成,前缀字符串和后缀字符,并且前缀字符串肯定已经存在于LZW字典中了。

4.1、开源库中LZW解码方案

在开源的LZW解码库中,一般基于上述LZW解码算法的特点,采用的LZW字典设计方法是:每个字典表项不直接指向所代表的解码字符串,而是由两个数据域组成,分别是前缀字符串在字典中的位置和后缀字符。

字典表项结构体定义如下:

将当前字典项的后缀字符入栈,并把其前缀字符串对应的字典项设置为当前字典项,重复该步骤直至当前字典项为基础表项;将栈中的字符依次弹出栈顶,输出解码字符串

在LZW解码开源库dgif_lib.c中,具体实现如下,

前缀字符串入栈:

其中,因为不能确定每个输出串的最大长度,所以进栈操作StackPush(Suffix[CrntPrefix])和出栈操作StackPop()都是动态申请栈节点小内存块的。

从上述算法可以看出,开源库的这种设计方法在初始时刻就一次分配了整个LZW字典所需的内存,根据Doug Lea内存管理算法的特点,大内存块的利用率是很高的,但是在输出解码串时,首先需要从解码串的尾部开始向解码串的头部遍历并将所有的字符入栈,然后再将所有的字符出栈,等于对解码字符串遍历了两遍,并且中间伴随着栈操作,总的时间开销是O(2kcn)其中k是LZW码规模,c是出入栈操作的复杂度,大于1。由于涉及到栈操作,因此在解码过程中也会出现一定规模的小内存块的申请和释放,小内存块规模与某表项的解码字符串长度相关,是不能预先控制的。由此,开源库这种设计方法的时间复杂度开销大于O(2kcn)。会出现一定规模的小内存块浪费现象且不可控。

4.2、本课题的lzw解码方案

基于Doug Lea内存管理算法的特点,本课题设计了另外一种字典结构,在这种方法中,不再只单纯记录前缀字符串所在的字典项位置,也记录了当前字符串的长度,从而在定位到字典项之后,可以逆序将解码字符串输出,避免了两遍栈操作。

本课题中字典表项结构定义如下

本课题lzw字典结构的解码操作算法如下:

将当前字典项的后缀字符输出到缓冲,并把其前缀字符串对应的字典项设置为当前字典项,重复该步骤直至当前字典项为基础表项

else

构造新的字典项字符串,记录前缀字符串的字典项索引和后缀字符,并将前缀字符串的字典表项中的length++后赋予当前length

本课题中lzw解码输出核心代码段如下:

由上可见,本课题lzw解码输出没有进栈入栈操作,减少了小内存块的申请,因为少了先遍历后输出,所以提高了输出效率。

本课题的字典设计方法不仅不再需要申请任何小内存块,并且在定位到字典表项后,只要顺序输出每个字典项的后缀字符到缓冲即可,时间复杂度为O(kn)。内存恒定为4096*sizeo(lzw_dic_node)。

4.3、性能分析比较

本课题LZW解码方法相对于开源库的LZW设计方法来说,具有以下优点:

(1)更高效的解码效率,本课题复杂度是O(kn),而开源库的时间复杂度是O(2kcn),c大于1。

(2)本课题的LZW表项构造复杂度没有降低,与开源库中的复杂度相同,均为O(1)。

(3)本课题LZW解码的内存使用量恒为4096*sizeo(lzw_dic_node),并且没有不可控的小内存块申请,而开源库LZW解码的内存使用量不恒定并且不可预估。

5、实验结果对比

现以一张Gif文件解码过程为测试对象,从内存峰值开销和解码时间两个方面来对比两种新方案的具体性能。

本课题在低端手机硬件平台MT6225上进行测试,内存管理均为Doug Lea内存管理算法,测试用的Gif图片尺寸为240x320,文件大小39.5KB,1帧。测试数据如表1所示。

其中,对于一张240x320的Gif图片来说,解码后变为一张240*320*2=150KB的原始色彩图像,对于开源库中的LZW解码方案来说,需要耗费264KB的内存峰值,内存耗费比为264150=1.76;而对于本课题优化后的LZW解码方案来说,需要耗费225KB的内存峰值,内存耗费比为225/150=1.5。由上可以看出,单张Gif图片解码的内存峰值获得了较大的降低,并且解码时间相对于开源的LZW方案来说减少了大约260ms,从而有效的增加了图形密集应用和视频游戏中可包含的图像数据量、提高了游戏体验效果,因此说本课题LZW解码优化效果显著。

参考文献

[1]、GRAPHICS,INTERCHANGE FORMAT(sm),Version 89a,-1987,1988,1989,1990 Copyright,CompuServe Incorporated,Columbus,Ohio

[2]、Lempel-Ziv-Welch From Wikipedia,the free encyclopedia,http://en.wikipedia.org/wiki/LZW#Compression

[3]、A Memory Allocator,Doug lea.http://gee.cs.oswego.edu/dl/html/malloc.html.

[4]、Dynamic Storage allocation:A Survey and Critical Review,Paul R.Wil-son,Mark S.Johnstone,Michael Neely,and David Boles.Department ofComputer Sciences,University of Texas at Austin,Austin,Texas,USA.www.cs.northwestern.edu/~pdinda/ics-s05/doc/dsa.pdf

内存优化 篇8

GNU/Hurd操作系统是GNU设计用来替代Unix内核的新一代操作系统内核[1]。Hurd系统是基于CMU的Mach3.0微内核架构,由GNU小组对其进一步开发完成,并由Debian公司进行发布。

Hurd采用Mach微内核作为其内核,Mach微内核完成最基本的操作系统功能,例如进程通信、内存管理、硬件管理等。Hurd是架设在Mach上的一组服务,这一组服务贯彻了传统操作系统概念,实现了文件系统,网络协议,文件的访问控制,以及其它的操作系统功能。

Hurd与Mach系统在特点上各有千秋,例如Hurd的模块化以及微内核架构特点、Mach独有的IPC通信和内存管理特点等。本文将简单介绍Hurd与Mach系统特点,并分析Mach微内核的内存管理与接口实现。最后,讨论在Mach微内核下内存共享的实现。

1 Hurd操作系统与Mach微内核

1.1 Hurd操作系统及其特点

Hurd操作系统是GNU项目组设计用来取代Unix的新一代操作系统。虽然目前不是最流行的操作系统,但因其拥有很多独特的特性,从而与其它的操作系统相比,表现着更为出众的使用优势。Hurd的优点如下[2]:

(1)Hurd是开源的操作系统。任何人都可以使用并且修改,由GNU小组进行维护。

(2)兼容性。Hurd提供了一个通用的编程环境和用户环境,是一个类Unix的内核。Hurd使用GNU C库,并且兼容ANSI/ISO,POSIX,X/Open等标准。

(3)易于设计与扩展。Hurd不同于其他流行的操作系统内核,而是面向对象的结构。这种结构使得Hurd在进行扩展和修改时,无需重写内核,只需要修改相应的模块。

(4)多服务。Hurd实现了多线程,可高效地运行在单处理器和多处理机上。Hurd的运行性能非常稳定,还是一个很好的学习平台,各种想法实现起来也非常便捷。

GNU Hurd设计成多服务的面向对象的操作系统。可将其视为一组对象的集合,对象扩展了底层微内核Mach的功能,可以实现标准的操作系统功能以及实践系统设定的各项策略。系统的服务是通过专门的对象来实现的,这些对象在用户态下被称为server。一个服务也可以分解为一些对象,比如文件系统服务可以分解为后备存储、文件属性以及目录等。Hurd可以视为基于微内核Mach的服务的集合,包括文件系统、网络协议以及其他一些系统功能。GNU Hurd多服务操作系统的时新评论均详细介绍了Hurd的系统架构以及Hurd实现的详细细节,同时也给出了Hurd系统的优点和缺点[3]。

1.2 Mach微内核及其特点

Hurd作为GNU的操作系统,架设在微内核Mach之上,实现了传统意义上的操作系统功能。Mach是第一代的微内核结构,是由CMU大学设计并实现的微内核。GNU对其进行了修改和扩充,因而形成了GNU Mach微内核,GNU Mach兼容CMU的Mach 3.0系统。

GNU Mach是GNU项目的微内核。Mach并不显现操作系统的特点,而是借助一个简单的可扩展通信内核、用户模式的任务来实现传统操作系统功能。Mach所提供的基本功能包括控制流的管理(threads)、资源分配(tasks)、支持虚拟地址空间、管理硬件资源(如处理器、物理内存)等[4]。另外,Mach还具有强大的内存管理和进程间通信的功能,这是操作系统的基础功能,也为Hurd的server、GNU C库和用户程序提供了底层基础功能。微内核Mach本身虽不提供操作系统的功能,却也使得Hurd的服务和C库在Mach上实现了一个满足POSIX标准的操作系统。文献[5]给出了Mach微内核的设计创意和详细实现细节。

2 Mach微内核的虚拟内存管理

通常,操作系统的内存管理部分主要完成空间分配、虚拟地址映射和地址保护等功能,从而使得系统安全高效地使用有限的存储空间。Mach微内核的内存管理机制设计目标是:

(1)支持较大的、松散的虚拟地址空间。

(2)灵活的内存保护机制。

(3)copy-on-write操作。

(4)任务间内存共享,包括copy-on-write和read/write内存共享。

(5)内存映射文件。

(6)用户模式提供页和对象的后备存储[6,7]。

Mach的内存管理在设计上尽可能地独立于硬件,对硬件的唯一要求是提供页式管理机制支持,并且对于页的大小也不作限制,所有这些化简了在移植时的操作,使得Mach能够支持许多不同的体系结构。

2.1 Mach内核的5个基本抽象

Mach是一个支持并行分布多体系结构的操作系统微内核,有5个最基本的抽象概念,这些抽象概念对于理解Mach以及Mach的虚拟内存管理机制是必不缺少的。这五个概念分别是任务(Task)、线程(Thread)、端口(Port)、消息(Message)、内存对象(Memory object)[8],对其分析如下:

(1)任务(Task)。每个task是一个线程运行的执行环境,是最基本的资源分配单位。通常,task包括虚拟地址空间和系统资源(处理器、虚拟内存等),与UNIX进程的概念相类似。

(2)线程(Thread)。Thread是CPU使用的基本单位,是程序执行的实体。同一个任务内的所有thread共享全部资源。

(3)端口(Port)。port是一个信息通道。通过信道,Mach可以安全地进行消息传递。

(4)消息(Message)。message是线程之间通信使用的数据对象的类型集合。message大小不限,并可能包含指针和类型。

(5)内存对象(Memory Object)。Memory object是由server管理和提供的可以映射到一个任务的地址空间的数据备份。这是一种对存储的抽象,可以用来表示例如文件等存储实体。

2.2 Mach虚拟内存管理

Mach最著名的设计之一是其中的虚拟内存的设计,Mach将虚拟内存系统分为机器独立和机器依赖两部分。机器依赖提供一个简单的接口,负责管理硬件地址映射表;机器独立除了提供逻辑页表的管理,还提供映射表所组成的内存区域概念,同时也提供内存对象的支持和接口实现。Mach虚拟内存系统除支持单处理器外,还支持共享内存的多处理器系统,同时也具有很好的移植性,可以在各种不同的系统架构下加载运行。高性能也是Mach重要特点之一。Mach提供很大的、宽泛的虚拟地址空间、共享内存以及虚拟内存拷贝优化等等。Mach的每个任务(task)均拥有较大的地址空间范围,包括内存区域以及内存区域所映射的内存对象。Mach内规定任务的地址空间只由底层硬件的寻址限制所决定。

2.2.1 虚拟地址空间(Virtual Address Spaces)

虚拟地址空间定义了一组地址,这组地址指示线程thread在任务task执行的虚拟地址。虚拟地址空间由其对应的task命名。Mach的任务都拥有很大的虚拟地址空间,其线程的执行就是在此虚拟地址空间中。

虚拟地址空间由松散的已经索引的内存页面集合组成。Mach内核按照页面的属性值将这些内存页面分成不同的组,将其称为内存区域(memory regions)。页面的属性包括继承属性、保护属性、后备的抽象内存对象等等。系统的各项操作和运行机制均是基于内存区域的,但是用户对于内存区域的使用却无需限制,用户可以尽其所需地扩张内存区域。同时,Mach内核也可以按照适合的方式自由地合并和分割内存区域,从client的视角看,虚拟内存空间就是一个页面的集合。调用vm_region可以获得内存区域的属性。尽管内存区域是存在于内核的概念,调用vm_map也可以修改内存区域的继承和保护属性。

任务的虚拟地址空间是在任务创建时分配完成的,并于任务结束时一并销毁。当任务刚刚创建时,其虚拟内存空间是空的,必须通过执行一定操作申请地址内存空间。通过task_create调用,子任务可以继承其父任务的内存区域。而vm_inherit调用则可以修改内存区域的继承属性值,这些属性值包括:

(1)VM_INHERIT_NONE—该内存区域在新任务中不会被定义。

(2)VM_INHERIT_COPY—该内存区域将会以copy优化的方式在新任务中进行创建。

(3)VM_INHERIT_SHARE—新旧任务将完全共享同一内存区域。在此,可以看出Mach提供了父子任务的内存共享。

内存区域的语义识别是通过a memory manager的行为实现的。当一个内存区域在虚拟空间中创立时,一个虚拟内存对象(memory object)便和该内存区域联系在一起了。内存对象将负责内存区域的后备数据存储,其语义实现是通过一个称为memory manager的任务实现的。内核中不存在直接操作内存区域的系统调用,任务是通过memory manager的函数或者向memory manager发送消息来完成操作的。

vm_map调用是确定任务内存区域的唯一方法,借此可以设定该内存区域的基本信息(例如内存中位置、大小、保护属性、继承属性等)。需要指出的是,最重要的参数是对其抽象内存对象的指定,因其提供了内存区域的后备存储。

图1是以client的角度呈现的虚拟内存结构图。图中显示了三个内存区域,其中的两个共有一个相同的后备对象存储memory object,但是两者的继承属性或者保护属性可以不相同。

2.2.2 内存对象(Memory Objects)

内存对象代表了非常驻内存的内存区域,内存对象是内存区域的后备存储。而实现内存对象概念的任务则称为memory manager。memory manager实现了内存对象的完整语义,并且提供了若干接口,以方便用户使用。

用户态的任务操作内存的通用过程是:一个任务确定其内存区域,并指定该内存区域的内存对象;任务访问该内存区域的某部分,假如该内存区域不在内存中,则发生缺页中断,将其换入后继续访问;假如数据已修改,则将数据存入内存对象中,再将其换出内存;销毁内存区域以及内存对象。

内核使用内存可以将内存作为内存对象内容的缓存(cache)。该cache的一部分是常驻内存的,将此部分内存对象称之为memory cache object。内核维护cache,并对其适时、合理地进行管理、填充和刷新。

2.3 Mach虚拟内存管理接口的实现

GNU Mach很大程度上兼容了CMU的Mach 3.0,这一点在接口的层面上已经清晰地显现出来。文献[8,9]分别是Mach 3.0和GNU Mach的接口使用手册,经过分析,两者大部分相同,只是GNU Mach的接口实现简化了CMU Mach的接口,还对其进行了一定的封装处理。

在虚拟内存管理上,两者均提供了较为丰富的接口,同时,一个任务也可以修改其地址空间,例如:在页边界上分配虚拟内存区域、删除虚拟内存区域、设置虚拟内存区域的保护属性、指定虚拟内存区域的继承属性、创建和管理内存对象,内存对象可以映射另一个任务的虚拟地址空间。

Mach亦设有各类功能接口以实现其虚拟内存管理,可将这些接口分为两大类:虚拟内存接口和外部存储管理接口。

对于虚拟内存接口,主要有内存分配和回收、数据传输(读、写和拷贝数据)、内存区域属性设置(继承、保护属性)、映射内存对象。其中,映射内存对象可以将一个任务的地址映射到另外一个任务的地址空间中去,可以实现不同任务的内存共享。这一接口设置屏蔽了内存对象的操作,用户使用起来就像直接操作内存一样。其好处是大大降低了用户管理存储空间的难度,但是也有相应的不足,就是不可以使用高级的内存共享操作。

外部内存接口主要是针对于内存对象的接口,主要有设置内存对象服务、删除内存对象、内存对象的数据传输、内存对象锁定和设置内存对象属性等几类接口。使用外部内存管理接口可以实现较为复杂的内存管理,也包括内存共享操作。

3 Hurd的内存共享

通过对Mach微内核的内存管理的研究,本文提出在Hurd下的几种内存共享方案。

(1)考虑Hurd下POSIX标准的内存共享方案。为了便于实验和对比,同时在Linux和Hurd下进行了实验。

(2)使用Mach的内存对象的概念完成内存共享。这是重点阐述的部分,使用Mach内存对象的概念,并同时使用其IPC通信功能,实现内存共享与映射。

(3)考虑添加系统调用的方法完成内存共享。

3.1 内存共享

首先,介绍一下内存共享的概念。内存共享是指共享内存,从字面意义解释,就是多个进程可以将同一段内存映射到各自的进程空间,以此来实现数据的共享以及传输,这也是进程间最快的一种通信方式,图2是内存共享的示意图。

3.2 使用POSIX标准实现内存共享

Hurd系统支持POSIX标准,而POSIX标准对于内存共享是有规定含义的,所以可在Hurd系统下尝试使用POSIX的内存共享。POSIX标准对于内存共享的实现有两种方法。

(1)内存映射文件(memory-mapped file)。由open函数打开此类文件,并由mmap函数将得到的描述字映射到当前地址空间。

(2)共享内存区对象(shared-memory object)。由shm_open函数打开POSIX标准的一个IPC对象,并且使用mmap函数将其映射到进程地址空间中。

为了验证Hurd系统对于POSIX标准的内存共享,下面分别在Linux系统和Hurd系统下作了实验。

Linux系统下的POSIX内存共享有两种方法。一种是mmap系统调用映射普通文件完成内存共享;另一种是,shm_open函数打开对象,并且使用mmap函数完成内存共享。对于第二种方法,在Linux目录中存在共享内存区对象的目录dev/shm/,在此目录下可以发现打开的共享对象,符合POSIX标准。

Hurd系统是支持POSIX标准的,所以可假设Hurd系统也应该支持POSIX标准的内存共享。现将Linux下的程序移植到Hurd系统下进行对比。实验后发现,在Hurd目录中不存在共享内存区对象的目录/dev/shm,也不存在目标文件。同时,在程序执行的目录下发现了一个文件,该文件内容为共享内存对象的内容。这种情况说明了该文件是存储在本地磁盘上的,不是内存中的共享对象,因而不符合POSIX标准。

由此,得出结论:对于POSIX标准的支持,Hurd系统并没有完全实现,只是使用了文件进行模拟而已。所以,Hurd系统下,使用POSIX标准的内存共享是不可行的。

3.3 使用Mach自身接口实现内存共享

使用微内核Mach自身的接口和机制完成内存共享,可分为这样几种情况,即同一任务的不同线程之间、有父子关系的任务之间、无关系任务之间完成内存共享。对于前两种情况都比较简单,而对于第三种情况,稍微有些复杂。对其叙述如下:

(1)对于同一任务的不同线程之间的内存共享。这是共享任务全部资源的,所以,两个不同的线程可以直接完成最大限度的内存共享。这是内存共享中最为简单的情况。

(2)对于父子关系的任务之间的内存共享。可以通过设置内存区域(memory region)的继承属性来实现。

(3)对于无关系任务之间的内存共享。可以通过内存对象(memory object)和内存映射文件完成内存共享。本文将使用Mach微内核的内存管理以及内存对象(memory object)概念,完成内存共享。在Mach微内核中,结合Mach的IPC、Mach对于内存基本操作以及Mach对于内存对象的支持这三个方面的内容,即可完成内存共享的要求。整体思路是:首先建立共享的内存对象,设置内存对象属性,将内存对象映射到相应任务的地址空间,然后完成相应的访问,最后销毁内存对象。需要注意的是,在这一过程中,关键问题是实现任务间的交互、内存对象的保护和共享。

3.4 添加新的系统调用完成内存共享

虽然Hurd支持POSIX标准,但是对于内存共享并没有完全支持,在以后的版本中也可能会对其给予相应的支持。鉴于POSIX的内存共享标准,也可以在Hurd上实现符合POSIX标准或者其他形式的内存共享。这种实现则需要参考Linux和Mac OS的系统调用方式。

添加新的系统调用来实现内存共享的方法,需要添加至少两个系统调用,一个是内存区域的分配,另一个是内存区域的回收。详情请参考Mac OS的系统调用添加方式,这里就不再赘述了。

4 结束语

本文介绍了Hurd操作系统与Mach微内核,并解释了两者之间的关系,分别讲述了两者的特点和优点。着重阐述了微内核Mach的虚拟内存管理机制,并且分析其实现虚拟内存管理功能的接口实现。最后,给出了在GNU Hurd系统下的几种内存共享方法。经过实验分析,Hurd系统下POSIX标准的内存共享方法是不可行的,Hurd对于POSIX的标准没有达到完全兼容。而使用Mach内核自身的内存对象的概念可以实现内存共享,可以完成多种形式的内存共享,效果也十分理想,因而是一种很好的方法。另外,也可以考虑在Hurd下添加系统调用来完成内存共享。

参考文献

[1]GNU/Hurd[OL].http://www.gnu.org/software/hurd/hurd/doc-umentation.html

[2]BUSHNELL,THOMAS.The GNU Hurd Reference Manual[M].2007-11.

[3]WALFIELD N H,BRINKMANN M.A critique of the GNU H-urd multi-Server operating system[J].ACM SIGOPS Operatin-g Systems Review,2007.

[4]BRINKMANN,MARCUS.The GNU Mach reference manual[M].Free Software Foundation,2008-11.

[5]ACCETTA M,BARON R,BOLOSKY W.Mach:a new kernelfoundation for UNIX[J].Carnegie Mellon University.Citeseer,39(4864):1-16.

[6]RASHID,TEVANIAN R.Machine-independent virtual memo-ry management for paged uniprocessor and multiprocessor archi-tectures[J].IEEE Transactions on Computers,1988,37:896-908.

[7]王永杰,战超.MACH操作系统内存管理[J].计算机研究与发展,1992(10):27-30.

[8]BRINKMANN,MARCUS.Mach 3 Kernel Principles[M].Free S-oftware Foundation,2008:37-54.

购买内存谨防假冒 篇9

虚假内存危害大

内存条是电脑装机时必不可少的一项, 内存的好坏对电脑性能影响比较大。更重要的是, 内存能否正常工作直接关系到电脑能否正常运行, 所以内存的选择很关键。

业内专家表示, 假内存的危害极大, 可能导致电脑运行不稳定, 运行软件不稳定或内存读取错误, 严重的话可能导致内存或主机烧毁。如果消费者不幸买到假内存的话, 权益无法得到保障, 在售后服务方面也存在着很大问题。

三星原厂内存进入中国市场

三星内存在节能、环保、稳定方面表现出色, 采用40nm级半导体技术, 比60nm存储设备减少47%的能耗;同时, 三星内存更为绿色环保, 不含铅和卤素, 在产品上有显著的“GREEN”标示。

进入中国市场的三星内存, 包括DDR3台式机专用内存、DDR3笔记本专用内存、DDR2台式机专用内存、DDR2笔记本专用内存四款型号, 内存容量包括1G、2G、4G。三星原厂内存进入中国市场, 意味着市场上的内存种类更为丰富, 消费者在选购内存时将拥有更多的选择。

三星原厂内存防伪有高招

为了帮助消费者更好地选购正品, 三星内存在防伪方面做得比较到位。从外观上来看, 三星内存采用了十分少见的黑色窄版设计, 大小只有传统内存产品的三分之二。三星内存可识别度相当高, 提高了仿造的难度;同时, 三星正品内存的贴条号码和烫金号码一致, 消费者可以现场分辨真假。从而让消费者在购买之前就拒绝假冒品, 提高识别效率。

从细节上看, 三星正品内存做工精湛, 从内存颗粒到金手指, 质量绝非仿品可比。此外, 三星内存还提供“一年包换, 终身保修, 全国联保”服务, 让消费者可以高枕无忧。

内存品质轻松判断 篇10

青山漫步

我们都知道Vista对内存要求很高,好多朋友为了体验新系统,都打算添加内存条,可是如何才能买到品质优秀的内存呢?笔者向大家推荐Right Mark Memory Analyzer(以下简称RMMA),它是一款功能全面的通用CPU、芯片组、内存的性能测试工具。

打开下载的RMMA压缩包,找到一个名为RMMS.exe的文件,直接运行它就可以进入内存稳定性测试界面(如图1)。测试前在“Test Setting(测试设置)”中将Memory(MB)设为物理内存的最大值(如512MB),然后在“Test Repeats(测试次数)”中设置测试次数,默认只测试一次,最大可以测试10次,这样可以发现内存潜在的品质问题,当然需要的时间也相应增加,至于其他的设置项则不用更改。RMMS只是针对现有的空闲物理内存进行测试,即“Available Physical”中所示的值,为了更准确测试出内存品质,测试前最好关闭其他正在运行的程序。

设置完成后,单击“Run Test(运行测试)”按钮开始测试。测试过程中RMMS会往内存中不断写入各种不同的数据,然后加以读取,将获得的参数收集起来据此分析内存的性能。如果在测试过程中发现有红色块出现,说明该块所代表的内存地址可能存在问题,如果顺利通过检测,说明你的内存情况良好。

除了对内存进行扫描,我们可以打开解压文件中的“RMMT.exe”文件,这里包含了一个内存多线程性能测试(如图2),我们只要点击“Start(开始)”即可进行测试,在测试过程中我们可以看到实时的数据传输速度,还可以通过长时间运行该程序来考察内存的稳定性。

上一篇:商业银行财务报表分析下一篇:普通股股东保护