2010-02-18 23 views
2

使用Java IO,似乎分叉一個新進程給了進程B更好的能力,以便讀取由進程A寫入的數據,而不是如果線程A寫入線程B正嘗試讀取的文件(在相同的過程)。什麼併發與java文件系統一起工作?

看起來規則與內存模型沒有可比性。那麼基於文件的併發是如何工作的呢?參考將不勝感激。

+0

你是怎麼來到結論「派生一個新的進程給出一個進程B讀取數據的能力更好」?它在所有操作系統中是否一致? – 2010-02-18 22:41:25

+0

它在Linux 2.6.32上以這種方式工作,並有相當大的幅度。這是我所知道的一切。 – krosenvold 2010-02-18 22:45:06

+2

您能否提供一個演示此差異的示例程序? – 2010-02-18 22:49:49

回答

4

這樣結合的任何觀察到是操作系統特異性的,並且可以特定於不同版本的操作系統(內核)的。你在這裏碰到的可能與操作系統實現線程的方式和線程調度有關。 Java平臺對於這類事情的調優幾乎沒有提供任何幫助。

IMO,如果你需要更好的性能,你可能不應該使用一個文件作爲同一個JVM中兩個線程之間的數據傳輸通道。對應用程序進行編碼以檢測線程是否在同一個JVM中共同使用並使用(比如說)Java Pipe流。

0

也許它可能與線程和進程阻塞有關。

當進程需要資源(寫入/讀取文件)時,它會阻塞S.O.滿足要求並返回過程。

如果你不使用hyperthreading的過程與兩個線程將阻止兩個線程fullfilling的任務,每個任務之一。但是如果你將它們分開,也許是S.O.可以優化訪問並更好地平滑讀/寫。

(只是猜測:)

相關問題