在Java和C中管道和序列化之间传输数据的不同?

在Java和C中管道和序列化之间传输数据的不同?

问题描述:

我正在学习操作系统概念过程中的进程间通信方法。在Java和C中管道和序列化之间传输数据的不同?

我不太了解传输数据的机制。在管道方法的情况下,将在两个传输字节流的过程之间创建一个管道,对吧?

又如何序列化? 我知道序列化是将对象转换为字节流进行传输的方法,我们可以在到达目的地时重建对象。

那么在这种情况下,我们使用Serialzation或Pipe来传输数据? 它们之间的优点和缺点是什么?

任何人都可以向我解释这些方法的数据传输非常深入的机制吗? Java和C之间的这些机制是不同的? ,还是一样?

谢谢先进。

+0

你在这里比较苹果和橘子。序列化是一种编码和解码数据的方式。管道和插座是移动它的方法。它们不具可比性或竞争性。 – EJP 2014-09-30 23:12:52

+0

谢谢EJP,我很困惑这些术语 – xtiger 2014-10-01 07:06:08

有两种基本类型的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中存在多个好的库。

我真的不明白传输数据的机制。在管道方法的情况下,将在两个传输字节流的过程之间创建一个管道,对吧?

命名或匿名管道是一个流,而不是像循环回的套接字连接。实际上在一些操作系统中,它是由相同的驱动程序/库实现的。

以及如何序列化?

如何完成序列化并不是语言特定的,您可以使用可以在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