2014-09-29 124 views
-1

我正在學習操作系統概念過程中的進程間通信方法。在Java和C中管道和序列化之間傳輸數據的不同?

我不太瞭解傳輸數據的機制。在管道方法的情況下,將在兩個傳輸字節流的過程之間創建一個管道,對吧?

又如何序列化? 我知道序列化是將對象轉換爲字節流進行傳輸的方法,我們可以在到達目的地時重建對象。

那麼在這種情況下,我們使用Serialzation或Pipe來傳輸數據? 它們之間的優點和缺點是什麼?

任何人都可以向我解釋這些方法的數據傳輸非常深入的機制嗎? Java和C之間的這些機制是不同的? ,還是一樣?

謝謝先進。

+0

你在這裏比較蘋果和橘子。序列化是一種編碼和解碼數據的方式。管道和插座是移動它的方法。它們不具可比性或競爭性。 – EJP 2014-09-30 23:12:52

+0

謝謝EJP,我很困惑這些術語 – xtiger 2014-10-01 07:06:08

回答

3

有兩種基本類型的UNIX/Linux的管道:命名管道和匿名的。

通過「pipe()」系統調用創建一個匿名管道,該管道返回與新創建的管道關聯的兩個文件描述符,一個用於寫入數據,另一個用於讀取數據。當使用「|」連接兩個進程時,shell使用匿名管道將一個進程的標準輸出連接到另一個進程的標準輸入。運營商。

命名管道在文件系統中顯示爲文件,並且可以使用正常的「open()」系統調用打開。

在阻塞模式下(默認),從管道讀取的進程將阻塞,直到數據出現在那裏;作者可以將數據以字節流的形式顯示給讀者。

這裏的重要事實是傳輸的數據是一個字節流。數據的發送者和接收者必須就協議達成一致以確定如何解釋字節。一種典型的方法是序列化。考慮一個32位整數... 4個字節。有些系統在第一個字節(稱爲big-endian)中存儲這些字節的最高有效位,一些存儲第一個字節(小端系統,如x86)中的最低有效位。當通過網絡傳輸這些數據時,這些數據的序列化非常重要,因爲每一端都可能以不同的順序存儲數據。

但即使在同一主機上的兩個進程之間傳輸數據,序列化也會有所幫助。它可以用來封裝對象,以便接收者知道它什麼時候收到了所有東西。例如,對於我們的32位整數,如果接收者不知道它期望一個整數,並獲得3個字節(第4個已被某個調度延遲),它必須知道它在繼續之前需要等待。

這些都不是特定的特定語言,除了某些語言已經構建支持序列化。 Java就是這樣一種語言(請參閱ObjectInputStream和ObjectOutputStream)。如果您試圖在Java和C程序之間移動數據,並且在Java方面想要使用這些類,那麼您需要了解它們所使用的序列化協議。

另一種常見的序列化技術是JSON(JavaScript Object Notation),在C和Java中存在多個好的庫。

1

我真的不明白傳輸數據的機制。在管道方法的情況下,將在兩個傳輸字節流的過程之間創建一個管道,對吧?

命名或匿名管道是一個流,而不是像循環回的套接字連接。實際上在一些操作系統中,它是由相同的驅動程序/庫實現的。

以及如何序列化?

如何完成序列化並不是語言特定的,您可以使用可以在C和Java之間共享的方式序列化數據。

它們之間的優點和缺點是什麼?

有很多形式的序列化,這是一個覆蓋在一個答案太廣泛的話題。你可以做一個完整的論文。

可以解釋一個給我解釋這些方法傳輸數據的很深的機制嗎?

沒有多少吧。的數據塊被複制到存儲器由OS管理和這個緩衝的數據可以由另一個程序(或相同的)

被讀取並且被Java和C之間的不同,這些機制? ,還是一樣?

它們都使用相同的操作系統調用做實際工作。 Java的API爲您隱藏這一事實,使得更多的Java友好的,但它們是相同的。

+0

嗨,彼得,非常感謝您的評論。你能給我一個這兩種方法之間優勢和劣勢的最有代表性的例子嗎? – xtiger 2014-09-29 14:11:02

+0

@xtiger沒有兩種方法甚至2000.我會說,也許有30種常用方法。在速度,兼容性,消息大小,解碼/編碼的簡易性,易於理解等方面具有相對優勢。這些表格中的每一個都可以通過多種方式壓縮和/或加密,儘管通常不在管道上。 – 2014-09-29 14:16:42

相關問題