进程之间的通讯方式?

进程之间的通讯方法?

能够介绍一下进程的通讯方法有哪些吗?

好的,面试官
咱们常说的进程之间的通讯方法有 7 种,分别是匿名管道、命名管道、音讯行列、同享内存、信号量、信号以及Socket。
那下面我就详细介绍一下每一种通讯方法的异同吧,如果在我介绍的过程中,你有任何问题想问我,都能够打断我的。
第一种,匿名管道
顾名思义,它是一种没有姓名的管道,但它的确咱们最经常接触到的,
比方咱们在 linux 体系在运用的`ps auxf | grep nignx `指令,其实中间的竖线“|”便是匿名管道,
由于是匿名,所以该管道只能用于具有亲缘联系的进程(父子、兄弟)之间,而无法被其他进程所运用,
该指令履行完后,即被毁掉。
它的数据是只能单向传输,在创建匿名管道的时分底层实际上是调用了 pipe() 体系调用,
它会返回两个文件描述符,分别用作管道的读取端和写入端;这时分 fork 出子进程,所以父子进程都一起具有了两个文件描述符,即读取端和写入段;可是又由于管道是单向传输的,
所以父子进程需求各封闭一端,比方父进程封闭读端,则子进程需求封闭写端。
刚有介绍了匿名管道在父子进程间通讯,那么兄弟进程间的呢?
其实这个咱们也经常接触到的,便是当咱们在 shell 中履行 `ps auxf | grep nignx `指令的时分,
实际上是兄弟进程在经过匿名管道在通讯,
由于指令是在 shell 上履行的,所以 fork 的两个进程都是 shell 进程的子进程。
接着,第二种,命名管道
命名管道是由姓名的,它经过 mkfifo 来创建,会在体系中实际创建一个管道文件,对各进程可见;
可是命名管道是阻塞写的,一旦往管道里写入数据,写端阻塞,只要读取了数据,才干继续写入。
所谓管道便是内核里边的一串缓存,经过管道传输的数据是无格局的流且巨细受限。
综上,能够看到无论是匿名管道还是命名管道,它们的通讯效率都不高,不适合进程间的频频通讯。
关于管道的这个问题,咱们的第三种通讯方法——音讯行列就能够处理。
音讯行列实际上是内核中的一个音讯链表,进程 A 只需求把音讯放进链表中即可返回,进程 B 在有需求的时分就去取即可。
要满足这一点,就要求进程们放的音讯不是随便的,它需求发送方和接收方提早约定好的。
所以呢,音讯行列会有通讯不及时的缺陷,并且它的每个音讯体都是有一定的巨细限制的,
这就阐明它是不适合大数据传输的。
当然啦,音讯行列最大的一个缺陷便是在通讯的过程中,存在用户态与内核态之间的数据复制开销。
为了处理数据复制的开销,咱们就来到了第四种通讯方法——同享内存!
其实同享内存也很好了解,
原来进程间是隔离的,采用了同享内存之后,会将一块虚拟地址空间映射到相同的物理内存中,
一个进程往里边写数据,另一个进程立马就能够感知到了,不需求拷来拷去的。
然而同享内存虽然方便了,可是也引入来了新的问题,
假如两个进程一起往一个地方写数据怎么办?这就出现了多进程竞争同享资源的问题,
为了处理这个问题,就得引出第五种通讯方法了——信号量。
其实信号量,和咱们平常接触到的锁很像,它标志着同享资源有多少,即有多少个进程能够一起占用,
这里边便是一堆的 PV 操作了,进程只要 P 成功了,才干够继续操作。
以上介绍的都是进程通讯的正常状况,那当然也有一些异常状况了,
异常状况就需求用到第六种通讯方法——信号了,比方中止信号,Ctrl+C
上面介绍的都是同一主机的进程间通讯,如果是不同网络的不同主机间的进程通讯就需求用到第七种通讯方法—— socket 了
socket 的通讯方法也有多种 TCPUDP、本地socket。
我的答复就这些,感谢面试官的聆听。