用画板画的图,可能不那么好看(见谅)
进程间通迅概念
- 进程是一个独立的资源分配单元,不同的进程(这里所说的进程通常是指用户进程)之间的资源是独立的,没有关联,不能再一个进程中直接访问另一个进程的资源。(与线程的区别出来了,同一个进程间的线程可以共享全局变量,如此以来就可以节省很多开销)
- 但是,进程不是孤立的,不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信。
- 任何一个进程中的全局变量再另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,线程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间同行(interProcess Communication)
- 补充点知识:所有进程的内核空间(3G~4G)都是共享的,属于所有进程。 内核空间:内核线性地址空间由所有进程共享,但是只有运行在内核态的才能 访问。 用户可以通过系统调用切换到内核状态,访问内核空间,进程在内 核态时产生的地址都属于内核空间。(这里指内核区映射的物理内存)
- 补充知识2:由内核态与用户态之间切换是很消耗系统资源的
- 补充知识3:线程的用户区的大部分地区都是共享的(同一个进程内)
进程间通信的目的
- 数据传输:一个进程需要将它的数据发送给另一个进程
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(子进程状态 转变要通知父进程)
- 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供互斥提供同步机制
- 进程控制:有些进程希望完全控制另一个进程的执行(GDB调试,GDB控制被调试的进程)。此 时,控制进程希望能够拦截另一个进程的所有陷入的异常,并及时知道它的状态。
Linux进程间通信的方式
注:这里的有些通信方式,会在后面的线程、网络编程中讲到....