【Linux系统与网络编程】06:进程间通信
进程间通信
进程地址空间相互独立:
Linux环境下进程地址空间相互独立,每个进程各自有不同的用户地址空间。
任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,如果要交换数据就必须通过内核,
在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区中把数据读走,内核提供的这种机制称为进程间通信IPC,
进程间通信方式
进程间通信的方式有5种:
- 消息传递:
- 管道pipe:一种半双工的通信方式,数据只能单向流动,并且只能在具有亲缘关系的进程间使用(父子进程通信)。
- 命名管道FIFO:一种半双工通信方式,允许无亲缘关系的进程进行通信,
- 消息队列:消息链表、存放在内核中并由消息队列标识符标识,克服了信号传递信息少、管道只能承载无格式字节流、以及缓冲区大小受限等缺点,
- 信号:比较复杂的通信方式,用于通知接收进程某个事件已经发生,
- 消息同步:
- 互斥锁:以排他方式防止数据结构被并发修改的方法,
- 读写锁:许多个线程同时读共享数据,而对写操作是互斥的,
- 条件变量:以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
- 信号量机制:计数器用来控制多个进程对共享资源的访问,作为一种常见的锁机制。主要作为进程间以及同一进程内不同线程之间的同步手段。
- 文件和记录锁:
- 共享内存:匿名的和具名内存映射
- 映射一段能被其他进程所访问的内存(这段共享内存由一个进程所创建,但多个进程都可以进行访问),
- 共享内存是最快的IPC方式,针对其他进程间通信方式运行效率低而专门设计的。
- 往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
- 远程过程调用RPC:
- 进程间通信的机制,与其他机制不同的是,可用于不同设备间的进程的通信。
- 套接字通信socket:
- 进程间通信的机制,与其他机制不同的是,可用于不同设备间的进程的通信。
在进程间完成数据传递需要借助操作系统提供的特殊方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。部分方法由于自身设计缺陷被淘汰或者弃用,现今常用的进程间通信方式包括:
- 管道:使用简单
- 信号:开销最小/速度更快
- 共享映射区/共享内存:无血缘关系
- 本地套接字:最稳定/复杂度最高