几乎全部的操做系统都支持同时运行多个任务,一 个任务一般就是一个程序,每一个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每一个顺序执行流就是一个线程。程序员
线程和进程编程
几乎全部的操做系统都支持进程的概念,全部运行中的任务一般对应一个进程(Process)。当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程当中的程序,而且具备必定的独立功能,进程是系统进行资源分配和调度的一个独立单位。浏览器
一 般而言,进程包含以下三个特征。服务器
一、独立性:进程是系统中独立存在的实体,它能够拥有本身独立的资源,每个进程都拥有本身私有的地址空间。在没有通过进程自己容许的状况下, 一个用户进程不能够直接访问其余进程的地址空间。多线程
二、动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念。进程具备本身的生命周期和各类不一样的状态,这些概念在程序中都是不具有的。并发
三、并发性:多个进程能够在单个处理器上并发执行,多个进程之间不会互相影响。工具
注意:并发性( concurrency) 和并行性( parallel) 是两个概念,并行指在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具备多个进程同时执行的效果。性能
大部分操做系统都支持多进程并发运行,现代的操做系统几乎都支持同时运行多个任务。例如,程序员一边开着开发工具在写程序 , 一 边开着参考手册备查,同时还使用电脑播放音乐……除此以外,每台电脑运行时还有大量底层的支撑性程序在运行……这些进程看上去像是在同时工做。开发工具
但事实的真相是,对于一个CPU而言,它在某个时间点只能执行一个程序,也就是说,只能运行一个进程,CPU不断地在这些进程之间轮换执行。那为何用户感受不到任何中断现象呢?这是由于CPU的执行速度相对人的感受来讲实在是太快了(若是启动的程序足够多,用户依然能够感受到程序的运行速度降低),因此虽然CPU在多个进程之间轮换执行,但用户感受到好像有多个进程在同时执行。spa
现代的操做系统都支持多进程的并发,但在具体的实现细节上可能由于硬件和操做系统的不一样而采用不一样的策略。比较经常使用的方式有:共用式的多任务操做策略,例如Windows 3.1和Mac OS 9 ; 目前操做系统大多采用效率更高的抢占式多任务操做策略,例如 Windows NT、 Windows 2000以及 UNIX/Linux等操做系统。
多线程则扩展了多进程的概念,使得同一个进程能够同时并发处理多个任务。线程(Thread )也被称做轻量级进程(Lightweight Process ),线程是进程的执行单元。就像进程在操做系统中的地位同样,线程在程序中是独立的、并发的执行流。当进程被初始化后,主线程就被建立了。对于绝大多数的应用程序来讲,一般仅要求有一个主线程,但也能够在该进程内建立多条顺序执行流,这些顺序执行流就是线程,每一个线程也是互相独立的。
线程是进程的组成部分,一个进程能够拥有多个线程 , 一 个线程必须有一个父进程。线程能够拥有本身的堆栈、本身的程序计数器和本身的局部变量,但不拥有系统资源,它与父进程的其余线程共享该进程所拥有的所有资源。由于多个线程共享父进程里的所有资源,所以编程更加方便;但必须更加当心,由于须要确保线程不会妨碍同一进程里的其余线程。
线程能够完成必定的任务,能够与其余线程共享父进程中的共享变量及部分环境,相互之间协同来完成进程所要完成的任务。
线程是独立运行的,它并不知道进程中是否还有其余线程存在。线程的执行是抢占式的,也就是说,当前运行的线程在任什么时候候均可能被挂起,以便另一个线程能够运行。
一 个线程能够建立和撤销另外一个线程,同一个进程中的多个线程之间能够并发执行。
从逻辑角度来看,多线程存在于一个应用程序中,让一个应用程序中能够有多个执行部分同时执行,但操做系统无须将多个线程看做多个独立的应用,对多线程实现调度和管理以及资源分配。线程的调度和管理由进程自己负责完成。
简而言之,一个程序运行后至少有一个进程,一个进程里能够包含多个线程,但至少要包含一个线程。
概括起来能够这样说:操做系统能够同时执行多个任务,每一个任务就是进程;进程能够同时执行多个任务,每一个任务就是线程。
多线程的优点
线程在程序中是独立的、并发的执行流,与分隔的进程相比,进程中线程之间的隔离程度要小。它们共享内存、文件句柄和其余每一个进程应有的状态。
由于线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。
线程比进程具备更高的性能,这是因为同一个进程中的线程都有共性——多个线程共享同一个进程虚拟空间。线程共享的环境包括.:进程代码段、进程的公有数据等。利用这些共享的数据,线程很容易实现相互之间的通讯。
当操做系统建立一个进程时,必须为该进程分配独立的内存空间,并分配大量的相关资源;但建立一个线程则简单得多,所以使用多线程来实现并发比使用多进程实现并发的性能要高得多。
总结起来,使用多线程编程具备以下几个优势。
一、进程之间不能共享内存,但线程之间共享内存很是容易。
二、系统建立进程时须要为该进程从新分配系统资源,但建立线程则代价小得多,所以使用多线程来实现多任务并发比多进程的效率高。
三、Java 语言内置了多线程功能支持,而不是单纯地做为底层操做系统的调度方式,从而简化了 Java的多线程编程。
在实际应用中,多线程是很是有用的,一个浏览器必须能同时下载多个图片;一个 Web 服务器必须能同时响应多个用户请求; Java 虚拟机自己就在后台提供了一个超级线程来进行垃圾回收;图形用户界面(GUI) 应用也须要启动单独的线程从主机环境收集用户界面事件……总之,多线程在实际编程中的应用是很是普遍的。