1、进程、线程通信概念:
(1)进程用户空间是相互独立的,一般而言是不能相互访问的,唯一的例外是共享内存区、 内核空间、以及可以访问的外设,所以不管是进程和线程都是需要通信的。
(2)进程通信要解决三个问题:
① 既一个进程如何把消息传递给另一个。
② 确保两个或者多个进程在关键活动中不会出现交叉。
③ 第三个问题与正确顺序有序。
这三个问题的后两个问题对线程也是使用的,所以同样的问题和解决方法也适用于线程。
(3)临界区:共享内存进行访问的程序片段。一个好通信方法满足下面四个条件:
① 任何两个进程不能同时处于其临界区
② 不应该对CPU的速度和数量做任何限制
③ 临界区外的运行进程不得阻塞其他进程
④ 不得使进程无限制等待进入临界区
(4)适用于线程之间的通信方式有:互斥锁、条件变量、读写锁、信号量、消息队列、事件
适用于进程之间的通信方式有:管道、信号量、消息队列、条件变量、共享内存、套接字
2、通信方式介绍:
(1)管道:
管道包括三种:
① 普通管道PIPE, 通常有两种限制,一是半双工,只能单向传输;二是只能在父子进 程间使用.
② 流管道s_pipe: 去除了第一种限制,可以双向传输.
③ 命名管道:name_pipe, 去除了第二种限制,可以在许多并不相关的进程之间进行通 讯.
(2)信号量:
① 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
② 信号量不仅可以解决互斥,还可以实现同步,消费者-生产者模型中,信号量mutex 是用来实现互斥的,信号量full,empty是用来实现同步的,互斥量是信号量的一 种特殊形式。
(3)条件变量(信号):
条件变量容许线程由于一些未达到的条件而阻塞,条件变量可以在某些时候被阻塞,在另一些时候被唤醒,这样就不用cpu去忙循环判断了。条件变量往往和互斥量一起使用。
(8)消息队列:
如果没有共享内存的情况下,可以通过消息队列实现,消息队列是由消息的链表存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(9)共享内存:
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信,共享内存不能用于线程间的同步。
(10)套接字:
套接字是一种进程之间的通信方式,与其他通信方式不同,它可以用于不同机器间的进程通信。