内存管理系统

2024-06-12

内存管理系统(精选12篇)

内存管理系统 篇1

0 引言

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]BRINKMANN,MARCUS.Mach 3 kernel interfaces[M].Free S-oftware Foundation,2008:73-150.

内存管理系统 篇2

机器内存很大,但越用越少,发现执行完一些批操作命令后,内存竟不释放(vmstat看free很少)。请教大家是不是minfreemaxfreeminpermmaxperm的设置有问题?

现在的minfree/maxfree较小,maxperm偏大。

谢谢!

zhilan 回复于:2003-01-08 16:11:41我执行compress大文件的时候,内存free越来越少,paging space用了 6%。但compress完毕后,内存free还在往下掉,按说应该回到compress前的水平啊。另外paging space还是占用了6%,没有释放。

好使 回复于:2003-01-08 16:15:09如果系统运行正常的话,没问题。

系统在VM方面,有一大部分用在文件的缓存上了,建议看看关于性能调整的资料。

zhilan 回复于:2003-01-08 16:41:22谢谢!问题是上次作load database时机器死了,当时paging space满了,剩余内存为0。机器是s85, 内存24 GB, paging space  8 GB。我估计作load database时内存free就不多了。如果是file cache占用过多的话,应该可以腾出作load database啊。调整maxperm/minfree/maxfree会有用吗?

另外,我一台跑cics,另一台跑sybase,两台问题都一样。按说跑cics的应该不会有问题的啊。

zhilan 回复于:2003-01-08 16:46:57另外一台s80没有这个问题。free很多,而且做完批命令后内存free马上恢复到原来的水平。跑的应用差不多。

我准备调整minfree/maxfree/maxperm等试试,还请各位多多指教!

好使 回复于:2003-01-08 16:48:24系统的补丁全吗?是不是memory leak?

tonylau 回复于:2003-01-08 17:24:24可以设置最大永久占有内存参数,/usr/samples/kernel/vmtune -h 1

这样系统的uncompute内存最大到80%(topas),系统会有10%的内存Free

vofsky 回复于:2003-01-08 17:27:37打补丁看看

tonylau 回复于:2003-01-08 17:41:01这个现象打补丁没用。

zhilan 回复于:2003-01-08 20:41:31谢谢几位!已经解决了,除按tonylau所说做了vmtune h 1外,还改了minfree/maxfree/minperm/maxperm。感觉h 1挺管用的。

再次向大家表示衷心的谢意!

另外把这些参数修改加在了/etc/inittab中,这样reboot后也自动执行。

又碰到一个棘手的问题,再发帖请教。

ibm6000 回复于:2003-01-08 20:48:05这个帖子不错,有头有尾,加为精华:)

lljj 回复于:2003-01-08 21:06:31我还发现sybase

load数据库时!的确有这个问题!

大最新的sybase补丁!

jflong 回复于:2003-01-09 08:55:49请问一下minfreemaxfreeminpermmaxperm怎么设置?

zhilan 回复于:2003-01-09 10:00:24/usr/samples/kernel/vmtune -p ** -P ** -f **** -F **** -h 1

jinyingtao 回复于:2003-01-09 14:24:47这类问题属于内存分配问题。

类似大量文件类操作,如compress、database的dump/load会大量占有内存中的文件型内存(在AIX系统中,内存简单可以分为两类:计算型内存和文件型内存)。所以按照系统缺省的配置,文件型内存最多会占用total real memory的80%(这个可以利用nmon看到),当内存很少时,就会产生换叶到paging space的现象,主要换出文件型内存帧。

这个问题可以通过vmtune加以控制,在/etc/inittab中添加:vmtune:2nce:/usr/samples/kernel/vmtune -p 5 -P 20 -h 1将文件型内存控制在total real memory的5%~20%之间,也就是minperm和maxperm。

前提是必须安装vmtune,好像在bos.adt.samples中

tonylau 回复于:2003-01-09 16:20:33调整MAXPERM和MINPERM是SOFT LIMIT,调整后实际效果并不好,调整STRICT_MAXPERM(-h 1)是HARD LIMIT,强制。

zhilan 回复于:2003-01-14 17:51:18jinyingtao 你好! 我正是这样做的,将maxperm设置为远小于缺省值,并执行严格的maxperm策略(即h 1)。

先看参数的意义:

If percentage of RAM oclearcase/“ target=”_blank“ >ccupied by file pages falls below minperm, VMM steals both file and computational pages

If percentage of RAM occupied by file pages rises above maxperm, VMM steals only file pages

If percentage of RAM occupied by file pages is between minperm and maxperm, VMM will steal only file pages Unless file repaging rate is higher than computational repaging rate

将maxperm设小,可避免这样的情形:当执行大量文件类操作时,文件性内存耗用过多,而计算性内存将不敷使用,从而产生大量的换页操作。而事实上此时文件性内存应作为page-stealer的偷取对象,因为它被重复引用的可能性非常低。

zhilan 回复于:2003-01-14 17:53:13jinyingtao 你好! 我正是这样做的,将maxperm设置为远小于缺省值,并执行严格的maxperm策略(即h 1)。

先看参数的意义:

If percentage of RAM occupied by file pages falls below minperm, VMM steals both file and computational pages

If percentage of RAM occupied by file pages rises above maxperm, VMM steals only file pages

If percentage of RAM occupied by file pages is between minperm and maxperm, VMM will steal only file pages Unless file repaging rate is higher than computational repaging rate

将maxperm设小,可避免这样的情形:当执行大量文件类操作时,文件性内存耗用过多,而计算性内存将不敷使用,从而产生大量的换页操作。而事实上此时文件性内存应作为page-stealer的偷取对象,因为它被重复引用的可能性非常低。

zhilan 回复于:2003-01-14 17:54:19jinyingtao 你好! 我正是这样做的,将maxperm设置为远小于缺省值,并执行严格的maxperm策略(即h 1)。

先看参数的意义:

If percentage of RAM occupied by file pages falls below minperm, VMM steals both file and computational pages

If percentage of RAM occupied by file pages rises above maxperm, VMM steals only file pages

If percentage of RAM occupied by file pages is between minperm and maxperm, VMM will steal only file pages Unless file repaging rate is higher than computational repaging rate

将maxperm设小,可避免这样的情形:当执行大量文件类操作时,文件性内存耗用过多,而计算性内存将不敷使用,从而产生大量的换页操作,

而事实上此时文件性内存应作为page-stealer的偷取对象,因为它被重复引用的可能性非常低。

