幾乎全部的操做系統都支持同時運行多個任務,一 個任務一般就是一個程序,每一個運行中的程序就是一個進程。當一個程序運行時,內部可能包含了多個順序執行流,每一個順序執行流就是一個線程。程序員
線程和進程編程
幾乎全部的操做系統都支持進程的概念,全部運行中的任務一般對應一個進程(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) 應用也須要啓動單獨的線程從主機環境收集用戶界面事件……總之,多線程在實際編程中的應用是很是普遍的。