进程间的通信方式及区别

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.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

猜你喜欢

转载自blog.csdn.net/weixin_38035852/article/details/81358705