管道通信
- 本质
这是典型进程间数据通信的方法。管道通信的本质是内存映射,也就是说,在管道两端的两个进程,共同使用一个内存区域,内存管理器把这片内存映射到这两个进程地址空间。管道的本质只是对这个共享的内存进行了访问控制。使其适用于具体快速开发。
- 通信
进程间的数据通信,传递的是数据,不能只传一个指针,因为每个进程都有自己独有的地址空间,例如A进程的指针0x12345678,它在B进程中所指向的内存就不同了。管道可以传递任何数据,对于管道来说,传的是一个字节串。无论是什么类型的数据,要传递,最后总是需要格式化成字节串 .
- 补充
一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端。管道是一种特殊的文件,它不属于某一种文件系统,而是一种独立的文件系统,有其自己的数据结构。根据管道的适用范围将其分为:无名管道和命名管道。
共享内存
- 本质
同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
- 实现
在一个进程内创建内存映射,却能够在其他都个进程中使用。这些进程共享的是物理存储器的同一个页面,在把这些物理内存映射到虚拟内存时各个进程的虚拟地址并不一定相同。当一个进程将数据写入共享内存时,其他进程可以立即获取数据变更情况。
- 特点
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建 立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回 文件的。因此,采用共享内存的通信方式效率是非常高的。