2011-03-26 124 views
2

我有一個被稱爲無數次的Linux進程,我需要儘可能快地完成這個過程。在進程調用之間傳輸數據

問題是我必須保持一個調用之間的狀態(加載前一個調用的數據並將其存儲到下一個調用中),而不運行另一個進程/守護進程。

你能建議快速的方法嗎?我知道我可以使用文件進行I/O操作,並希望避免出現這種情況,原因很明顯。應該(可以嗎?)我創建一個命名管道來讀/寫,避免真正的磁盤I/O?

+1

*快*是相對的,您有什麼要求?在很多情況下,將狀態信息存儲在文件中可能是一個適當的解決方案。 – 2011-03-26 22:17:27

回答

2

管道不適用於此。如果您確定文件太慢,請使用posix shared memoryposix message queue - 您應該先測試一下。

在共享內存的情況下,如果程序不存在,程序將使用shm_open()創建段,如果有,則將其打開。你mmap()內存並進行任何更改並退出。當你知道你的程序不會再被調用並且不再需要共享內存時,你只需要shm_unlink()。

使用消息隊列,只需設置隊列。您的程序讀取隊列,進行任何更改,寫入隊列並退出。 Mq_unlink()當你不再需要隊列時。

這兩種方法都具有內核持久性,因此在重新引導時會丟失共享內存和隊列。

0

這聽起來像你有一個過程,不斷執行的東西。

爲什麼不創建一個派生工作線程的工廠? 工廠可以爲工人提供所需的任何信息。

+0

不錯的主意,但我不能在該機器上產生更多的進程。 – liorda 2011-03-27 00:18:42

0

...我可以使用文件進行I/O操作,並希望避免出現明顯的性能問題。

我不知道這些是什麼原因,請...

的Linux在page cache內核內存高速緩存文件。首先寫入現金,換句話說,一個write()系統調用是一個內核調用,它只將用戶空間的數據複製到頁面緩存中(當系統處於壓力下時,該調用稍微複雜一點)。一段時間後pdflush異步將數據寫入磁盤。

文件read()首先檢查頁面緩存以查看數據是否已經在內存中可用以避免讀取磁盤。這意味着如果一個程序將數據寫入文件並且另一個程序讀取它,那麼只要頁面緩存保留這些文件,這兩個程序就可以通過內核內存進行有效的通信。

如果你想避免磁盤完全寫入,也就是說,狀態並不需要跨OS重新啓動被持久化,這些文件可以放在/dev/shm/tmp,這是正常的IN-的掛載點內存文件系統。

+0

我認爲這是一條經驗法則,與RAM訪問相比,磁盤訪問非常緩慢。我不認爲我可以依靠頁面留在緩存之間的流程調用,因爲我不知道什麼和如何發生在此期間。 – liorda 2011-03-27 16:35:52