張 乾
同濟大學軟件學院,上海 201804
共享內存在內存數據庫系統(tǒng)中的應用
張 乾
同濟大學軟件學院,上海 201804
共享內存是進程間通信的重要手段之一,并在實際中得到了廣泛應用。本文將介紹不共享內存的原理和內存數據庫的相關概念,并用內存數據庫給出共享內存的應用實例。
共享內存;內存數據庫;進程通信
計算機硬件的快速發(fā)展帶來了多核技術,這使得并行編程真正得以實現[1]。為了使并行編程模型中的各進程相互協(xié)作,目前有如下幾種技術:信號量、消息隊列、共享內存和socket。信號量是初始值非負的整數值,在信號量上的操作只有兩種:加和減,在操作中要保證信號量一直非負[2]。消息隊列是一個消息鏈表,具有添加消息權限的進程可以向其添加消息,有獲取消息權限的進程可以從其中取得消息。由于消息隊列比信號量的信息更為豐富,所以可以用于更復雜的情況[3]。共享內存技術則是開辟一塊特殊內存區(qū)域,使得不同進程可以共享這塊內存進行讀寫操作,其優(yōu)勢在于通過共享內存進程間可以交換大批量數據。Socket編程是不同機器進程間通信的基本方法,當然也可用于同一機器的進程間通信。
在多任務操作系統(tǒng)中,進程的地址空間是相對獨立的,相互并不影響,就是說相同的一個地址,在不同的進程中,對應有不同的數據。這樣每個進程的地址空間就變大了,而且安全性也提高了。進程的地址空間是虛擬的地址空間,在讀寫內存時,需要內存管理單元(MMU)將虛擬內存映射到實際的物理內存。但是,當進程間需要交換大量數據時,需要多個進程使用同一塊物理內存,而不是每個進程都保留共享數據的一個拷貝。這個功能的實現是通過將不同進程的虛擬內存頁映射到同一個實際內存頁上。不同的操作系統(tǒng)提供了不同的API函數實現共享內存的操作。在linux下主要有有兩個函數:
其中,mmap函數用于創(chuàng)建共享內存,munmap則是取消共享內存的映射。在windows下創(chuàng)建共享內存、解除內存映射則分別用CreateFileMapping和UnmapViewOfFile函數[4]。在.net framework下,沒有API用于內存映射,所以,需要在.net代碼中調用以上所列c函數,完成內存映射。
內存數據庫就是將數據放入內存中直接操作的數據庫,與傳統(tǒng)的數據庫有很大不同,主要在于傳統(tǒng)數據庫的數據主要存在硬盤上,而內存數據庫的數據主要存放于內存中。因為硬盤的io讀寫速度遠慢于cpu和內存讀寫,因此,傳統(tǒng)數據庫在讀寫方面的主要研究點在于盡量減少硬盤的讀寫次數,而內存數據庫的主要研究點在于快速算法、并行操作等保證實時性數據存取方面。
內存數據庫用多進程保證并行操作,這便需要這多個進程共享內存中的數據,而數據庫數據通常是龐大的,因此共享內存在內存數據庫中有很好的應用價值。在內存數據庫中應用共享內存進行數據的加載與共享操作如圖1所示。
圖 1 內存數據庫中共享內存的使用
內存數據庫的數據仍然要存儲于硬盤上,實例所用數據均存儲于一個文件內,文件格式則是程序中既定的。在啟動數據庫時,整個文件將被加載到內存中。加載結束后,后臺讀寫進程啟動。每個進程啟動后,都將用共享內存映射函數將進程地址映射到內存數據庫的數據地址。這樣,這些進程將同時操作一塊內存,而不是每個進程都有一個數據拷貝。至于讀寫的同步問題,數據文件中設置有一個位圖,用來監(jiān)控內存中數據的可用信息。當進程需要讀寫內存數據時,首先將查看位圖,以找出數據可用與否的信息,然后再進行真實讀取。位圖信息的同步則通過信號量來控制。
內存數據庫因為其實時性被用于嵌入式系統(tǒng)、電信計費、股票交易等行業(yè)領域,并取得了良好的效果。內存數據庫的概念出現在20世紀90年代,目前已經有較為成熟的內存數據庫產品產生,如oracle的TimesTen。但是商業(yè)內存數據庫的價格昂貴,而且內存數據庫技術仍在發(fā)展階段。因此,進行內存數據庫的研究和探索還是很有意義的。
[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].北京:機械工 業(yè)出版社,2008:416-459.
TP392
A
1674-6708(2010)28-0213-01