进程间通讯和线程间通讯的几种方式

进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操做系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。html

  进程是一个具备独立功能的程序关于某个数据集合的一次运行活动。它能够申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不仅是程序的代码,还包括当前的活动,经过程序计数器的值和处理寄存器的内容来表示。python

  进程的概念主要有两点:第一,进程是一个实体。每个进程都有它本身的地址空间,通常状况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操做系统执行之),它才能成为一个活动的实体,咱们称其为进程安全

进程是具备必定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每一个进程都有本身的独立内存空间,不一样进程经过进程间通讯来通讯。因为进程比较重量,占据独立的内存,因此上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。数据结构



线程

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源。线程间通讯主要经过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。多线程

一个线程能够建立和撤消另外一个线程,同一进程中的多个线程之间能够并发执行。因为线程之间的相互制约,导致线程 在运行中呈现出间断性。线程也有 就绪阻塞运行三种基本状态。就绪状态是指线程具有运行的全部条件,逻辑上能够运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每个程序都至少有一个线程,若程序只有一个线程,那就是程序自己。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指 运行中的程序的调度单位。在单个程序中同时运行多个线程完成不一样的工做,称为 多线程
 

协程

协程是一种用户态的轻量级线程,协程的调度彻底由用户控制。协程拥有本身的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其余地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操做栈则基本没有内核切换的开销,能够不加锁的访问全局变量,因此上下文的切换很是快。并发

 

进程、线程、协程的区别

 

概念

对于进程来讲,子进程是父进程的复制品,从父进程那里得到父进程的数据空间,堆和栈的复制品。异步

而线程,相对于进程而言,是一个更加接近于执行体的概念,能够和同进程的其余线程之间直接共享数据,并且拥有本身的栈空间,拥有独立序列。socket

 

进程、线程共同点

它们都能提升程序的并发度,提升程序运行效率和响应时间。线程和进程在使用上各有优缺点。 线程执行开销比较小,但不利于资源的管理和保护,而进程相反。同时,线程适合在SMP机器上运行,而进程能够跨机器迁移。工具

 

进程、线程不一样点

多进程中每一个进程有本身的地址空间,线程则共享地址空间。测试

全部其余区别都是由于这个区别产生的。好比说:

1) 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有本身独立的地址空间
2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
3) 线程是处理器调度的基本单位,但进程不是
4) 两者都可并发执行

5) 每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

 

1. 速度。线程产生的速度快,通信快,切换快,由于他们处于同一地址空间。 
2. 线程的资源利用率好。 
3. 线程使用公共变量或者内存的时候须要同步机制,但进程不用。

而他们通讯方式的差别也仍然是因为这个根本缘由形成的。

 

线程、协程比较

1) 一个线程能够多个协程,一个进程也能够单独拥有多个协程,这样python中则能使用多核CPU。

2) 线程进程都是同步机制,而协程则是异步

3) 协程能保留上一次调用时的状态,每次过程重入时,就至关于进入上一次调用的状态

 

通讯方式之间的差别

由于那个根本缘由,实际上只有进程间须要通讯,同一进程的线程共享地址空间,没有通讯的必要,但要作好同步/互斥,保护共享的全局变量。

而进程间通讯不管是信号,管道pipe仍是共享内存都是由操做系统保证的,是系统调用。

 

进程通讯

管道(pipe)

管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。

有名管道 (namedpipe)

有名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。

信号量(semaphore)

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

消息队列(messagequeue)

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

信号 (sinal)

信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生。

共享内存(shared memory)

共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步和通讯。

套接字(socket)

套接口也是一种进程间通讯机制,与其余通讯机制不一样的是,它可用于不一样设备及其间的进程通讯。


线程间的通讯方式

锁机制:包括互斥锁、条件变量、读写锁

互斥锁提供了以排他方式防止数据结构被并发修改的方法。 
读写锁容许多个线程同时读共享数据,而对写操做是互斥的。 
条件变量能够以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一块儿使用。

wait/notify 等待

Volatile 内存共享

CountDownLatch 并发工具

CyclicBarrier 并发工具

信号量机制(Semaphore)

包括无名线程信号量和命名线程信号量。

信号机制(Signal)

相似进程间的信号处理。

线程间的通讯目的主要是用于线程同步,因此线程没有像进程通讯中的用于数据交换的通讯机制。

相关文章
相关标签/搜索