进程、线程、协程之概念理解

1、概念程序员

  一、进程算法

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

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

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

  二、线程并发

  线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令 指针(PC), 寄存器集合和 堆栈组 成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个 进程的其它线程共享进程所拥有的所有资源。一个线程能够建立和撤消另外一个线程,同一进程中的多个线程之间能够并发执行。因为线程之间的相互制约,导致线程 在运行中呈现出间断性。线程也有 就绪阻塞运行三种基本状态。就绪状态是指线程具有运行的全部条件,逻辑上能够运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每个程序都至少有一个线程,若程序只有一个线程,那就是程序自己。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指 运行中的程序的调度单位。在单个程序中同时运行多个线程完成不一样的工做,称为 多线程
  线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指 运行中的程序的调度单位。在单个程序中同时运行多个线程完成不一样的工做,称为 多线程
  三、协程
  一个程序能够包含多个协程,能够对比与一个进程包含多个线程,于是下面咱们来比较协程和线程。咱们知道多个线程相对独立,有本身的上下文,切换受系统控制;而协程也相对独立,有本身的上下文,可是其切换由本身控制,由当前协程切换到其余协程由当前协程来控制。
  四、Daemon
  Daemon()程序是一直运行的服务端 程序,又称为 守护进程。一般在系统后台运行,没有控制终端,不与前台交互,Daemon程序通常做为 系统服务使 用。Daemon是长时间运行的进程,一般在系统启动后就运行,在系统关闭时才结束。通常说Daemon程序在后台运行,是由于它没有控制终端,没法和前 台的用户交互。Daemon程序通常都做为服务程序使用,等待客户端程序与它通讯。咱们也把运行的Daemon程序称做守护进程。
  

  所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,好比垃圾回收线程就是一个很称职的守护者,而且这种线程并不属于程序中不可或缺的部分。所以, 当全部的非守护线程结束时,程序也就终止了,同时会杀死进程中的全部守护线程。反过来讲,只要任何非守护线程还在运行,程序就不会终止。模块化

用户线程和守护线程二者几乎没有区别,惟一的不一样之处就在于虚拟机的离开:若是用户线程已经所有退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 由于没有了被守护者,守护线程也就没有工做可作了,也就没有继续运行程序的必要了。工具

  五、多进程和多线程

