2013-02-25 34 views
0

我有以下問題:如何mmap()隊列?

我已經創建了一個隊列。元素(malloc)的添加由main()函數完成,我創建了一個線程,它將處理元素/數據並釋放它們。 這是一個連續的過程,它會一直持續到我殺死過程。

現在,如果我殺死了進程,隊列中的數據將會丟失,所以我正在考慮在其上實現mmap()。因此,隊列也存儲在一個常規的文件,當我重新啓動過程中,數據將被重新加載到內存中,以供線程進一步處理...

由於我是malloc'ing和free'ing內存,我猜想mmapped文件的大小會不斷增大或減小。

現在是可以實現或應該考慮其他選項?

謝謝。

EDIT1:我可以使用lseek或ftruncate()來調整文件大小嗎?

回答

0

你當然可以把隊列(或任何其他數據結構)到mmap()版內存而不是堆內存,但你會在運行,你必須克服幾個問題:

  • 你將不得不自己完成對應於mmap() ed文件的內存塊中的所有內存管理。除非你的隊列數據結構是一個單一的內存塊,否則它可能具有可以創建,刪除和重定位的節點和指針。使用堆內存,您可以將分配和釋放小塊內存的任務委託給malloc()free(),包括重用已釋放的內存以供數據結構中的新節點使用。在你的mmap() ed文件中,你將不得不自己做所有這些。

  • 您將無法在您的mmap() ed塊內使用指針,只能從塊的起始位置開始偏移。這是因爲如果塊被分離並在另一個進程中重新連接,它可能不會在相同的內存地址。由於數據結構訪問是使用指針完成的,因此您將不斷將偏移量轉換爲指針,然後通過添加或減去mmap()塊的基址來開銷。

  • 如果您希望能夠在第一個進程被終止之後通過在另一個進程中重新掛接該塊來恢復,那麼必須爲在第一個進程在關鍵部分中死亡的情況做好準備同時數據結構的一個或多個不變量被臨時侵犯。換句話說,你可能會重新附加一個不一致的數據結構。爲了完全正確地支持這一點,您必須非常小心您在數據結構上執行的各種突變。

總而言之,我向你推薦的是它不值得。您應該使用基於堆內存的快速,高效且易於使用的數據結構,並且偶爾會將序列化快照保存到常規文件中。如果您必須接收,請從上次已知的良好快照中恢復。