原文来自 《v3.0-JavaGuide 面试题突击版》

进程间的通信方式

  1. 管道/匿名管道(Plpes)
  2. 有名管道(Names Pipes)
  3. 信号(Signal)
  4. 消息队列(Message Queuing)
  5. 信号量(Semapores)
  6. 共享内存(Shared memory)
  7. 套接字(Sockets)

Untitled

⾯试官 :进程间的通信常⻅的的有哪⼏种⽅式呢?

:⼤概有 7 种常⻅的进程间的通信⽅式。

下⾯这部分总结参考了:《进程间通信 IPC (InterProcess Communication)》 这篇⽂章,推荐阅读,总结的⾮常不错。

  1. 管道/匿名管道(Pipes):用于具有亲缘关系的父子进程或者兄弟进程之间的通信。
  2. 有名管道(Names Pipes):匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本地任意两个进程通信。
  3. 信号(Signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
  4. 消息队列(Message Queuing):消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  5. 信号量(Semaphores):信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
  6. 共享内存(Shared memeory):使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
  7. 套接字(Sockets):此方法主要用于客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。