**进程:**指程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.每个进程还占用着独立地系统资源
**线程:**比进程更小的执行单位,一个进程在执行过程中可以产生多个线程,与进程不同的是同类的多个线程共享一块内存空间和一组系统资源
线程的基本形态:
进程间的通讯方式
- 管道
1)是半双工的(数据只能在一个方向流动),具有固定的读端和写端
2)只能用于亲缘关系的进程之间的通信(父子进程或者兄弟进程之间)
3)可以看做特殊的文件,读写可以用read,write等函数,但不属于任何文件系统,只存在于内存中 - 消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
1)消息队列是面向记录的,其中的消息具有特定的格式和特定的优先级
2)消息队列独立于发送和接收进程,进程终止时,消息队列及其内容不会被删除
3)消息队列可以实现消息的随机查询,不一定按照先进先出的次序进行读取,可以按照消息的类型读取 - 信号量
它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
2)信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
3)每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
支持信号量组。 - 共享内存
共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。
1)共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
2)因为多个进程可以同时操作,所以需要进行同步。
3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
进程4种通讯方式总结
-
管道:速度慢,容量有限,只有父子进程能通讯
-
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
-
信号量:不能传递复杂消息,只能用来同步
-
共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
线程间的通信方式
- 锁机制:包括互斥锁,条件变量,读写锁
互斥锁提供排他的方式防止数据结构被并发修改
读写锁允许多个线程同时读取共享数据,对写操作是互斥的
条件变量以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。 - 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
- 信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。