在以前我们使用多进程时,我们一般都是让父子进程分别执行各自的代码,进程之间几乎没有通信,但是实际过程中,进程间的通信是十分重要的的一件事情,一个复杂的程序一般都是有多个进程相互通信,协调进行来完成工作的。
本章我们并不讲解进程通信的具体技术,我们先讲解进程间通信的有关基础概念进行,方便我们在后面学习进程间通信时有更深刻的理解。
进程间通信的基础概念
- 一、进程间通信目的
- 二、进程间通信分类
- 三、进程通信的要求
- 四、进程间通信的有关概念
一、进程间通信目的
-
数据传输:一个进程需要将它的数据发送给另一个进程。
-
资源共享:多个进程之间共享同样的资源。
-
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
-
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
二、进程间通信分类
- 管道
- 匿名管道pipe
- 命名管道
- System V IPC
- System V 消息队列
- System V 共享内存
- System V 信号量
- POSIX IPC
- 消息队列
- 共享内存
- 信号量
- 互斥量
- 条件变量
- 读写锁
三、进程通信的要求
我们知道:进程是具有独立性的,进程的数据是不能相互干扰的,如果我们要让他们进行通信无疑增加了通信的成本。
要让两个不同的进程,进行通信,前提条件肯定是:先让两个进程,看到同一份“资源”。并且这份资源不能属于任何一个进程,否则就会影响进程的独立性!当然如果多个进程无法看到同一份资源它们就无法进行进程间的通信。
任何进程通信手段:
a、想办法,先让不同的进程,看到同一份资源
b、让一方写入,一方读取,完成通信过程,至于,通信目的与后续工作,要结合具体场景
四、进程间通信的有关概念
我们把所有进程都能看到的资源称为公共资源,例如操作系统给我们提供公共资源来让两个进程进行进程间通信,但是在通信的过程中可能会有各种问题,比如:进程A进行写入,进程B进行读取,当进程A还没有写完,进程B就进行读取,那么进程B读取的数据可能就不是进程A想要给进程B的消息,这时就要有相应的概念和技术出现去解决这些问题。
-
互斥:任何一个时刻,都只允许一个执行流在进行共享资源的访问。(针对进程的概念)
(例如上面的进程A和进程B如果是互斥的,读写结果不一致的问题就得到了解决) -
临界资源:我们把任何一个时刻,都只允许一个执行流在进行访问的共享资源,叫做临界资源。 (针对资源的概念)
-
临界区: 临界资源也是共享资源,通过访问共享资源能够使两个进程进行进程间的通信,共享资源的访问是要通过代码访问的,因此临界资源的访问是要通过代码访问的,凡是访问临界资源的代码所组成的区域,叫做临界区。
- 原子性:原子性是一个挺复杂的概念,这里我们只需要对其有简单的理解就行了,其核心意思就是:要么不做,要么做完,只有两种确定状态的属性,叫做原子性。
(例如上面的进程A进行写入一条消息时,不能只写了半条消息就退出了,要么进程A就不写,要写就一下写完)