进程间通信介绍(一)-System V, POSIX

到目前为止socket编程的总结就告一段落了,接下来会继续学习Linux网络编程的其他知识,涉及进程、线程等。今天从进程通信的相关知识开始学习,主要内容包括进程同步与进程互斥,进程通信的目的等等…

1.进程同步与进程互斥

(1)学习进程同步和互斥之前,先来了解一下顺序程序与并发程序特征:

  • 顺序程序特征
    • 顺序性:后一条指令的执行,要在前一条指令的基础上
    • 封闭性:(运行环境的封闭性)
    • 确定性:给程序一定的输入,有特定的输出
    • 可再现性
  • 并发程序特征
    • 共享性
    • 并发性
    • 随机性

(2)进程互斥

1)由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程竞争使用这些资源,进程的这种关系为进程的互斥

2)系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源

3)在进程中涉及到互斥资源的程序段叫临界区

4)互斥示例:

互斥示例

  • A或B进程在访问上述同一块资源的时候,需要加锁。
  • 程序中x资源称为临界资源;访问共享资源的代码,称为临界区。

(3)进程同步

1)进程同步指的是多个进程需要相互配合共同完成一项任务。

2)同步示例

同步示例

2.进程间通信目的

(1)数据传输:一个进程需要将它的数据发送给另一个进程。

(2)资源共享:多个进程之间共享同样的资源。

(3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发送了某种时间(如进程终止时要通知父进程)。

(4)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

3.进程间通信发展

(1)管道

管道是最古来的进程间通信机制,如果是匿名管道,只能用于父子进程间进行通信;如果是有名管道可以用于不相关的进程间通信。

(2)System V进程间通信

随着系统的发展,出现了System V,对进程间通信做了些拓展。

(3)POSIX进程间通信

POSIX是一个标准,由于各种UNIX版本的出现,所以迫切的需要一种标准来对各种版本的编程接口进行统一,就出现了POSIX标准。

其中POSIX标准中,也规定了一些进程间通信的机制。

4.进程间通信分类
  • 文件:
  • 文件锁
  • 管道(pipe)和有名管道(FIFO)
  • 信号(signal)
  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁
  • 套接字(socket)

其中消息队列、共享内存和信号量在System V和POSIX中都有定义;而互斥量、条件变量和读写锁是在POSIX标准中定义的通信手段。如下是两种IPC,各自有自己的编程接口:

(1)System V IPC:

  • System V消息队列
  • System V共享内存
  • System V信号量

(2)POSIX IPC

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁
5.进程间共享信息的三种方式

进程共享信息

(1)第一种方式,两个进程要共享信息,它们共享的是同一个文件系统;

(2)第二种方式,它们共享的是内核中的共享信息;

(3)第三种方式,两个进程共享的是同一块共享内存区。(效率较高)

6.IPC对象的持续性

针对上述的三种共享方式,出现了三种IPC对象的持续性:

(1)随进程持续:一直存在直到打开的最后一个进程结束(如pipe和FIFO);

(2)随内核持续:一直存在直到内核自举或显式删除(如System V消息队列、共享内存、信号量);

(3)随文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现)

发表评论

电子邮件地址不会被公开。 必填项已用*标注