2011-03-21 34 views
4

希望我的問題是有道理的:用C 編程,我可以在共享內存段中創建一個哈希表,所以適當權限的任何進程可以訪問鍵/值它? 如果是這樣,我如何指定哈希表創建,我希望它放在SHM? 是否有任何推薦的散列表實現允許這? 非常感謝ç把一個哈希表爲一個共享內存段

+0

你怎麼做你的共享內存?用shm_open和mmap? – 2011-03-21 22:21:26

+0

那麼,還沒有開始,但我打算用shmget,ftok,shmat ... – klayme 2011-03-21 22:32:48

回答

5

關閉我的頭頂,我不知道這樣做的任何庫。

我知道如果您自己編寫或修改現有的庫,那麼您需要做的棘手事情是追蹤並修復任何使用指針的代碼,並將其替換爲使用base + offset的代碼。

該基地將是由共享內存創建/打開功能返回的指針,它將在每個過程中不同。偏移量取代了什麼是指針。當你需要通過偏移量來定位一個值時,你將基礎投射到char*,添加偏移量,然後將其投射到your_type*。類似(bucket_t*)((char*)base + offset)

這是假設你的哈希實現需要指針。如果他們只使用單值桶和沒有值列表,一些不會。

另一個棘手的事情是,你需要自己管理內存。您不必調用malloc(),而是創建自己的函數,也許將其命名爲shm_hash_alloc()。一個快速入門就是在分配內存時只保留一個指針並增加它,而不用費心去釋放它。稍後,您可以使用指針數組(偏移量)來釋放兩種尺寸的各種強度的列表,或者如果您知道對象類型,則可以使用每種類型的列表。在每個空閒塊中,您存儲指向下一個空閒塊的指針,並且您知道它的大小,因爲它在列表中。有更奇特的方法,但你可能不需要它們。

+0

那麼,對於連接到共享內存的每個進程,內存地址或指針會有所不同嗎?這意味着我不能依靠使用指針的內存結構,除非我將它們全部與基地址相關聯......非常繁重的工作。我想我會簡單地創建一個數組並掃描它的所有成員,直到找到我要找的內容。事實上,這只是我想要保留的幾百或幾千個元素。我知道它效率低下。我會考慮一下。謝謝。 – klayme 2011-03-21 23:53:24

1

哈希表只是一個數據結構。只要訪問共享內存的模塊知道該結構如何構建,他們就可以訪問它。只要涉及的所有模塊知道如何讀取它,那麼使用哪種實現並不重要。

把它想象成一份報紙。你創建自己的私人記憶片段 - 這是一個鎮上的本地論文。然後,你想與周圍的所有城鎮分享 - 只要人們說同一種語言並可以閱讀,就可以。沒有特殊的分享語言,只需要每個人都能理解。

你的情況一樣的 - 你可以使用任何哈希表的實現,只要所有線程使用相同的。

+0

謝謝,我明白你說的話。但問題是,我如何實例化哈希表,使其在共享內存中創建?我見過一些HT實現,它只是返回它創建的地址,我應該修改它來分配給定地址的內存嗎?再次感謝。 – klayme 2011-03-21 22:12:31

+0

@klayme - 是的,如果實現自己分配 - 那麼您需要修改它以使用您的預分配內存,或者爲它提供一個您實現的分配器(查看STL模板以獲取如何提供的示例一個通用實現的分配器)。 – littleadv 2011-03-21 22:58:53

3

我上傳的共享存儲器哈希表庫的Linux到SF(libshmht),I與性能主要特徵開發它和讀/寫訪問homegeneous訪問時間。我認爲這是有用的緩存和IPC系統。 還實現讀/寫鎖定以在許多進程之間共享。

http://sourceforge.net/projects/libshmht/

+1

偉大的圖書館。你有沒有將這個庫部署到產品環境? (我認爲它的穩定性)p.s. shmht_insert()的'key_size'類型在shmht.c中是'unsigned int',而在shmht.h中是'size_t',這引起了我的編譯器的抱怨... – felix021 2014-04-16 13:21:59

+0

嗨felix021。是的,它被部署到高負載環境中,沒有任何問題像openssl進程間緩存。感謝編譯錯誤,它是爲gcc編譯的,可能會對其他編譯器造成一些問題。我會盡快解決它。 – 2014-04-19 18:21:31

+1

僅供參考我修正了您在修訂版11的評論中指出的編譯錯誤。 – 2014-04-19 18:48:01