进程间通信的方式
管道:
-
无名管道
-
无名管道特点:
-
无名管道是一种特殊的文件,这种文件只存在于内存中。
-
无名管道只能用于父子进程或兄弟进程之间,必须用于具有亲缘关系的进程间的通信。
-
无名管道只能由一端向另一端发送数据,是半双工方式,如果双方需要同时收发数据需要两个管道。
-
-
- 流管道:
-
-
流道特点:
-
可以双向传输。
-
-
-
有名管道:
-
有名管道特点:
-
有名管道是FIFO文件,存在于文件系统中,可以通过文件路径名来指出。
-
有名管道可以在不具有亲缘关系的进程间进行通信。
- 半双工
-
-
信号:
信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还 可以发送信号给进程本身。
消息队列:
消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的 进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。
消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺限。
共享内存:
进程可以将同一段共享内存连接到它们自己的地址空间,所有进程都可以访问共享内存中的地址,如果某个进程向共享内存内写入数据,所做的改动将立即影响到可以访问该共享内存的其他所有进程。
共享内存的方式像极了多线程中线程对全局变量的访问,大家都对等地有权去修改这块内存的值,这就导致在多进程并发下,最终结果是不可预期的。所以对这块临界区的访问需要通过信号量来进行进程同步。
但共享内存的优势也很明显,首先可以通过共享内存进行通信的进程不需要像无名管道一样需要通信的进程间有亲缘关系。其次内存共享的速度快,不存在读取文件、消息传递等过程,只需要到相应映射到的内存地址直接读写数据即可。
共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
信号量:
在提到共享内存方式时也提到,进程共享内存和多线程共享全局变量非常相似。所以在使用内存共享的方式是也需要通过信号量来完成进程间同步。
多线程同步的信号量是POSIX信号量, 而在进程里使用SYSTEM V信号量。
主要作为进程间以及同一进程不同线程之间的同步手段。
套接字:
套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。