zhilan 回复于:2003-01-08 16:03:03

zhilan 回复于:2003-01-08 16:11:41我执行compress大文件的时候,内存free越来越少,paging space用了 6%。但compress完毕后,内存free还在往下掉,按说应该回到compress前的水平啊。另外paging space还是占用了6%,没有释放。

好使 回复于:2003-01-08 16:15:09如果系统运行正常的话,没问题。

系统在VM方面,有一大部分用在文件的缓存上了,建议看看关于性能调整的资料。

zhilan 回复于:2003-01-08 16:41:22谢谢!问题是上次作load database时机器死了,当时paging space满了,剩余内存为0。机器是s85, 内存24 GB, paging space  8 GB。我估计作load database时内存free就不多了。如果是file cache占用过多的话,应该可以腾出作load database啊。调整maxperm/minfree/maxfree会有用吗?

另外,我一台跑cics,另一台跑sybase,两台问题都一样。按说跑cics的应该不会有问题的啊。

zhilan 回复于:2003-01-08 16:46:57另外一台s80没有这个问题。free很多,而且做完批命令后内存free马上恢复到原来的水平。跑的应用差不多。

我准备调整minfree/maxfree/maxperm等试试,还请各位多多指教!

好使 回复于:2003-01-08 16:48:24系统的补丁全吗?是不是memory leak?

tonylau 回复于:2003-01-08 17:24:24可以设置最大永久占有内存参数,/usr/samples/kernel/vmtune -h 1

这样系统的uncompute内存最大到80%(topas),系统会有10%的内存Free

vofsky 回复于:2003-01-08 17:27:37打补丁看看

tonylau 回复于:2003-01-08 17:41:01这个现象打补丁没用。

zhilan 回复于:2003-01-08 20:41:31谢谢几位!已经解决了,除按tonylau所说做了vmtune h 1外,还改了minfree/maxfree/minperm/maxperm。感觉h 1挺管用的。

再次向大家表示衷心的谢意!

另外把这些参数修改加在了/etc/inittab中,这样reboot后也自动执行。

又碰到一个棘手的问题,再发帖请教。

ibm6000 回复于:2003-01-08 20:48:05这个帖子不错,有头有尾,加为精华:)

lljj 回复于:2003-01-08 21:06:31我还发现sybase

load数据库时!的确有这个问题!

大最新的sybase补丁!

jflong 回复于:2003-01-09 08:55:49请问一下minfreemaxfreeminpermmaxperm怎么设置?

zhilan 回复于:2003-01-09 10:00:24/usr/samples/kernel/vmtune -p ** -P ** -f **** -F **** -h 1

jinyingtao 回复于:2003-01-09 14:24:47这类问题属于内存分配问题。

类似大量文件类操作,如compress、database的dump/load会大量占有内存中的文件型内存(在AIX系统中,内存简单可以分为两类:计算型内存和文件型内存)。所以按照系统缺省的配置,文件型内存最多会占用total real memory的80%(这个可以利用nmon看到),当内存很少时,就会产生换叶到paging space的现象,主要换出文件型内存帧。

这个问题可以通过vmtune加以控制,在/etc/inittab中添加:vmtune:2nce:/usr/samples/kernel/vmtune -p 5 -P 20 -h 1将文件型内存控制在total real memory的5%~20%之间,也就是minperm和maxperm。

前提是必须安装vmtune,好像在bos.adt.samples中

tonylau 回复于:2003-01-09 16:20:33调整MAXPERM和MINPERM是SOFT LIMIT,调整后实际效果并不好,调整STRICT_MAXPERM(-h 1)是HARD LIMIT,强制。

zhilan 回复于:2003-01-14 17:51:18jinyingtao 你好! 我正是这样做的,将maxperm设置为远小于缺省值,并执行严格的maxperm策略(即h 1)。

先看参数的意义:

If percentage of RAM occupied by file pages falls below minperm, VMM steals both file and computational pages

If percentage of RAM occupied by file pages rises above maxperm, VMM steals only file pages

If percentage of RAM occupied by file pages is between minperm and maxperm, VMM will steal only file pages Unless file repaging rate is higher than computational repaging rate

将maxperm设小,可避免这样的情形:当执行大量文件类操作时,文件性内存耗用过多,而计算性内存将不敷使用,从而产生大量的换页操作。而事实上此时文件性内存应作为page-stealer的偷取对象,因为它被重复引用的可能性非常低。

zhilan 回复于:2003-01-14 17:53:13jinyingtao 你好! 我正是这样做的,将maxperm设置为远小于缺省值,并执行严格的maxperm策略(即h 1)。

先看参数的意义:

If percentage of RAM occupied by file pages falls below minperm, VMM steals both file and computational pages

If percentage of RAM occupied by file pages rises above maxperm, VMM steals only file pages

If percentage of RAM occupied by file pages is between minperm and maxperm, VMM will steal only file pages Unless file repaging rate is higher than computational repaging rate

将maxperm设小,可避免这样的情形:当执行大量文件类操作时,文件性内存耗用过多,而计算性内存将不敷使用,从而产生大量的换页操作。而事实上此时文件性内存应作为page-stealer的偷取对象,因为它被重复引用的可能性非常低。

zhilan 回复于:2003-01-14 17:54:19jinyingtao 你好! 我正是这样做的,将maxperm设置为远小于缺省值,并执行严格的maxperm策略(即h 1)。

先看参数的意义:

If percentage of RAM occupied by file pages falls below minperm, VMM steals both file and computational pages

If percentage of RAM occupied by file pages rises above maxperm, VMM steals only file pages

If percentage of RAM occupied by file pages is between minperm and maxperm, VMM will steal only file pages Unless file repaging rate is higher than computational repaging rate

将maxperm设小,可避免这样的情形:当执行大量文件类操作时,文件性内存耗用过多,而计算性内存将不敷使用,从而产生大量的换页操作。而事实上此时文件性内存应作为page-stealer的偷取对象,因为它被重复引用的可能性非常低。

解决内存泄漏自动重启系统 篇3

A:你所说的这个问题通常被称为“内存泄漏”,也就是说Android应用关闭后系统依然不释放相应的内存。这样剩余的内存就会越来越少,最后导致后台进程频频重新启动。既然已经知道重新启动是最好的解决方法,那么就可以安装一个名为Phoenix的应用,这样就可以根据需要设置系统自动重启的条件,当条件符合以后就会自动重启。

◆ 重新找回支付宝的手势密码

