1、什么是IPC?
IPC:interprocess communication-进程间通信
Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程间不能互相访问,要交换数据必须通过内核,在内核中开辟一块缓存区,进程1把数据从用户空间拷贝到内存缓冲区,进程2再从内存缓冲区中把数据读走,内核提供的这种机制称为进程间通信(IPC)。
2、进程间通信的实质?
不同的两个程序虽然0-4G内存地址空间不同,但两个程序的内核区在物理内存上是同一块。共享(物理内存中)同一内核区。——两个程序打开同一个文件,系统会在内核区维护打开文件的结构体,两个程序打开的是同一个结构体。
3、有哪些常用的进程间通信方法?
①匿名管道(PIPE)和有名管道(FIFO):最简单
②信号(SIGNAL):系统的开销最小
③共享映射区(MMAP):可以在无血缘关系的进程间通信
④本地套接字(SOCKET):最稳定(但是比较复杂)
4、为什么要进行进程间通信呢?
两个进程间要传送数据。在接触IPC前,我们可以用文件来实现进程间通信,两个进程共享同一个打开的文件结构体。A进程写数据到文件中,B进程也打开同一个文件,内核会在内核区域维护一个打开文件的结构体,所以B可以从这个文件中读数据,但是A和B的0-4G进程地址空间是不一样的。之所以能用文件完成上面的通信,依赖于A和B他们的内核区在物理内存上是同一块。
5、IPC方法比较
pipe-优点:实现简单;缺点:单向通信,只能用于有血缘关系进程间。
fifo-优点:可以在非血缘关系进程间。
信号-优点:开销小。
共享内存-优点:可以用于非血缘关系进程间;缺点:比较复杂。
本地套接字-优点:稳定性好;缺点:实现复杂。
共享内存和fifo的区别:在于数据是否可以反复读取;fifo是用队列实现的,不能反复读取;共享内存是Linux内核借助缓冲区,通过内存来实现,可以反复读取。