进程间通信(IPC):操作系统为用户提供的几种进程间的通信方式
进程之间具有独立性:一个进程是不能修改另一个进程内存中的数据的,也不能去读另一个进程的虚拟地址空间中的内容。而且用户的程序也不能访问内核空间。
每个进程都有自己的一份独立的虚拟地址空间。一个进程只能访问自己的虚拟地址空间。
虚拟地址空间有个非常大的好处,那就是使进程间互不干扰,相互独立。
但是,进程的独立性也有一个问题,如果多个进程之间想相互沟通,此时却无法直接进行通信,因此需要操作系统提供一些公共的媒介来让多个进程都能通过访问这个媒介进行通信。
进程间通信是建立在进程独立的前提上的。让多个进程能有一块公共访问的资源,譬如说,内存、文件之类的东西就可以了。
因为进程间通信的场景不同,因此操作系统提供了几种不同的进程间通信方式:
1、管道:用于数据传输,最古老的通信方式。并且是半双工(可以选择方向的单向传输,我可以给你发,你也可以给我发,但是确定方向之后就只能这么发了。还有全双工通信、单工通信:只能她给他发,已经确定方向的单向通信)的通信方式。
管道的本质是操作系统在内核中创建出的一块内存,只要多个进程都能访问到这块内存就可以实现通信了。并且通过io接口实现管道这块内存的操作,因为Linux下一切皆文件。
(1) 匿名管道:这块内存没有名字
(2) 命名管道:这块内存是有名字的
2、System V(阿拉伯数字5) IPC,一套比较古老的标准。
(1) System V消息队列:用于数据传输,了解一下原理就行,因为它的限制很多,现在基本上已经没人用了。
(2) System V共享内存:用于数据共享。
(3) System V信号量:某种程度上的进程控制,在接下来的博客中着重讲解POSIX的信号量,因为SV的信号量比较复杂,用起来比较难,接口也比较恶心。
3、POSIX IPC,定制这套标准是为了跨平台。
(1)消息队列
(2)共享内存
(3)信号量
(4)互斥量
(5)条件变量
(6)读写锁
System V(也是UNIX的一个版本,详见Linux发展史)和POSIX是两套不同的标准
进程间通信都有哪些方式?
除了上面那些,还有其他的方式,其实,只要有一个公共资源能够被多个进程访问到,那就可以完成进程间通信。比如说给一个普通的文件,多个进程是可以打开同一个文件的,借助这个普通文件也能完成进程间通信,只不过不够典型,在此不做过多讨论。