Q:我最近将支付宝应用升级到最新版本,结果发现常用的手势密码没有了,取而代之的是系统的Touch ID功能。那么有没有什么方法,可以重新使用手势密码呢?

A:支付宝并没有完全取消手势密码,所以要想使用的话,首先打开支付宝,通过“服务窗”找到“支付宝客户中心”,接着点击左下角“遇到问题”中的“服务大厅”这项。然后在输入框里面输入“如何开启手势密码”,找到答案以后根据提示点击“设置手势密码”,最后即可设置对应的手势密码了。

◆ 利用空格键快速选择词组

Q:我最近买了一个iPhone 6的手机,用着感觉还不错,就是屏幕大了单手操作不方便,尤其是在文字输入的时候,选词非常麻烦。那么有没有什么方法可以解决这个问题?

A:其实要解决这个问题还是很简单的,通过键盘中的空格键就可以完成操作。比如要选择第一个词组就按一下空格键,这时光标就会自动移动到这个词组上,再点击“确认”按钮进行提交即可。如果要选择第二个词组,连续按两下空格键即可选择,其他的操作以此类推(前提是不能开启“句号快捷键”功能)。

◆ 通过手机扫描图片中的文本

Q:走到街上经常会看到一些推广资料,有的内容可能觉得以后会有些用,所以就会通过手机将其拍摄下来。那么有没有什么方法,可以将图片中的文字转换出来?

A:其实利用拥有OCR技术的软件,就可以解决你所遇到的问题。比如微软最新发布的“Office Lens”应用,通过它就可以轻松地识别出图片中的中文以及其他文字信息。识别完成以后会将其转换为Word文件,这样通过编辑器就可以进行编辑操作了。

◆ 微信朋友圈缓存图片的存放位置

Q:以前我曾经浏览过一个朋友圈好友的图片,但是今天发现好友把朋友圈那张图片删了。请问一下我手机里还缓存有这张图片吗?这张图片应该放在Android系统的哪个文件夹中?

Linux虚拟内存管理 篇4

1、虚拟存储器的思想

一个进程的代码, 数据, 堆栈的总容量可能超过可用物理内存的容量, 操作系统负责吧当前用到的那些部分保留在内存中, 而把其他部分保存在磁盘上, 当需要用到不再内存的某一个部分时, 由操作系统把那部分调入内存, 同时把已经在内存中的但是暂时用不到的部分清除出去。这些操作对用户来说都是透明的。

2、Linux支持虚拟内存 (virtual memory)

虚拟内存是指使用磁盘当作RAM的扩展, 这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上, 这样一来, 这块内存就可用于其它目了。当需要用到原始的内容时, 它们被重新读入内存。这些操作对用户来说是完全透明的。当然, 读写硬盘要比直接使用真实内存慢得多, 所以程序就不会象一直在内存中运行的那样快。用作虚拟内存的硬盘部分被称为交换空间 (swap space) 。

3、Linux虚拟内存的实现需要6种机制的支持

地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制和内存共享机制。

存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址。当用户程序运行时, 如果发现程序中要用的虚地址没有对应的物理内存, 就发出了请求页要求。如果有空闲的内存可供分配, 就请求分配内存 (于是用到了内存的分配和回收) , 并把正在使用的物理页记录在缓存中 (使用了缓存机制) 。如果没有足够的内存可供分配, 那么就调用交换机制;腾出一部分内存。另外, 在地址映射中要通过TLB (翻译后援存储器) 来寻找物理页;交换机制中也要用到交换缓存, 并且把物理页内容交换到交换文件中, 也要修改页表来映射文件地址。

Linux总是假定处理器支持三级页表结构。这三届页表依次为页目录 (PGD, Page Directory) , 中间页目录 (PMD, Page Middle Directory) 和页表 (PTE, Page Table) .每一级页表通过虚拟地址的一个域来访问。

4、在INTEL X86TIXI的微机上

Linux的页表结构实际上为两级其中页表目录就是PGD, 页表就是PTE, 而PMD和PGD实际上是合二为一的。所有有关PMD的操作实际上是对PGD的操作。所以源代码中过的形如*_pgd_* () 和*_pmd_* () 的函数所实现的功能是一样的。有关的宏定义如下:

