进程通信

1.(无名)管道

半双工,即不能同时在两个方向上传输数据。有的系统可能支持全双工。

只能在父子进程间。经典的形式就是管道由父进程创建,进程fork子进程之后,就可以在父子进程之间使用了。

2.命名管道(FIFO)

不相关的进程也能够进行数据交换。

3.消息队列

消息队列,就是一个消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。

消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序,而是可以根据自定义条件接收特定类型的消息。

可以把消息看做一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程可以从消息队列中读取消息。

4.信号量

信号量是一个计数器,它主要用在多个进程需要对共享数据进行访问的时候。考虑这一的情况,不能同时有两个进程对同一数据进行访问,那么借助信号量就可以完成这样的事情。

它的主要流程如下:

  1. 检查控制该资源的信号量

  2. 如果信号量值大于0,则资源可用,并且将其减1,表示当前已被使用

  3. 如果信号量值为0,则进程休眠直至信号量值大于0

也就是说,它实际上是提供了一个不同进程或者进程的不同线程之间访问同步的手段。

5.共享内存

共享内存允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取错做读出,从而实现了进程间的通信。

采用共享内存进行通信的一个主要好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,对于像管道和消息队里等通信方式,则需要再内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次:一次从输入文件到共享内存区,另一次从共享内存到输出文件。

一般而言,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时在重新建立共享内存区域;而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件,因此,采用共享内存的通信方式效率非常高。

6.套接字Socket:

套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同计算机间的进程通信。

7.信号 ( sinal )

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生

原文链接:https://blog.csdn.net/hyb612/article/details/89629189

原文链接:https://blog.csdn.net/zhaohong_bo/article/details/89552188

你可能感兴趣的:(进程通信)