(1)IPC简介

笑着哭i 提交于 2020-01-13 19:20:27

简述

IPC是进程间通信(interprocess communication)的简称。用来描述运行在一个操作系统之上的不同进程间各种消息传递的方式。
IPC在使用过程中需要同步参与一起运行。

1. 消息传递演变过程

  • 管道(pipe):只能在具有共同祖先(指父子进程关系)的进程间使用,有名管道fifo可以在任意进程间使用
  • System V消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。
  • Posix消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。
  • 远程过程调用:

2. 同步形式演变

  • 使用文件系统特性同步
  • 记录上锁(record-locking)
  • System V信号量
  • Posix信号量和Posix共享内存区
  • 互斥锁(mutex)和条件变量(condition variable):主要用于线程间同步,也能提供进程间的同步
  • 读写锁(read-write-lock)

进程、线程与信息共享

unix/linux间信息共享的三种方式
在这里插入图片描述

  1. 两个进程共享存储在文件系统中的某个文件上的信息。访问该文件,每个进行都要经过内核(如read,write,lseek等)。当共享信息的文件内容需要更新时,需要使用同步技术对文件内容进行读写保护。
    在这里插入图片描述
  2. 两个进程共享驻留在内核中的信息。管道、System V消息队列和System V信号量使用该种方式。访问共享信息的每次操作设计对内核的一次系统调用。
    在这里插入图片描述
  3. 两个进程有一个双方都能访问的共享内存区。每个进程设置好该共享内存区,就能在不涉及内核而访问其中的数据。共享内存区的进程需要使用同步技术。

IPC对象的持续性

IPC对象的持续性:描述定义的某类IPC对象能一直存在的时间长度(能存在多长时间)
在这里插入图片描述

  1. 随进程持续的IPC:IPC对象一直存在到打开着该对象的最后一个进程关闭该对象为止。管道和FIFO属于该种方式。
  2. 随内核持续的IPC:IPC对象一直存在到内核重新自举或显示删除该对象为止。SystemV的消息队列、信号量和共享内存区属于该类对象。Posix的消息队列、信号量和共享内存必须至少是随内核持续的,但也可以是随文件系统持续的,具体取决于实现。
  3. 随文件系统持续的IPC: IPC对象一直存在到显示删除该对象为止。即使内核重新自举了,该对象还是保持其值。Posix消息队列、信号量和共享内存区如果使用映射文件实现,那么就属于该类对象。

名字空间

IPC类型 用户打开或创建IPC的名字空间 IPC打开后的标识符
管道
FIFO
(没有名字)
路径名
描述符
描述符
Posix互斥锁
Posix条件变量
Posix读写锁
fcntl记录上锁
(没有名字)
(没有名字)
(没有名字)
路径名
pthread_mutex_t指针
pthread_cond_t指针
pthread_rwlock_t指针
描述符
Posix消息队列
Posix有名信号量
Posix基于内存的信号量
Posix共享内存区
Posix IPC名字
Posix IPC名字
(没有名字)
Posix IPC名字
mqd_t值
sem_t指针
sem_t指针
描述符
SystemV消息队列
SystemV信号量
SystemV共享内存区
key_t值
key_t值
key_t值
SystemV IPC标识符
SystemV IPC标识符
SystemV IPC标识符

Sun RPC
路径名
程序/版本
描述符
RPC句柄
TCP套接字
UDP套接字
Unix域套接字
IP地址与TCP端口
IP地址与UDP端口
路径名
描述符
描述符
描述符

fork、exec和exit对IPC对象的影响

(略)

总结

IPC的4个主要领域

  1. 消息传递(管道,fifo,消息队列)
  2. 同步(互斥锁,条件变量,读写锁,信号量)
  3. 共享内存区(匿名共享内存区,有名共享内存区)
  4. 过程调用(Solaris门、Sun RPC)

使用IPC应用场景:

  1. 单进程间各个线程间的IPC
  2. 多个进程间的IPC

选择使用的IPC类型时,必须清楚相应IPC对象的持续性
最后根据各类IPC的名字空间,结合实际应用场景,选择合适的IPC实现方式。

参考资料

《UNIX网络编程-卷2-进程间通信》

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!