从上面的宏定义可以清楚地看到i386体系结构中PMD实际上是不存在的, PMD (中间页目录) 只含有一项 (#define PTRS_PER_PMD 1) , 实际上这一级已经是退化了。页目录PGD和页表PTE都含有1024个项。

5、按需调页分析

我们来看一下2.4.18版的linux kernel按需调页的过程:

首先由缺页中断进入do_page_fault函数, 该函数是缺页中断服务的入口函数。该函数先查找出现却也的虚拟存储区的v m_area_struct结构, 如果没有找到则说明进程访问了一个非法地址, 系统将向进程发送出错信号。若地址是合法的, 则接着检查缺页时的访问模式是否合法, 若不合法系统将向进程发送存储访问出错的信息。通过上述两步检查之后, 可以确定发生的却也情况是正常的, 可以进入下一步处理。

do_page_fault () 函数入口, asmlinkage指示编译器不要使用寄存器, 而是使用堆栈来传递参数。Regs是struct pt_regs结构的指针, 保存了在发生异常是的寄存器内容。Error_code是一个32位长整形数据, 但是只有最低3位有效, 在发生异常时, 有CPU的控制部分根据系统当前上下文的情况, 生成此3位数据, 压入堆栈。

摘要:一般而言, 计算机的内存容量是有限的, 而某些进程运行所需的内存空间却有可能超过内存的总容量。这也就意味着存在这样的可能:运行某个进程, 机器内存容纳不下该进程所有的代码, 数据和堆栈, 而是只能容纳其中的一部分。一个占用大量内存的进程在任意一段时间内需要用到的代码, 数据等都是总数的一小部分, 其余部分在相应时间段内对于维持进程的运行是不起作用的, 于是, 虚拟存储器技术应运而生。

关键词:内存容量,内存空间,虚拟内存,进程,虚拟存储器技术

参考文献

[1]白洛, 李俊奎译.深入理解linux虚拟内存管理.el Gorman.京航空航天大学出版社.

[2]胡希明, 毛德操.linux内核源代码情景分析.江大学出版社.

glibc内存管理 篇5

上面个段的含义如下:

text:存放程序代码的,编译时确定,只读;

data:存放程序运行时就能确定的数据,可读可写;

bss:定义而没有初始化的全局变量和静态变量;

heap:一般由程序员分配,如果不释放的话在程序结束的时候可能被OS回收;

stack:有编译器自动分配释放,存放函数的参数、局部变量等;

Mmap:映射区域;

程序可以直接使用系统调用来管理heap和mmap,但更多的时候是使用C提供的malloc和free来动态地分配和释放内存,Linux上的stack的限制大致是8M,而在Windows上为2M.

C风格的内存管理程序:

也就是malloc和free,主要是通过brk或者mmap添加额外的虚拟内存。对于那些需要保持长期存储的程序使用malloc来管理内存可能会非常令人失望,如果有大量的不固定的内存引用,经常难以知道他们如何被释放。

池式内存管理:

应用程序可以更简单地管理内存;内存分配和回收更快;可以预先分配错误处理池,以便程序在常规内存被耗尽时仍然可以恢复;有非常易于使用的标准实现。

内存池只适用于操作可以分阶段的程序;通常不能和第三方库很好滴合作;如果程序的结构发生变化则不得不修改内存池;必须记住需要从哪个池进行分配。

引用计数:

不能忘记调用引用计数函数;无法释放作为循环数据结构的一部分;在多线程环境中更难也更慢。

垃圾回收:

永远不必担心内存的双重释放或者对象的生命周期;

无法干涉何时释放内存;比其他形式的内才能管理更慢;如果忘记将不再使用的指针设置为null,

内存管理器的设计目标:

最大化兼容性;

最大化可移植性(能很好地和OS交流);

浪费最小的空间(管理自身的数据结构也是需要内存的,还有一个需要注意的是碎片);

最快的速度(2/8原则,主要用来优化热点);

最大化可调性(能适应多种分配的需求,或者是通过配置来适应);

最大化局部性(这里考虑的是CPU的cache和内存之间的关系);

最大化调试功能(作为程序员就不用说了);

最大化适应性(在不修改配置时候的适应性);

ptmalloc实现了malloc和free以及一组其他函数,以提供动态内存管理的支持。分配器处于用户程序和内核之间,用来响应用户的分配请求,向操作系统申请内存,然后将其返回给用户程序。为了保持高效的分配,分配器一般都会预先分配一大块内存,并通过某种算法管理。用户释放掉的内存也并不是立即就返回给操作系统。ptmalloc在设计的时候折中了高效性、高空间利用率、高可用性等设计目标。其设计假设如下:

用mmap来分配长生命周期的大内存;

特别大的内存分配总是使用mmap;

短生命周期的内存分配使用brk;

尽量只缓存小的、临时使用的内存,而大的内存则直接归还给系统;

小内存块只有在malloc和free的时候进行合并;

收缩堆的条件是当前free的快的大小加上前后能合并的chunk的大小大于64K,并且堆顶的大小达到阀值;

需要长期存储的程序不适合ptmalloc;

总体上的结构如下:

而实际存在数据的是Chunk,使用中的Chunk的结构如下:

其中:

P:表示前一个Chunk是否在使用中;

M:标志Chunk是从那个内存区域获得的虚拟内存;

A:标志是否是主分配区;

空闲的Chunk在内存中的结构如下:

在glibc中使用bin来管理空闲的chunk,细节就不说了,

当空闲的chunk被链接到bin中的时候,ptmalloc会检查他前后的chunk是否也是空闲的,如果是的话,就会合并成一个大的chunk.bin的结构如下:

ptmalloc为了提高分配的速度,会把一些小的chunk先放到Fast bins中。fast bins中的chunk并不改变它的使用标志P,这样也就无法将他们合并,当用户分配小的内存的时候,ptmalloc首先会在fast bins中查找响应的空闲块,然后再去查找Unsorted bins中空闲的chunk.被合并后的chunk、或者是不能放在fast bins中的chunk会首先放在Unsorted bin中,如果在分配的时候在Unsorted bin中无法满足要求,则将Unsorted bin中的chunk加入到bins中。

因为在分配内存的时候是用低地址到高地址分配的,这样一个分配到的大的内存(用来模拟sub-heap)的上面很有可能是有一块空闲的内存,也就是Top chunk.Top chunk是在fast bin和bins之后才考虑的,所以这段区间并不在bins这些结构中。如果ptmalloc设法在top chunk中分配一段空间时且top chunk不够大,这时会重新分配一个新的sub-heap,并将top chunk迁移到新的sub-heap上。新的sub-heap与已有的sub-heap用单向链表连接起来。如下:

当要分配的空间足够大的时候,ptmalloc会使用mmap来直接使用内存映射来讲页映射到进程空间。这样分配的chunk在被free时将直接接触映射,再次对这样的内存区域的引用将会引起段错误。

Last remainder chunk是另外一种特殊的chunk,在分配一个small chunk的时候,如果在small bins中找不到合适的chunk,如果last remainder chunk的大小大于所需的small chunk大小。那么它将会分裂成两个,一个供用户使用,另一个变成了新的Last remainder chunk.

ptmalloc的响应用户内存分配请求的具体步骤:

获取主分配区的锁,如果失败就查找非主分配区,再不行就创建新的非主分配区;

将用户请求的大小转换为实际需要分配的chunk空间的大小;

如果chunk_size<=max_fast则转4,否则,跳转5;

尝试在fast bins中分配,如果成功则结束返回;

如果chunk_size<=512B则下一步,否则跳转6;

查找对应的small bins,如果找到则分配成功;否则转7;

合并fast bins中的chunk,遍历unsorted bin中的chunk,如果只有一个chunk,并且这个chunk在上次的分配中被使用过,并且所需分配的chunk大小属于smallbins,并且chunk的大小满足要求,则直接将该chunk进行切割,分配结束;否则将其放入bins;

在large bins中查找;如果失败转9;

如果top chunk满足要求,则从中分配出一块;否则转10;

如果是主分配区,调用sbrk增加top chunk的大小;否则分配一个新的sub-heap;或者直接使用mmap来分配;如果需要用mmap分配转11,否则转12;

使用mmap系统调用为程序的内存空间映射一块空间,然后将指针返回给用户程序;

判断是否第一次调用malloc,若是主分配区,则进行一次初始化工作。否则根据10的规则来分配。

为了避免Glibc内存暴增,使用时需要注意一下几点:

后分配的内存先释放(top chunk的考虑);

不适合用于管理长生命周期的内存,特别是持续不定期分配和释放长生命周期的内存;

不要关闭ptmalloc的mmap分配阀值动态调整机制;

多线程分阶段执行的程序不适合使用ptmalloc(更适合使用内存池);

内存管理系统 篇6

关键词: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).

内存管理系统 篇7

