共享内存在内存数据库系统中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
共享内存在内存数据库系统中的应用
摘要共享内存是进程间通信的重要手段之一,并在实际中得到了广泛应用。本文将介绍不共享内存的原理和内存数据库的相关概念,并用内存数据库给出共享内存的应用实例。
关键词共享内存;内存数据库;进程通信
中图分类号tp392 文献标识码a 文章编号
1674-6708(2010)28-021 3—01
引言
计算机硬件的快速发展带来了多核技术,这使得并行编程真正得以实现。为了使并行编程模型中的各进程相互协作,目前有如下几种技术:信号量、消息队列、共享内存和socket。信号量是初始值非负的整数值,在信号量上的操作只有两种:加和减。在操作中要保证信号量一直非负。消息队列是一个消息链表,具有添加消息权限的进程可以向其添加消息,有获取消息权限的进程可以从其中取得消息。由于消息队列比信号量的信息更为丰富,所以可以用于更复杂的情况。共享内存技术则是开辟一块特殊内存区域,使得不同进程可以共享这块内存进行读写操作。其优势在于通过共享内存进程间可以交换大批量数据。socket编程是不同机器进程间通信的基本方法,当然也可用于同一机器的进程间通信。
1 共事内存的原理
在多任务操作系统中,进程的地址空间是相对独立的,相互并不影响,就是说相同的一个地址,在不同的进程中,对应有不同的数
据。这样每个进程的地址空间就变大了,而且安全性也提高了。进程的地址空间是虚拟的地址空间,在读写内存时,需要内存管理单
元(mmu)将虚拟内存映射到实际的物理内存。但是,当进程间需要交换大量数据时,需要多个进程使用同一块物理内存,而不是每个进
程都保留共享数据的一个拷贝。这个功能的实现是通过将不同进程的虚拟内存页映射到同一个实际内存页上。不同的操作系统提供了不同的api函数实现共享内存的操作。在linux下主要有有两个函数:
void’mmap(void*start,size_t length,im pmt,int flags,int fd,off_toffset);
int munmap(vold*start,size_t lensth)
其中,mmap函数用于创建共享内存,munmap则是取消共享内存的映射。在windows下创建共享内存、解除内存映射则分别用createfilemapping和unrrmpviewoffile函数[4]。
在,netframework下,没有api用于内存映射,所以,需要在,net代码中调用以上所列c函数,完成内存映射。
2 内存数据库介绍
内存数据库就是将数据放入内存中直接操作的数据库,与传统的数据库有很大不同,主要在于传统数据库的数据主要存在硬盘上,
而内存数据库的数据主要存放于内存中。因为硬盘的i0读写速度远慢于cpu和内存读写,因此,传统数据库在读写方面的主要研究点在于尽量减少硬盘的读写次数,而内存数据库的主要研究点在于快
速算法、并行操作等保证实时陛数据存取方面。
3 共事内存在内存数据库系统中的应用实例
内存数据库用多进程保证并行操作,这便需要这多个进程共享内存中的数据。而数据库数据通常是庞大的,因此共享内存在内存数据库中有很好的应用价值。在内存数据库中应用共享内存进行数据的加载与共享操作如图1所示。
内存数据库的数据仍然要存储于硬盘上,实例所用数据均存储于一个文件内,文件格式则是程序中既定的。在启动数据库时,整个文件将被加藏到内存中。加载结束后,后台读写进程启动。每个进程启动后,都将用共享内存映射函数将进程地址映射到内存数据库的数据地址。这样,这些进程将同时操作一块内存,而不是每个进程都有一个数据拷贝。至于读写的同步问题。数据文件中设置有一个位图,用来监控内存中数据的可用信息。当进程需要读写内存数据时,首先将查看位图,以我出数据可用与否的信息,然后再进行真实读取。位图信息的同步则通过信号量来控制。
4 结论
内存数据库因为其实时性被用于嵌入式系统、电信计费、股票交易等行业领域,并取得了良好的效果。内存数据库的概念出现在20世纪90年代,目前已经有较为成熟的内存数据库产品产生,如oracle的timesten。但是商业内存数据库的价格昂贵,而且内存数据库技术仍在发展阶段。因此,进行内存数据库的研究和探索还是
很有意义的。