線程:簡單的說就是處理事務的任務鏈,當只有一條鏈,所有的事情都在這一條鏈上執(zhí)行時,那就是單線程,單線程有很多缺點,就是當執(zhí)行某個耗時或者不能立即完成的任務時,比如:網絡通訊、復雜運動,該線程就會暫時停止對其他任務的響應和處理,造成的視覺效果就是程序的“假死”,也就是應用程序被卡在那里無法繼續(xù)執(zhí)行,因此在多數(shù)情況下,單線程的應用很少。而當有多條鏈時,那就是多線程了,當然并不是說多條線并行,而是說有一條主線程,處理整個程序任務的主方向的鏈,而其鏈上又有許許多多的分支,就像樹枝那樣,這樣,既有了主線程去處理那些主要任務,又有了那些細小線程去處理耗時費力任務,從而讓界面看起來更加流暢。iOS平臺對多線程的支持iOS平臺提供了非常優(yōu)秀的多線程支持,程序可以通過非常簡單的方式來啟動多線程,iOS平臺不僅提供了NSThread類來創(chuàng)建多線程,還提供了GCD方式來簡化多線程編程,提供了NSOperation和NSOperationQueue支持多線程編程。
線程和進程幾乎所有的操作系統(tǒng)都支持同時運行多個任務,一個任務通常就是一個程序,每個運行中的程序就是一個進程。? 當一個程序運行時,內部可能包含了多個順序執(zhí)行流,每個順序執(zhí)行流就是一個線程。
幾乎所有的操作系統(tǒng)都支持進程的概念,所有運行中的任務通常對應一個進程(Process)。當一個程序進入內存,運行后,即變成一個進程。
**進程是處于運行過程中的程序,并且具有一定的獨立功能,進程是系統(tǒng)進行資源分配和調度的一個獨立單位**。
一般而言,進程包含如下3個特征:??
- 獨立性:進程是系統(tǒng)中獨立存在的實體,它可以擁有自己獨立的資源,每一個進程都擁有自己私有的地址空間。在沒有經過進程本身允許的情況下,一個用戶進程不可以直接就訪問其他進程的地址空間。?
- 動態(tài)性:進程與程序的區(qū)別在于,程序只是一個靜態(tài)的指令集合,而進程是一個正在系統(tǒng)中活動的指令集合。在進程中加入了時間的概念。進程具有自己的生命周期和各種不同的狀態(tài),這些概念在程序中都是不具備的。 ?
- 并發(fā)性:多個進程可以在單個處理器上并發(fā)執(zhí)行,多個進程之間不會互相影響。并發(fā)性(concurrency)和并行性(parallel)是兩個不同的概念。并行指在同一時刻,有多條指令在多個處理器上同時執(zhí)行;并發(fā)指在同一時刻,只能有一條指令執(zhí)行,但多個進程指令被快速輪換執(zhí)行(納秒級),使得在宏觀上具有多個進程同時執(zhí)行的效果。??
大部分操作系統(tǒng)都支持多進程并發(fā)運行,現(xiàn)代的操作系統(tǒng)幾乎都支持同時運行多個任務對于一個CPU而言,它在某個時間點上只能執(zhí)行一個程序,也就是說,只能運行一個進程,CPU不斷地在這些進程之間輪換執(zhí)行。為什么感覺不到任何中斷現(xiàn)象?這是因為CPU的執(zhí)行速度相對人類的感覺而言是在是太快了。當然,如果啟動的程序足夠多,依然可以感覺到程序的運行速度下降。所以雖然CPU在多個進程之間輪換執(zhí)行,但感覺到(宏觀上)好像多個進程在同時執(zhí)行。現(xiàn)代的操作系統(tǒng)都支持多進程的并發(fā)(輪換執(zhí)行),但在具體的實現(xiàn)細節(jié)上可能因為硬件和操作系統(tǒng)的不同而采用不同的策略。目前操作系統(tǒng)大多采用效率更高的搶占式多任務策略,例如WindowsNT、windows2000以及UNIX/Linux等操作系統(tǒng)。
多線程則擴展了多進程的概念,使得同一個進程可以同時并發(fā)(輪換執(zhí)行)處理多個任務。線程(Thread)也被稱作輕量級進程(LightweightProcess),線程是進程的執(zhí)行單元。就像進程在操作系統(tǒng)中的地位一樣,線程在進程中是獨立的、并發(fā)的執(zhí)行流。
進程操作系統(tǒng)--線程進程當進出被初始化后,主線程就被創(chuàng)建了對于應用程序而言,通常至少有一個主線程,可以在該進程內創(chuàng)建多條順序執(zhí)行流,這些順序執(zhí)行流就是線程,每條線程也是相互獨立的;線程是進程的的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父進程,線程可以擁有自己的堆棧、自己的程序計數(shù)器和自己的局部變量,但是不再擁有系統(tǒng)資源,它與父進程的其他線程共享該進程所擁有的全部資源。因為多個線程共享父進程里的全部資源,因此編程更加方便;但必須更加小心,必須確保線程不會妨礙同一進程里的其他線程。??
??? 線程可以完成一定的任務,可與其他線程共享父進程中的共享變量及部分環(huán)境,相互之間協(xié)同來完成進程所要完成的任務;??
??? 線程是獨立運行的,它并不知道進程中是否還有其他線程存在。線程的執(zhí)行是搶占式的,也就是說,當前運行的線程在任何時候都可能被掛起,以便另一個線程可以運行;??
??? 一個線程可以創(chuàng)建和撤銷另一個線程,同一個進程中的多個線程之間可以并發(fā)執(zhí)行;??
??? 從邏輯角度看,多線程存在于一個運行中的應用程序中,讓一個運行中的應用程序中可以有多個執(zhí)行部分同時執(zhí)行(宏觀上),但操作系統(tǒng)無須將多個線程看作多個獨立的應用,對多線程實現(xiàn)調度和管理以及資源分配。線程的調度和管理由進程本身負責完成。
簡而言之,一個程序運行后至少有一個進程,一個進程里至少要包含一個線程(即主線程),可以包含多個線程。操作系統(tǒng)可以同時執(zhí)行多個任務,每個任務就是進程;進程可以同時執(zhí)行多個任務,每個任務就是線程。多線程線程在運行中的程序中是獨立的、并發(fā)的執(zhí)行流,與分隔的進程相比,進程中的線程之間的隔離程序要小,因為它們共享內存、文件句柄和其它每個進程應有的狀態(tài)。? 因為線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。
進程在執(zhí)行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。線程比進程具有更高的性能:這是因為同一個進程中的線程都有共性——多個線程將共享同一個進程虛擬空間。線程共享的環(huán)境包括:進程代碼段、進程的公有數(shù)據(jù)等。利用這些共享的數(shù)據(jù)等,線程很容易實現(xiàn)相互之間的通信。當操作系統(tǒng)創(chuàng)建一個進程時,必須為該進程分配獨立的內存空間,并分配大量的相關資源;但創(chuàng)建一個線程則簡單很多,因此使用多線程來實現(xiàn)并發(fā)比使用多進程實現(xiàn)并發(fā)的性能要高得多。
使用多線程編程具有如下優(yōu)點:??
??? 進程之間不能共享內存,但同一進程中的線程之間共享內存非常容易;??
??? 系統(tǒng)創(chuàng)建進程需要為該進程重新分配系統(tǒng)資源,但創(chuàng)建線程則代價小得多,因此使用多線程來實現(xiàn)多任務并發(fā)比多進程的效率高;