几乎所有的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).

内存管理系统 篇8

首先, 把内存中的所有页面按照2n划分, 其中n=0~5, 对一个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分, 划分后形成了大小不等的存储块, 称为页面块, 简称页块。包含1个页面的页块称为1页块, 包含2个页面的称为2页块, 依此类推。Linux把物理内存划分成了1、2、4、8、16、32六种页块。对于每种页面块按前后顺序两两结合成一对Buddy"伙伴", 按照1页面划分后, 0和1页、2和3页…是1页块Buddy。按照2页面划分, 0-1和2-3、4-5和6-7…是2页块Buddy。

Linux把空闲的页面按照页块大小分组进行管理, 用数组free_area[]来管理各个空闲页块组。在/mm/page_alloc.c中定义如下:

当进程提出存储请求时, 系统按照Buddy算法, 根据请求的页面数在free_area[]对应的空闲页块组中搜索。linux并不是按照要求的页块的数目去进行分配, 而是将大于、等于这个数目的最小2n个页块分配出去。比如, 要求3个页块, 就分配22=4块;要求16个页块, 就分配24=16块, 如此等等。因此, 系统总是按照进程所需连续存储块的申请数量, 到空闲区队列free_area中能够满足要求的最小空闲区队列里查找。当队列不空时, 就把第一个空闲区分配出去。如果该队列为空, 那么就继续查找下面的队列 (其空闲区的尺寸为上一个队列的2倍) 。当它里面有空闲区时, 就把该空闲区一分为二:一个分配出去给进程使用;余下的一半, 排到它上面的空闲区队列中去。

在内存页面释放时, 系统将做为空闲页面看待。然后检查是否存在与这些页面相邻的其它空闲页块, 若存在, 则合为一个连续的空闲区按Buddy算法重新分组。

2、用Buddy算法分配和释放空闲区

举个例子:比如系统的可分配内存总量是1MB。现在有一个存储申请、释放序列:进程A申请100KB, 进程B申请256KB, 进程C申请64KB, 进程D申请256KB, 进程B释放256KB, 进程A释放100KB, 进程E申请75KB, 进程C释放64KB, 进程E释放75KB, 进程D释放256KB。

那么, 它的过程如下图所示:

第一个请求是进程A需要100KB。按照2的幂次计算, 应该分配给它128KB的存储量。于是, 先把1MB的区域一分为二, 划分出两个512KB的伙伴, 再把其中的第一个划分成两个256KB的伙伴, 最后把这两个中的第一个划分成两个128KB的伙伴。至此, 将伙伴中的第一个分配给进程A, 如图 (b) 所示。接着是进程B申请256KB。由于已经有这样的存储区存在, 就直接分配给它, 如图 (c) 所示。随之进程C申请64KB, 就把原先128KB空闲区一分为二, 出现两个64KB的区域, 并把第一个分配出去, 如图 (d) 所示。图 (e) 表示分配给进程D一个256KB的区域。图 (f) 表示进程B释放了它所占据的256KB区域。这时要注意, 虽然该区域前面有一个64KB的空闲区, 但因为他们不是伙伴, 因此不能将它们合并成一个大的空闲区。图 (g) 表示进程A释放了它所占据的128KB。图 (h) 表示将一个128KB的区域分配给进程E。图 (i) 表示进程C释放64KB。这时它的伙伴是空闲的, 所以将它们两个合并成一个128KB的大区域。图 (j) 表示进程E释放128KB, 根据伙伴原则, 这个释放将引起一连串的空闲区合并, 即释放的128KB和它的伙伴合并成一个256KB的空闲区;两个256KB的空闲区又合并成一个大的512KB的空闲区。最后, 进程D释放256KB, 又通过一连串的合并, 整个区域恢复呈现一个大的、1MB的空闲区, 如图 (k) 所示。

3、结束语

Linux但由于地址结构, 而又具有自己的特点。在其发展过程中不断的在完善和优化内存管理单元的功能和性能。本文所提出的Buddy算法的时间性能主要取决于查找空闲块的位置和分割、合并空闲块所花费的时间。分配、释放空闲空间的时耗极小且相对稳定, 比较适用于嵌入式实时系统。

摘要:操作系统中对内存空闲空间的管理方法有很多种。例如:固定分区存储管理采用的是分区分配表, 可变分区存储管理采用的是单链表、双链表, 请求分页存储管理采用的的是单链表等等。Linux内核采用虚拟页式存储管理, 类同于请求分页式。Linux对内存空闲空间的管理采用的是Buddy算法, 主要的目的就是减少内存碎片, 增加内存的使用率。

关键词:Buddy算法,页块,空闲区

参考文献

[1].郭福顺, 王世铀, 藏天仪.一种动态存储管理机制.计算机研究与发展[J].1999;36 (1) ;62~66

[2].石峰, 刘坚.动态存储错误的静态检测方法研究.计算机工程与应用[J].2004 (19) , 104-106

[3].刘佳, 张毅.基于流数据的动态存储技术.燕山大学学报[J].2005 (4) , 344-347

一种内存管理策略的研究和实现 篇9

问题源于一种两个多边形区域集间的叠加分析算法的实现。此算法旨在引入GIS中经典的弧段—结点模型, 使单纯用的坐标点序列表示的区域含有处理叠加分析时必要的拓扑信息。因此需要动态创建虚拟的结点和弧段并维持两个集合的原始输入的边界点序列集。为提升程序的效率, 算法层面要设计时间、空间复杂度较低的算法, 实现上的一个重要的手段是为其设计特有的内存管理机制。限于篇幅, 本文只侧重于后者。

内存管理分为两部分:原始数据的组织方式;结点、弧段等小对象的管理。下面章节将分别叙述这两个部分的实现。首先要说明的是我们的尝试处于内存管理层次的第3层, 也就是应用程序层面如图1所示:

1 内存管理原理与实现

两个问题的共同点是我们都会在堆上分配、回收内存。然而, 堆 (heap) 只是一个由大量字节构成的区域, 通用的堆管理器不能同时处理好每一种数据组织类型, 因而只能折中的选择一种实现方式。因此, 就算从哲学角度考虑, 也应为下面的两个问题设计专有的内存管理器。

2 原始数据的组织

2.1 需求

特定的算法需要此管理器满足如下前提假设:①一个集合原始数据存放于连续或逻辑上连续的内存块中, 并不对其移动和大规模拷贝, 读取只采用引用的形式;②区域边界即为坐标点的序列, 不含额外的信息 (包括方向、点数等) , 并规定向高地址方向增长;③对任意边界中的任意长度的片段的正逆向读取。

