共享内存在内存数据库系统中的应用
2010-06-13张乾
张 乾
同济大学软件学院,上海 201804
共享内存在内存数据库系统中的应用
张 乾
同济大学软件学院,上海 201804
共享内存是进程间通信的重要手段之一,并在实际中得到了广泛应用。本文将介绍不共享内存的原理和内存数据库的相关概念,并用内存数据库给出共享内存的应用实例。
共享内存;内存数据库;进程通信
0 引言
计算机硬件的快速发展带来了多核技术,这使得并行编程真正得以实现[1]。为了使并行编程模型中的各进程相互协作,目前有如下几种技术:信号量、消息队列、共享内存和socket。信号量是初始值非负的整数值,在信号量上的操作只有两种:加和减,在操作中要保证信号量一直非负[2]。消息队列是一个消息链表,具有添加消息权限的进程可以向其添加消息,有获取消息权限的进程可以从其中取得消息。由于消息队列比信号量的信息更为丰富,所以可以用于更复杂的情况[3]。共享内存技术则是开辟一块特殊内存区域,使得不同进程可以共享这块内存进行读写操作,其优势在于通过共享内存进程间可以交换大批量数据。Socket编程是不同机器进程间通信的基本方法,当然也可用于同一机器的进程间通信。
1 共享内存的原理
在多任务操作系统中,进程的地址空间是相对独立的,相互并不影响,就是说相同的一个地址,在不同的进程中,对应有不同的数据。这样每个进程的地址空间就变大了,而且安全性也提高了。进程的地址空间是虚拟的地址空间,在读写内存时,需要内存管理单元(MMU)将虚拟内存映射到实际的物理内存。但是,当进程间需要交换大量数据时,需要多个进程使用同一块物理内存,而不是每个进程都保留共享数据的一个拷贝。这个功能的实现是通过将不同进程的虚拟内存页映射到同一个实际内存页上。不同的操作系统提供了不同的API函数实现共享内存的操作。在linux下主要有有两个函数:
其中,mmap函数用于创建共享内存,munmap则是取消共享内存的映射。在windows下创建共享内存、解除内存映射则分别用CreateFileMapping和UnmapViewOfFile函数[4]。在.net framework下,没有API用于内存映射,所以,需要在.net代码中调用以上所列c函数,完成内存映射。
2 内存数据库介绍
内存数据库就是将数据放入内存中直接操作的数据库,与传统的数据库有很大不同,主要在于传统数据库的数据主要存在硬盘上,而内存数据库的数据主要存放于内存中。因为硬盘的io读写速度远慢于cpu和内存读写,因此,传统数据库在读写方面的主要研究点在于尽量减少硬盘的读写次数,而内存数据库的主要研究点在于快速算法、并行操作等保证实时性数据存取方面。
3 共享内存在内存数据库系统中的应用实例
内存数据库用多进程保证并行操作,这便需要这多个进程共享内存中的数据,而数据库数据通常是庞大的,因此共享内存在内存数据库中有很好的应用价值。在内存数据库中应用共享内存进行数据的加载与共享操作如图1所示。
图 1 内存数据库中共享内存的使用
内存数据库的数据仍然要存储于硬盘上,实例所用数据均存储于一个文件内,文件格式则是程序中既定的。在启动数据库时,整个文件将被加载到内存中。加载结束后,后台读写进程启动。每个进程启动后,都将用共享内存映射函数将进程地址映射到内存数据库的数据地址。这样,这些进程将同时操作一块内存,而不是每个进程都有一个数据拷贝。至于读写的同步问题,数据文件中设置有一个位图,用来监控内存中数据的可用信息。当进程需要读写内存数据时,首先将查看位图,以找出数据可用与否的信息,然后再进行真实读取。位图信息的同步则通过信号量来控制。
4 结论
内存数据库因为其实时性被用于嵌入式系统、电信计费、股票交易等行业领域,并取得了良好的效果。内存数据库的概念出现在20世纪90年代,目前已经有较为成熟的内存数据库产品产生,如oracle的TimesTen。但是商业内存数据库的价格昂贵,而且内存数据库技术仍在发展阶段。因此,进行内存数据库的研究和探索还是很有意义的。
[1]Dagum L,Menon R.IEEE COMPUTATIONAL SCIENCE & ENGINEERING.CA 94043 USA: IEEE COMPUTER SOC,1998.
[2]S.Rao Kosaraju.LIMITATIONS OF DIJKSTRA’S SEMAPHORE PRIMITIVES AND PETRI NETS[J].ACM SIGOPS Operating Systems Review,1973,7(4):122-126.
[3]William Gropp,Ewing Lusk,Anthony Skjellum.Using MPI:portable parallel programming with the message passing interface[M].The MIT Press,1999:3-11.
[4]Jeffery Richter. Windows 核心编程[M].北京:机械工 业出版社,2008:416-459.
TP392
A
1674-6708(2010)28-0213-01