1.无名管道(pipe)
特点:最古老的IPC(进程间通信方式)
1.只能用于有血缘关系的进程之间信息传递
2.半双工的信息传递,同一时间只能读或者写,一个方向。固定的读端和写端。
3.独立于文件系统之外,不属于文件系统,特别的方式存在于内存中。
2.命名管道(FIFO)
1.克服了无名管道的只能有血缘关系进程之间的通信,无关进程之间也可以通信。
2.以一种特殊的文件格式存在于文件系统之中,有路径名与之相关联。
3.消息队列(Message Queue)
是一种消息的链接表,存放在操作系统内核中,每一个消息队列都有一个标识符来标识。
特点:
1.是一种面向记录的通信方式,具有特定的格式和消息优先级。
2.支持查询方式获取消息,不一定只是先进先出的对消息的存取,可以针对消息类型进行读取。
3.消息队列是独立于发送端和接收端进程,进程终止时,消息队列和其中的消息也不会消失。
4.信号量(semaphore)
不同于以上的进程间通信方式,是一种用于进程之间同步和互斥的方式,无法直接用于进程之间的数据传递。
1.主要用于进程之间的同步和互斥,结合共享内存可以实现进程之间的数据交换。
2.依靠的是操作系统PV 操作。 对信号量+1 -1
3.也可以是加减正整数的信号量。
java中的semaphore:
package concurrent.semaphore;
Concurrent包下的一个类。
构造函数
public Semaphore(int permits);
package concurrent.semaphore;
import java.util.concurrent.Semaphore;
public class Driver {
// 控制线程的数目为1,也就是单线程
private Semaphore semaphore = new Semaphore(1);
public void driveCar() {
try {
// 从信号量中获取一个允许机会
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " start at " + System.currentTimeMillis());
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + " stop at " + System.currentTimeMillis());
// 释放允许,将占有的信号量归还
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
有两个方法,arquire()和release() 分别表示允许得到一个信号量 和释放一个信号量。
permit表示同时有多少个线程可以执行。
5.信号
是一种操作系统通知进程某件事情已经发生的方式。
由信号处理机发送,不同于信号量依靠PV操作。 也可以用于进程之间的同步
6.共享内存
存在于内存中,由多个进程共享的一块内存空间。
1.是最快的进程之间数据传递的方式,不经过内核,直接数据传递。
2.由于多个进程同时操作,需要同步机制来控制数据存取,一般结合信号量使用。
7.Socket
不同主机之间的进程之间的数据通信
五种通讯方式总结
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存