一、概念 进程:程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 线程:系统独立调度和分派的基本单位,线程自己不拥有操作系统资源,但是该线程可与同属进程的其它线程共享该进程所拥有的全部资源。
二、关系 (1)一个进程可以有多个线程,这些线程能够并发执行;进程至少有一个线程。 (2)进程是资源分配的最小单位,线程是CPU调度的最小单位;进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。 (3)进程执行的系统开销远大于线程执行的开销。
Linux:管道、消息队列、共享内存、信号、socket。 Windows:管道、共享内存、socket。
一、管道 通过创建一个数据缓冲区来存储数据,通过系统API实现。 匿名管道:单向通信、字节流通信、有大小限制、先进先出、用于具有血缘关系的进程间通信(通常是父子进程间使用)。 命名管道:双向通信、字节流通信、有大小限制、先进先出、不同进程间使用、同一网络的不同电脑上的进程间使用。
二、消息队列 消息队列的本质就是存放在内存中的消息的链表,而消息本质上是用户自定义的数据结构。如果进程从消息队列中读取了某个消息,这个消息就会被从消息队列中删除。 双向通信、自定义数据通信、有大小限制、随机读取;消息队列的生命周期随内核需要主动释放。
三、共享内存 将不同进程的虚拟内存地址映射到相同的物理内存地址,Windows通过FileMapping文件映射实现,Linux通过tmpfs共享内存文件实现。 通信效率高、没有提供同步机制(需要结合信号量使用)。
四、信号 Linux系统中,一个进程可以在任何时候发送信号给另一进程,一旦有信号产生对信号的处理方式有几种:执行默认操作(例如终止进程)、处理信号、忽略信号。
五、socket 利用网络通信进行进程间通信,支持不同电脑间通信。
六、其他 (1)Windows界面程序还可以通过WM_COPYDATA进行进程间通信。
Linux:互斥量、信号量、条件变量。 Windows:互斥量、信号量、事件、临界区。
一、互斥量 采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程/进程同时访问。适用上比较简单,通过加锁、解锁就能实现同步。Windows通过Mutex系列接口实现,Linux通过pthread_mutex系列接口实现。
二、信号量 信号量就是⼀个计数器,使用系统提供的一系列接口,可以实现不同进程对计数器变换的信号触发和等待,实现进程间同步。 Windows通过Semaphore系列接口实现,Linux通过sem系列接口实现。
三、事件/条件变量 事件本质上是一个系统信号,发生了某件事情后,发一个信号给其它关心这件事情的线程。从事件的本质上来看,事件不是为了资源保护的,而是为了线程间通知用的。事件不会对共享资源加锁,但也会使线程阻塞,没有触发事件线程就会进入阻塞状态直到事件触发。 事件是Windows下的概念,通过Event系列接口实现;Linux下的条件变量和事件的机制相同,通过pthread_cond系列接口实现。
四、临界区(关键代码段) 一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问,其他所有试图访问此临界区的线程将被挂起,一直持续到进入临界区的线程离开。同一个线程可以多次进入临界区,但是进入几次就要离开几次。 不适用于进程间同步,由于不涉及系统内核对象,速度快,通过CriticalSection系列接口实现。