天天看点

进程通信---管道、消息队列、共享内存

进程通信分为低级通信和高级通信。

低级通信是指进程互斥与同步,包括信号、信号量、管程等。

高级通信方式有管道、消息队列、共享内存以及网络通信中的套接字。

匿名管道PIPE:

管道是连接两个进程的文件,发送进程以字符流的形式将大量信息写入管道,接受进程需要从管道读取数据,利用管道通信时必须保证双方进程都存在。管道是半双工的,只能用于具有亲缘关系的进程。

命名管道FIFO:

不同于匿名管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出。

PIPE是一种非永久性的管道通信机构,当它访问的进程全部终止时,它也将随之被撤消;它也不能用于不同族系的进程之间的通信。而FIFO是一种永久的管道通信机构,它可以弥补PIPE的不足。管道文件被创建后,使用open()将文件进行打开,然后便可对它进行读写操作,通过系统调用write()和read()来实现。通信完毕后,可使用close()将管道文件关闭。

消息队列:

消息队列与命名管道类似,但少了打开和关闭管道方面的复杂性。它是一个消息链表,是一种数据结构,存在于内存中,而不是文件(存在于磁盘上),因此访问速度更快。消息队列提供了一个进程向另一个进程发送一个数据块的方法。而且,每个数据块被认为含有一个类型,接收进程可以独立地接收含有不同类型值的数据块。另外,它独立于进程而存在。

共享内存:

共享内存可以说是最有用的进程间通信方式, 也是最快的 IPC 形式。 两个不同进程 A、 B 共享内存的意思是, 同一块物理内存被映射到进程 A、 B 各自的进程地址空间。 进程 A 可以即时看到进程 B 对共享内存中数据的

更新, 反之亦然。 由于多个进程共享同一块内存区域, 必然需要某种同步机制, 互斥锁和信号量都可以。

------总结

管道是最弱的,只适合有限场景;

消息队列能适合大部分场景,缺点是默认缓冲也比较小,不过这个可以调整,前提是你有管理员权限;

共享内存是最强大的,只是要做互斥

继续阅读