2.2 设计

在Windows平台下, 虚拟内存最适合用来管理大型对象和结构数组。我们使用虚拟内存分配函数VirtualAlloc在用户区 (0x00000000-0x7FFFFFFF) 的高地址区保留一块区域, 选用高地址区域是为了使原始数据存储于相对独立的地址空间。使用一种链表结构的列表记录将存储在其中点序列的地址空间。

由于集合中边界的总数是预知的, 因此一个大小sz的列表 (mem_commit_list) 在内存管理器的构造函数中被指定。第i (I

一个几何点定义为一个16bytes结构, x86机的页大小为4096bytes, 因此已页内存上最多可以存放256个点结构, 我最初将点序列的首地址按页边界对齐, 仅管没有验证此种设计是否有价值。因此mem_commit_list[i]的值总是PAGE_SIZE的倍数, 点序列占据的空间大小总为整数倍的PAGE_SIZE。这种设计的一个缺点是会造成所谓的内零头 (inernal fragmention) 。

在此, 我们不否认C++为我们提供的内存管理函数的可能比较高效。但是, 仅注意前提假设2, 我们需要点序列存放的方式是向高地址方向增长的, 如果将原始数据和程序的其他创建的数据混杂于同一数据段, 我们不能保证此前提一定成立, 算法的正确性也得不到保证。

3 结点、弧段对象的内存管理

3.1 设计思想

结点、弧段的对象是动态的, 因而要花费相当的时间去创建和销毁 (通过调用new、delete运算符) 。典型的, C++默认的new (delete) 运算符实际是调用C标准库的malloc (free) 函数。不幸的是, 在大多数系统上调用这两个函数都会带来很大的开销。为此我们引入LEDA提供了高效的内存管理机制, 用于创建和销毁所有的结点和弧段对象。

内存管理的基本设计思想是分期清偿调用malloc和free的昂贵系统开销。因此具有如下优点: (1) 内存一次分配以较大的块, 这样避免了频繁调用内存分配符引起的高开销; (2) 被delete释放的内存能在随后被new重用, 也就是说, 管理器提供了垃圾回收机制。

基于此种思想, 内存管理器只用malloc分配固定大小 (例如4kb) 的大的内存块。这些内存块被切割成要求大小的chunks, 并且这些chunks被维持 (maintained) 在一个单链表中。上面陈述的策略在chunk的大小相对远小于块的大小时是高效的。申请较大的内存片断 (常常调用vectors) 是直接映射为对malloc的调用。内存管理器能处理的最大内存chunk的大小在构造函数中指定。对于标准的内存管理器, 此上界设置为255bytes。

所有空内存chunk的链表的头被存储在表free_list[256]中。只要申请需要一片小于256 (sz<256) 的内存, 管理器首先检查相应的表项free_list[sz]是否为空, 如果为不空, 列表的第一个元素被返回, 否则, 他将被分配给新的内存块并按上面的方法分割成特定大小的chunk。释放sz<256的内存片调用的delete运算符被实现为将它插入到free_list[sz]的前端。

下面的例子将证明此内存管理器的效率。

3.2 性能测试

下面我们分别使用C++默认的内存分配符和LEDA内存管理器创建不同规模大小的结点和弧段对象。对每组数据我们分别测试10次, 取其平均值制表如下。

编译器:Visual studio C++8.0。运行时间单位为秒。消耗时间在规模为1000000时产生跃变的原因是物理内存消耗殆尽, 因此此数据不应作为参考。

从表中可以看出, 相同规模的数据LEDA消耗的时间约是C++默认内存分配函数的0.5倍。更直观的表示如图3所示, 从图上可以容易看出LEDA的内存管理器的优势。

*注:CPU:AMD Sempron (tm) 2300+, 1.58GHz, 内存992MB, 操作系统:Microsoft Windows XP Pro

另外, 我们的算法中仅有4中大小不同的数据类型, 上面提到内存管理策略当在chunk的大小相对远小于分配的块的大小时是高效的, 因此, 还可以找出一个最优的分配粒度进一步提升性能, 而不是像我们现在采用的硬编码的方式写入程序。

4 结束语

总的来说, 是算法的特性决定了内存管理的方式。我们的设计并不能创造一般问题的通解, 而是十分有针对性的。原始数据的管理, 侧重于保证算法前提假设的正确性;结点、弧段的内存管理在正确性的前提下, 着重解决性能问题。

经过实践, 证明我们的尝试能有效地提升程序的性能和健壮性。但是, 其中仍存在许多有待今后完善的方面。

摘要:针对一种需要动态维护拓扑信息的GIS叠加分析算法, 有针对性地提出相应的内存管理策略。实践表明能有效提高算法实现层面的效率。

关键词:内存管理,叠加分析,GIS

参考文献

[1]A.S.Tanenbaum, A.S.Woodhull.操作系统:设计与实现 (第2版) [M].王鹏, 尤晋元, 等, 译.北京:电子工业出版社, 2001.

[2]Jeffrey Richter.Windows核心编程[M].王建华, 译.北京:机械工业出版社, 2007.

[3]Bill Blunden.Memory Management:Algorithms and Implementation in C/C++[M].Wordware Publishing.2003.

内存管理系统 篇10

可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。

2 本实验的具体实现

本次实验的具体内容包括:1)建立相关的数据结构,作业控制块、已分配分区及未分配分区;2)实现一个分区分配算法,如最先适应分配算法、最坏或者最优适应分配算法;3)实现一个分区回收算法;4)给定一批作业/进程,选择一个分配或者回收算法,实现分区存储模拟管理;5)设计界面并将所有的模块整合到一起,形成一个完整的系统。

2.1设计所采用的算法

采用最坏适应算法,每次为作业分配内存时,总是把最大的空闲分区和所需要的程序块进行比较,如果该块的大小大于或者等于所需要的内存大小,则从该块中分配出一块内存给程序。

2.2 内存分配与回收所使用的结构体

为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。01

2.3 关于分配留下的内存小碎片问题

当要装入一个作业时,从“空闲分区表”中查找标志为“1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于minsize,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。同时,在已分配区表中找到一个标志为“0”的栏目登记新装人作业所占用分区的起始地址,长度和作业名。若空闲区的大小与作业所需大小的差值大于minsize。则把空闲区分成两部分,一部分用来装入作业,另外一部分仍为空闲区。这时只要修改原空闲区的长度,且把新装人的作业登记到已分配区表中。

