希望我的問題是有道理的:用C 編程,我可以在共享內存段中創建一個哈希表,所以適當權限的任何進程可以訪問鍵/值它? 如果是這樣,我如何指定哈希表創建,我希望它放在SHM? 是否有任何推薦的散列表實現允許這? 非常感謝ç把一個哈希表爲一個共享內存段
回答
關閉我的頭頂,我不知道這樣做的任何庫。
我知道如果您自己編寫或修改現有的庫,那麼您需要做的棘手事情是追蹤並修復任何使用指針的代碼,並將其替換爲使用base + offset的代碼。
該基地將是由共享內存創建/打開功能返回的指針,它將在每個過程中不同。偏移量取代了什麼是指針。當你需要通過偏移量來定位一個值時,你將基礎投射到char*
,添加偏移量,然後將其投射到your_type*
。類似(bucket_t*)((char*)base + offset)
。
這是假設你的哈希實現需要指針。如果他們只使用單值桶和沒有值列表,一些不會。
另一個棘手的事情是,你需要自己管理內存。您不必調用malloc(),而是創建自己的函數,也許將其命名爲shm_hash_alloc()。一個快速入門就是在分配內存時只保留一個指針並增加它,而不用費心去釋放它。稍後,您可以使用指針數組(偏移量)來釋放兩種尺寸的各種強度的列表,或者如果您知道對象類型,則可以使用每種類型的列表。在每個空閒塊中,您存儲指向下一個空閒塊的指針,並且您知道它的大小,因爲它在列表中。有更奇特的方法,但你可能不需要它們。
那麼,對於連接到共享內存的每個進程,內存地址或指針會有所不同嗎?這意味着我不能依靠使用指針的內存結構,除非我將它們全部與基地址相關聯......非常繁重的工作。我想我會簡單地創建一個數組並掃描它的所有成員,直到找到我要找的內容。事實上,這只是我想要保留的幾百或幾千個元素。我知道它效率低下。我會考慮一下。謝謝。 – klayme 2011-03-21 23:53:24
哈希表只是一個數據結構。只要訪問共享內存的模塊知道該結構如何構建,他們就可以訪問它。只要涉及的所有模塊知道如何讀取它,那麼使用哪種實現並不重要。
把它想象成一份報紙。你創建自己的私人記憶片段 - 這是一個鎮上的本地論文。然後,你想與周圍的所有城鎮分享 - 只要人們說同一種語言並可以閱讀,就可以。沒有特殊的分享語言,只需要每個人都能理解。
你的情況一樣的 - 你可以使用任何哈希表的實現,只要所有線程使用相同的。
我上傳的共享存儲器哈希表庫的Linux到SF(libshmht),I與性能主要特徵開發它和讀/寫訪問homegeneous訪問時間。我認爲這是有用的緩存和IPC系統。 還實現讀/寫鎖定以在許多進程之間共享。
偉大的圖書館。你有沒有將這個庫部署到產品環境? (我認爲它的穩定性)p.s. shmht_insert()的'key_size'類型在shmht.c中是'unsigned int',而在shmht.h中是'size_t',這引起了我的編譯器的抱怨... – felix021 2014-04-16 13:21:59
嗨felix021。是的,它被部署到高負載環境中,沒有任何問題像openssl進程間緩存。感謝編譯錯誤,它是爲gcc編譯的,可能會對其他編譯器造成一些問題。我會盡快解決它。 – 2014-04-19 18:21:31
僅供參考我修正了您在修訂版11的評論中指出的編譯錯誤。 – 2014-04-19 18:48:01
- 1. 尋找一個Perl模塊將哈希結構存儲在共享內存中
- 2. 多個子哈希出一個哈希
- 3. 從一個進程創建多個共享內存段
- 4. 保存哈希映射共享偏好
- 5. ç共享內存使用fork()的
- 6. 帕姆共享哈希
- 7. 共享內存段
- 8. 製作一個哈希與哈希
- 9. 父進程和子進程共享一個IPC共享內存
- 10. 將字段添加到一個哈希
- 11. 添加一個哈希到一個ActiveRecord哈希
- 12. 使用C++將哈希表複製到另一個哈希表
- 13. 共享內存段vs共享內存段
- 14. perl使用哈希過濾另一個哈希內容
- 15. 我們如何在兩個不同的內核模塊之間共享一個哈希表
- 16. 參考哈希鍵的鏈哈希一個Perl哈希
- 17. 哈希表 - 內存不足
- 18. 從哈希列表中創建一個多級別哈希
- 19. 轉換紅寶石陣列哈希爲一個哈希
- 20. 財產在哈希表2個物體的進入一個新的哈希表
- 21. 映射到一個哈希
- 22. 獲取一個Perl哈希
- 23. 設計一個隊列爲共享內存
- 24. XML解析到一個哈希表
- 25. 發送一個哈希表到Webservice
- 26. 如何從一個哈希表
- 27. 爪哇 - 經歷一個哈希表
- 28. 這裏需要一個哈希表嗎?
- 29. 搜索一個完整的哈希表
- 30. 程序創建一個哈希表
你怎麼做你的共享內存?用shm_open和mmap? – 2011-03-21 22:21:26
那麼,還沒有開始,但我打算用shmget,ftok,shmat ... – klayme 2011-03-21 22:32:48