記憶體資料庫研發日誌之一.共用記憶體的詭異問題

來源:互聯網
上載者:User

記憶體資料庫研發日誌之一.共用記憶體的詭異問題

草木瓜

20091211

一、序

資料庫在應用系統中非常複雜的,以Oracle資料庫為例,其複雜度不亞於任何
作業系統。自已動手寫個記憶體資料庫,簡直就是天方夜譚。但這次我非要譚一
譚,開發一個記憶體資料庫。不僅包括後台控制調用部分(考慮用C/C++實現),
而且還準備寫一個WebConsole(考慮用Java實現)。

話還沒說完,這個資料庫功能要簡單而且實用,效能要十分出色,這就是目標,
不是說要把Oracle之類打倒,那反而是癡人說夢,給你30年也搞不定。至於要
多少時間實現,只能說是慢慢來,因為只是打算利用業餘時間。

這方面內容先前其實就有所準備,不過寫了一個非常不象樣的東西,比Oracle
第一個版本還要不象樣!想了下,這個版本,命名為2.0,這個似乎有點象Oracle,
因為它賣給使用者的第一個版本就是2.0。

 

二、共用記憶體

還是與Oracle一樣,使用共用記憶體存放資料庫資料。不過今天測試偶然發現了
一個問題,共用記憶體部分不能共用。問題就在於這個“部分”!

現象描述:

1. 啟動記憶體測試程式

[oracle@windows memdb2] ./testtablevar 123
[ERR] Memory::Open: No such file or directory
  Size,    Max,    Hwm, HeadSize,   Free, Reused,   Used
------------------------------------------------------------
10000000,   2441,      1,    58644,      1,      0,      0
    ID,    Key,   Hash,  Start,    Len,    Pre,   Next
------------------------------------------------------------
     0,      0,      0,      0,      0,      0,      0
     1,      0,      0,      1,   2441,      0,      0
C>
顯示如上內容,這裡其實已經建立了共用記憶體:

2. 查看Linux下共用記憶體資訊

[oracle@windows memdb2] ipcs
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status     
0x00000123 524288     oracle    640        500000000  0      

3. 重新運行程式

[oracle@windows memdb2]$ ./testtablevar 123
  Size,    Max,    Hwm, HeadSize,   Free, Reused,   Used
------------------------------------------------------------
10000000,   2441,      1,    58644,      1,      0,      0
    ID,    Key,   Hash,  Start,    Len,    Pre,   Next
------------------------------------------------------------
     0,      0,      0,      0,      0,      0,      0
     1,      0,      0,      0,      0,      0,      0
C>
注意,部分記憶體資訊丟失。

There  is  currently no intrinsic way for a process to ensure exclusive
access to a  shared  memory  segment.   Asserting  both  IPC_CREAT  and
IPC_EXCL  in  shmflg only ensures (on success) that a new shared memory
segment will be created, it doesn’t imply exclusive access to the  seg-
ment.

奇怪吧~

4.在上面這個介面不退出,直接輸入命令r,p,q

C>r
C>p
    ID,    Key,   Hash,  Start,    Len,    Pre,   Next
------------------------------------------------------------
     0,      0,      0,      0,      0,      0,      0
     1,      0,      0,      1,   2441,      0,      0
C>q

r作用是重新初始化記憶體(不調用任何記憶體Call,只是邏輯處理),p列印資訊
    
5.再重新運行程式

[oracle@windows memdb2]$ ./testtablevar 123
  Size,    Max,    Hwm, HeadSize,   Free, Reused,   Used
------------------------------------------------------------
10000000,   2441,      1,    58644,      1,      0,      0
    ID,    Key,   Hash,  Start,    Len,    Pre,   Next
------------------------------------------------------------
     0,      0,      0,      0,      0,      0,      0
     1,      0,      0,      1,   2441,      0,      0
C>

一切正常,換一個程式查詢記憶體,還是沒問題!

6.問題原因

剛寫到這裡,突然知道問題所在了,就是記憶體位址的問題!每次開啟共用
記憶體時一定要重新設定所有指標!

void TableVar::Open(void * _addr) {

 this->m_pHead = (TTableVarHead *)_addr;

}

須改為

void TableVar::Open(void * _addr) {

 this->m_pHead = (TTableVarHead *)_addr;
 
 this->m_pHead->data = (char *)_addr + this->m_pHead->headsize ;
 this->m_pHead->chain = (TTableVarHeadChain *)( (char *)this->m_pHead + sizeof(TTableVarHead) );
 
}

所有的記憶體表類都所在這個問題!仔細回顧一下,上次不象樣的程式好象
也出過類似問題,及時寫好日誌是個非常好的辦法,害得我搞了半天!

三、後記

研發道路一定布滿荊棘,但問題關鍵在於總結與記錄,去不斷豐富個人的
設計思想,擴充軟體知識面。最終獲得一定遠比一個不象樣的資料庫要多
得多。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.