进程是资源分配的最小单位,线程是CPU调度的最小单位。线程和进程的区别在于,子进程和父进程有不一样的代码和数据空间,而多个线程则共享数据空 间,每一个线程有本身的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体状况而定. 线程的运行中须要使用计算机的内存资源和CPU。操作系统

  多进程: 进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程能够分为系统进程 和用户进程。凡是用于完成操做系统的各类功能的进程就是系统进程,它们就是处于运行状态下的操做系统自己;全部由用户启动的进程都是用户进程。进程是操做 系统进行资源分配的单位。 进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。在同一个时间里,同一个计算机系统中若是容许两个或两个以上的进程处于运行状态,这 即是多任务。现代的操做系统几乎都是多任务操做系统,可以同时管理多个进程的运行。 多任务带来的好处是明显的,好比你能够边听mp3边上网,与此同时甚至能够将下载的文档打印出来,而这些任务之间丝绝不会相互干扰。那么这里就涉及到并行 的问题,俗话说,一心不能二用,这对计算机也同样,原则上一个CPU只能分配给一个进程,以便运行这个进程。咱们一般使用的计算机中只有一个CPU,也就 是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术至关复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简 单介绍以下:在操做系统的管理下,全部正在运行的进程轮流使用CPU,每一个进程容许占用CPU的时间很是短(好比10毫秒),这样用户根本感受不出来 CPU是在轮流为多个进程服务,就好象全部的进程都在不间断地运行同样。但实际上在任何一个时间内有且仅有一个进程占有CPU。 若是一台计算机有多个CPU,状况就不一样了,若是进程数小于CPU数,则不一样的进程能够分配给不一样的CPU来运行,这样,多个进程就是真正同时运行的,这 即是并行。但若是进程数大于CPU数,则仍然须要使用并发技术。 进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这时状况更加复杂,但简单地说,有以下关系:线程

  总线程数<= CPU数量:并行运行

  总线程数> CPU数量:并发运行

  并行运行的效率显然高于并发运行,因此在多CPU的计算机中,多任务的效率比较高。可是,若是在多CPU计算机中只运行一个进程(线程),就不 能发挥多CPU的优点。 这里涉及到多任务操做系统的问题,多任务操做系统(如Windows)的基本原理是:操做系统将CPU的时间片分配给多个线程,每一个线程在操做系统指定的 时间片内完成(注意,这里的多个线程是分属于不一样进程的).操做系统不断的从一个线程的执行切换到另外一个线程的执行,如此往复,宏观上看来,就好像是多个 线程在一块儿执行.因为这多个线程分属于不一样的进程,所以在咱们看来,就好像是多个进程在同时执行,这样就实现了多任务

  多线程:在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序可以停下手头的工做,改成处理其余一些问题, 再返回主进程。能够经过多种途径达到这个目的。最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是经过硬件级的中断实 现的。尽管这是一种有用的方法,但编出的程序很难移植,由此形成了另外一类的代价高昂问题。中断对那些实时性很强的任务来讲是颇有必要的。但对于其余许多问 题,只要求将问题划分进入独立运行的程序片段中,使整个程序能更迅速地响应用户的请求。

  最开始,线程只是用于分配单个处理器的处理时间的一种工具。但假如操做系统自己支持多个处理器,那么每一个线程均可分配给一个不一样的处理器,真正 进入“并行运算”状态。从程序设计语言的角度看,多线程操做最有价值的特性之一就是程序员没必要关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个 线程;假如机器自己安装了多个处理器,那么程序会运行得更快,毋需做出任何特殊的调校。根据前面的论述,你们可能感受线程处理很是简单。但必须注意一个问 题:共享资源!若是有多个线程同时运行,并且它们试图访问相同的资源,就会遇到一个问题。举个例子来讲,两个线程不能将信息同时发送给一台打印机。为解决 这个问题,对那些可共享的资源来讲(好比打印机),它们在使用期间必须进入锁定状态。因此一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个 锁,使其余线程能够接着使用一样的资源。

  多线程是为了同步完成多项任务,不是为了提升运行效率,而是为了提升资源使用效率来提升系统的效率。线程是在同一时间须要完成多项任务的时候实现的。

  一个采用了多线程技术的应用程序能够更好地利用系统资源。其主要优点在于充分利用了CPU的空闲时间片,能够用尽量少的时间来对用户的要求作 出响应,使得进程的总体运行效率获得较大提升,同时加强了应用程序的灵活性。更为重要的是,因为同一进程的全部线程是共享同一内存,因此不须要特殊的数据 传送机制,不须要创建共享存储区或共享文件,从而使得不一样任务之间的协调操做与运行、数据的交互、资源的分配等问题更加易于解决。

进程间通讯(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位。每一个进程都有本身的一部分 独立的系统资源,彼此是隔离的。为了能使不一样的进程互相访问资源并进行协调工做,才有了进程间通讯。这些进程能够运行在同一计算机上或网络链接的不一样计算 机上。

  进程间通讯技术包括消息传递、同步、共享内存和远程过程调用。IPC是一种标准的Unix通讯机制。

  使用IPC 的理由:

  信息共享

  加速;

  模块化;

  方便; 以及

  私有权分离.

  主要的 IPC 方法

  方法 提供方(操做系统或其余环境)

  文件 多数操做系统

  信号 多数操做系统

  Socket 多数操做系统

  消息队列(en:Message queue) 多数操做系统

  管道(en:Pipe) 全部的 POSIX systems, Windows.

  具名管道(en:Named Pipe) 全部的 POSIX 系统, Windows.

  信号量(en:Semaphore) 全部的 POSIX 系统, Windows.

  共享内存 全部的 POSIX 系统, Windows.

  Message passing(en:Message passing) 用于 MPI规范,Java RMI, CORBA, MSMQ, MailSlot 以及其余.