2.4 内存的回收

在可变分区方式下回收内存空间时,先检查是否有与归还区相邻的空闲区(上邻空闲区,下邻空闲区)。若有,则将它们合件成一个空闲区。程序实现时,首先将要释放的作业在“内存分配表”中的记录项的标志改为“0”(空栏目),然后检查“空闲区表”中标志为‘1’(未分配)的栏目,查找是否有相邻的空闲区,若有,将之合并,并修改空闲区的起始地址和长度。

3 数据结构

1)块类结构

public class Kuai{

private int start Addr; //块的在内存中的开始位置

private int size; //块的大小

private int state=0; //块的状态,1表示已分配,0表示未分配

private int runprogram; } //表示该快所运行的程序编号

2)分区表结构

Public class Kuai Biao()//块表

{private int memorysize=1000; //系统的内存大小,为1000

private List<Kuai> Kuai List=new Array List<Kuai>(); //分区表

public Kuai Biao()

{ Kuai kuai=new Kuai();kuai.set Runprogram(0);

kuai.set Runprogram(0);

kuai.set Size(1000);

kuai.set Start Addr(0);

this.Kuai List.add(kuai);}}

3)表模型结构

Public class Table Model{Vector<String> cols=; /

Vector<String> cols=null; //初始化表模型的列名

Vector<Vector> rowdata=null; }//某行某列的数据

4 程序算法

本程序的功能模块主要为内存分配和内存回收。首页是一个显示界面,从list中获取数据,将数据加入JTable中,显示出来。首页有两个功能按钮即:内存分配按钮和内存回收按钮。点击每个按钮执行相应的功能模块。当点击内存分配按钮时,会弹出一个对话框,输入待分配内存的大小和指定程序编号,如果输入的内存大小超出最大未分配内存的大小,程序会提示错误信息。如果想回收某个内存块,选定该行,点击回收按钮,执行相应的功能,更新JTable表格,完成相应功能的显示。

4.1 内存分配模块算法

内存的分配采用最坏适应算法(Worst fit)。最坏适应分配算法要扫描整个空闲分区分割给作业使用。该算法要求将所有的空闲分区按其容量以从大到小的顺序形成一空闲分区链,查找时只要看第一个分区是否满足作业要求。在系统分配内存的时候,每次调用分配算法,只需要传递一个待分配内存的大小和所要运行的程序编号,然后通过Util类中的Fen Pei(int size,int prograid)方法从内存表中分配一块内存。Fen Pei(int size,int prograid)方法每次都会将块表中的块按size大小从大到小排序,遍历块表判断该块的状态是否为空闲,如果该块状态为空闲,则从该块中分配出一块内存作为程序运行所需要的内存。如果该块的状态不为空闲,则继续遍历块表(Kuai Biao)中的下一个块内存。

4.2内存回收模块算法

选择回收的内存块,当点击回收内存时,调用public List<Kuai> set Free(int start Addr,List<Kuai> le)方法,首先根据回收区的地址找到此内存块在List集合中的索引位置,然后判断点击的待回收的内存块的状态,若为0,则提示已是空闲状态;若为1,则调用方法Judge.judgement(ku, i) ,此方法根据索引位置和内存块的List集合返回要操作的方法,可以细化成9种情况来判断:1)待回收的内存块没有上块也没有下块内存,则回收后地址为本块地址,大小为本块内存的大小;2)待回收的内存块没有上块,有下块内存,且下块内存为空闲状态,则回收后地址为本块地址,大小为本块大小加下块内存大小;3)待回收的内存块没有上块,有下块内存,且下块内存为占用状态,则回收后地址为本块地址,大小为本块大小;4)待回收的内存块有上块内存,且上块空闲,没有下块,则回收后地址为上块地址,大小为本块大小加下块大小;5)待回收的内存块有上块内存,上块内存占用,没有下块,则回收后地址为本块地址,大小为本块大小;6)待回收的内存块上块和下块都是空闲,则回收后地址为本块地址,大小为本块大小加上块和下块大小;7)待回收的内存块的上块和下块都是占用状态,则回收后地址为本块地址,大小为本块大小;8)待回收的内存块的上块占用,下块空闲,则回收后地址为本块地址,大小为本块大小加下块大小;9)待回收的内存块的上块空闲,下块占用,回收后地址为上块地址,大小为本块大小加上块大小。之后根据返回的操作方法进行对内存块的处理,然后返回一个按内存地址排序的内存块集合。

5 内存分配回收实现部分截图

1)系统内存未分配(如图1所示)。

2)分配内存(如图2所示)。

3) 分配结果(如图3所示)。

4) 在3) 的基础上继续分配两次大小分别为350,150,200,50,170,130的情况(如图4所示)。

5) 释放编号为2和4的编号(如图5所示)。

6) 释放程序3(如图6所示)。。

6 结束语

内存管理系统 篇11

后来在网上瞎逛时,发现可以用Thaiphoon这款软件来修改内存的SPD,心里不免有一些窃喜,能不能通过修改内存的SPD来让它们兼容并且完全工作在400M的频率下呢?于是一项艰难而又惊险的工作开始了

准备工作

下载Thaiphoon 3.0.2.0,用来刷新保存内存的SPD信息和CUP-Z,用于检测内存的工作频率用延时。

修改实战

直接运行Thaiphoon 3.0.2.0可进入主界面,首先选择工具栏中的“EEPROM”选项(如图1),就会看到系统中读取两组内存SPD信息的项目“Read SPD at 50h”、“Read SPD at 51h”,分别对应内存插槽上的“DIMM1”和“DIMM 2”的内存模组;也可以直接点击工具栏的Read图标,选择要读取的SPD信息。在读取内存SPD信息时,首先要确定自己的内存插在哪个DIMM(内存槽)上,千万可别搞错了。这个可根据CPU-Z的检测信息判断,插槽#1代表在第一个DIMM上,即50H。

读取50h的内存信息,也就是笔者的Kingston内存,待内存SPD信息读取完毕后,选择“File/save Dumpas”命令(如图2),输入保存的文件名为Kingston,就可以将其另存为一个以“THP”为后缀的文件了(一会要将这个信息刷入Kingmax内存条中)。然后再读取51h的那一条,保存为Kingmax。这一步很重要,一定要先保存原来的信息,以备刷新失败后好重新刷回来,读取SPD时间大约在10秒钟左右。

