进程和线程的区别,进程间如何通信、线程之间如何通信?

142 阅读5分钟

区别

进程是资源分配的最小单位,线程是CPU调度的最小单位;

区别:

  1. 调度: 进程是资源分配的最小单位,线程是CPU调度的最小单位;
  2. 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
  3. 拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。
  4. 系统开销:在创建或者撤销进程时,由于系统都要为之分配和回收资源,导致系统开销明显大于线程的创建或者撤销的开销。
  5. 通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量) 来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预;总之就是:线程间可以通过直接读写同一进程中的数据进行通信,但是[进程通信需要借助 IPC。

进程如何进行通信:

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC

1、管道:包括无名和有名管道

普通管道PIPE:

  1. 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端
  2. 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
  3. 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的readwrite等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
  • Int pipe(int fd[2]);当一个管道建立时,会创建两个文件文件描述符,要关闭管 道只需将这两个文件描述符关闭即可。
命名管道FIFO:先进先出
  1. FIFO可以在无关的进程之间交换数据。
  2. FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

2、信号(signal)

用于通知接收进程某个事件已经发生。

3、消息队列( message queue )

消息队列是由消息组成的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据。

相比于 FIFO,消息队列具有以下优点:

  • 消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
  • 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
  • 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。

4、共享内存( shared memory )

共享内存由一个进程创建,但多个进程都可以访问。【两个不同进程 A、B 共享内存的意思是:同一块物理内存被映射到进程 A、B 各自的进程地址空间。进程 A 可以即时看到进程 B 对共享内存中数据的更新,反之亦然】

共享内存是最快的 IPC(进程间通信) 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

5、信号量( semophore )

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。 它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

6、套接字(socket)

套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

线程通信的方式

  • 通过 volatile 关键字
  • 通过 Object类的 wait/notify 方法
  • 通过 condition 的 await/signal 方法
  • 通过 join 的方式