分别保存好两个内存的SPD文件后,选择工具栏“File/Load Dump”命令或点击工具栏上的Load图标,调入Kingston内存的SPD文件,选择“EEPROM/FullRew rite”命令或点击工具栏的Write图标,会出现一个写入时的操作选择。系统默认写入是50H DIMM槽,即第一个插槽的内存,由于这里要更新的是第二根插槽上的Kingmax内存,而且第二条内存在51H DIMM槽,因此要手动将50改为51,即写第二条内存。在写入时,一定要确定要写内存所在的DIMM槽,然后手动输入对应的组号。确定后,点击Write按钮,系统将自动将调入的新SPD信息写入到内存SPD芯片中,整个过程大约需要20秒。

刷新完毕,笔者怀着忐忑不安的心情重启电脑后,机器顺利的启动了。系统检测出机器内存总容量为768MB.并且工作在DDR400规格下,心中真是狂喜不已啊。进入桌面后,用CPU-Z检测发现,笔者的Kingmax的内存信息完全变得和Kingston的内存信息一样,包括延时与默认的工作频率(如图3)。后来超频时发现,那条修改了SPD信息的Kingmax内存可以工作在更高的频率下了,可以说了,有质的飞跃。

最后提醒大家,不是每一根内存都能刷新SPD信息,一定要看你的内存有没有这个潜力,还有一定要保证刷新时不能断电,如果刷新过程中断电,就只有拆下SPD芯片用编程器刷写了。

内存数据库中间件系统设计方案 篇12

内存数据库是对计算机内存进行优化的处理,将数据常驻内存中实现全事务处理的数据库系统。目前在国内电信行业已经是普遍使用了,其中主要是TT、Altibase、EXtremeDB。本系统主要是利用Hibernate实现一个内存数据库和客户端的中间件,从而向程序员提供一个基Hibernate的统一接口,方便对HSqlDB进行访问。

1 Hibernate简介

Hibernate是一种新的ORM映射工具,它同时提供了从Java类到数据表的映射和数据查询、恢复等机制,实现数据层对象的持久性。相对于使用JDBC和SQL来手工操作数据库,使用Hibernate可以大大减少操作数据库的工作量,并且Hibernate可以和多种Web服务器以及应用服务器良好地集成。ORM即对象关系映射。它是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。

2 HSqldb简介

HSqldb是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由使用和分发,非常简洁和快速。具有Server模式、进程内模式(In-Process)和内存模式(MemoryOnly)三种。

3 内存数据库中间件系统结构及实现

3.1 系统的总体结构

系统在应用时的分层模型如图1。Application指用于应用程序,Hibernate是JAVA平台向程序员提供的统一的编程接口和平台,再往下一层的Hibernate Data Provider for HSqlDB就是本项目实现的核心部分,它调用下层的HSqlDB数据库接口,作为Hibernate平台中的一部分,向程序员提供针对HSqlDB数据库的操作。本系统中包含一个数据库表转移部件,用于将SQL Server中的数据转存到HSqlDB中,这就使得系统的移植更加方便。

3.2 Hibernate

Data-Provider for HSqlDB Hibernate DataProvider for HSqlDB逻辑上与Hibernate Data Provider for SQL Server等在同一层次。本系统为简化系统复杂度,减少层次以优化性能,直接提供一个面向HSqlDB的数据提供程序。

此数据提供程序使用JAVA语言实现,调用了hsqldb.jar提供的org.hsqldb.jdbcDriver驱动接口,将接口的相关信息包括用户名和密码写入到配置文件中。核心类部分包括Configure,SessionFactory,Session,扩展类部分包括HsqldbCommandBuilder、HsqldbParameter、HsqldbParameterCollection和HsqldbTransaction中的部分接口。数据提供程序最终以HsqldbDataProvider.jar包文件的形式供程序员调用。使用本数据提供程序,程序员可以通过统一的接口,像对SQL Server数据库一样,通过sql语句对HSqlDB数据库进行基本的查询、修改、插入、删除操作。

3.3 数据库表的迁移

数据库表的迁移是数据转换程序提供的数据转换功能,使原来存放在SQL Server数据库中的数据批量转存到HSqlDB数据库中的相同表中,以方便系统的移植。

数据库表的迁移的工作原理是:(1)首先利用Hibernate Data Provider for SQL Server,将SQL Server数据库中的数据提取出来,并转存为XML格式。(2)将生成的XML文件进行格式转换为HSqlDB数据库可以识别的XML文件。(3)把转换好的XML文件导入HSqlDB数据库。经过上述三步,数据转换程序就完成了数据的转移。目前本系统中的数据转换器只能提供单个表中数据的批量转换。要将整个数据库进行移植,需要手工将每个表依次进行转换。

4 性能测试与结论

本系统使用一个简易的JSP网站进行了基本测试工作,在JAVA平台上,利用Hibernate Data Provider for HSqlDB和Hibernate Data Provider for SQL Server,分别对HSqlDB和SQL Server数据库进行了对比测试。

测试中使用的数据库表格式为:persons(name int,age int,address string)。

4.1 查询测试

进行查询操作的测试是,HSqlDB数据库和SQL Server数据库中分别存放好300000条数据。从300000条数据中查询2000条数据的时间:HSqlDB需6.263秒、SQL Server需12.324秒。

4.2 插入测试

分别插入30000条记录时,HSqlDB和SQL Server用时分别为:31.528秒和52.143秒。当插入数据量较少时,HSqlDB的性能并不比SQL Server高。主要是因为SQL Server和Hibernate都有缓存机制,当数据量小时,其缓存可以存放所有数据,因此HSqlDB无法体现其优势。

5 结论

在操作的数据量足够大时(大于磁盘数据库系统的数据缓存),内存数据库HSqlDB与传统的磁盘数据库相比,性能有明显的提升。尤其是在进行只读操作时,性能提升更加明显,通常可以将时间缩短1到2个数量级。数据量较小的情况下,内存数据库的性能提升并不明显。

测试结果显示,内存数据HSqlDB较适合存在大量只读操作的系统,如经典文献储藏网站、各类信息消息的发布查询网站等。

摘要:内存数据库IMDB通过JAVA作为操作数据语言实现的程序可以为数据库事务逻辑处理带来的性能提升。该系统利用当前流行的SSH框架中的Hibernate实现Date Provider for HSqlDB,程序员可以通过相应的接口对HSqlDB进行查询、添加、删除、更新等操作,并在大容量的数据操作时,效果会有明显的提升。

关键词:HSqlDB,JAVA,Hibernate,内存数据库系统

参考文献

上一篇:宣传干部下一篇:全民健身路径工程论文