線程:簡單的說就是處理事務(wù)的任務(wù)鏈,當(dāng)只有一條鏈熄赡,所有的事情都在這一條鏈上執(zhí)行時(shí)姜挺,那就是單線程,單線程有很多缺點(diǎn)彼硫,就是當(dāng)執(zhí)行某個(gè)耗時(shí)或者不能立即完成的任務(wù)時(shí)炊豪,比如:網(wǎng)絡(luò)通訊、復(fù)雜運(yùn)動(dòng)拧篮,該線程就會暫時(shí)停止對其他任務(wù)的響應(yīng)和處理词渤,造成的視覺效果就是程序的“假死”,也就是應(yīng)用程序被卡在那里無法繼續(xù)執(zhí)行串绩,因此在多數(shù)情況下缺虐,單線程的應(yīng)用很少。而當(dāng)有多條鏈時(shí)赏参,那就是多線程了志笼,當(dāng)然并不是說多條線并行,而是說有一條主線程把篓,處理整個(gè)程序任務(wù)的主方向的鏈纫溃,而其鏈上又有許許多多的分支,就像樹枝那樣韧掩,這樣紊浩,既有了主線程去處理那些主要任務(wù),又有了那些細(xì)小線程去處理耗時(shí)費(fèi)力任務(wù),從而讓界面看起來更加流暢坊谁。iOS平臺對多線程的支持iOS平臺提供了非常優(yōu)秀的多線程支持费彼,程序可以通過非常簡單的方式來啟動(dòng)多線程,iOS平臺不僅提供了NSThread類來創(chuàng)建多線程口芍,還提供了GCD方式來簡化多線程編程箍铲,提供了NSOperation和NSOperationQueue支持多線程編程。
線程和進(jìn)程幾乎所有的操作系統(tǒng)都支持同時(shí)運(yùn)行多個(gè)任務(wù)鬓椭,一個(gè)任務(wù)通常就是一個(gè)程序颠猴,每個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程。? 當(dāng)一個(gè)程序運(yùn)行時(shí)小染,內(nèi)部可能包含了多個(gè)順序執(zhí)行流翘瓮,每個(gè)順序執(zhí)行流就是一個(gè)線程。
幾乎所有的操作系統(tǒng)都支持進(jìn)程的概念裤翩,所有運(yùn)行中的任務(wù)通常對應(yīng)一個(gè)進(jìn)程(Process)资盅。當(dāng)一個(gè)程序進(jìn)入內(nèi)存,運(yùn)行后踊赠,即變成一個(gè)進(jìn)程呵扛。
**進(jìn)程是處于運(yùn)行過程中的程序,并且具有一定的獨(dú)立功能臼疫,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位**择份。
一般而言,進(jìn)程包含如下3個(gè)特征:??
- 獨(dú)立性:進(jìn)程是系統(tǒng)中獨(dú)立存在的實(shí)體烫堤,它可以擁有自己獨(dú)立的資源荣赶,每一個(gè)進(jìn)程都擁有自己私有的地址空間。在沒有經(jīng)過進(jìn)程本身允許的情況下鸽斟,一個(gè)用戶進(jìn)程不可以直接就訪問其他進(jìn)程的地址空間拔创。?
- 動(dòng)態(tài)性:進(jìn)程與程序的區(qū)別在于,程序只是一個(gè)靜態(tài)的指令集合富蓄,而進(jìn)程是一個(gè)正在系統(tǒng)中活動(dòng)的指令集合剩燥。在進(jìn)程中加入了時(shí)間的概念。進(jìn)程具有自己的生命周期和各種不同的狀態(tài)立倍,這些概念在程序中都是不具備的灭红。 ?
- 并發(fā)性:多個(gè)進(jìn)程可以在單個(gè)處理器上并發(fā)執(zhí)行,多個(gè)進(jìn)程之間不會互相影響口注。并發(fā)性(concurrency)和并行性(parallel)是兩個(gè)不同的概念变擒。并行指在同一時(shí)刻,有多條指令在多個(gè)處理器上同時(shí)執(zhí)行寝志;并發(fā)指在同一時(shí)刻娇斑,只能有一條指令執(zhí)行策添,但多個(gè)進(jìn)程指令被快速輪換執(zhí)行(納秒級),使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果毫缆。??
大部分操作系統(tǒng)都支持多進(jìn)程并發(fā)運(yùn)行唯竹,現(xiàn)代的操作系統(tǒng)幾乎都支持同時(shí)運(yùn)行多個(gè)任務(wù)對于一個(gè)CPU而言,它在某個(gè)時(shí)間點(diǎn)上只能執(zhí)行一個(gè)程序苦丁,也就是說浸颓,只能運(yùn)行一個(gè)進(jìn)程,CPU不斷地在這些進(jìn)程之間輪換執(zhí)行芬骄。為什么感覺不到任何中斷現(xiàn)象猾愿?這是因?yàn)镃PU的執(zhí)行速度相對人類的感覺而言是在是太快了。當(dāng)然账阻,如果啟動(dòng)的程序足夠多,依然可以感覺到程序的運(yùn)行速度下降泽本。所以雖然CPU在多個(gè)進(jìn)程之間輪換執(zhí)行淘太,但感覺到(宏觀上)好像多個(gè)進(jìn)程在同時(shí)執(zhí)行。現(xiàn)代的操作系統(tǒng)都支持多進(jìn)程的并發(fā)(輪換執(zhí)行)规丽,但在具體的實(shí)現(xiàn)細(xì)節(jié)上可能因?yàn)橛布筒僮飨到y(tǒng)的不同而采用不同的策略蒲牧。目前操作系統(tǒng)大多采用效率更高的搶占式多任務(wù)策略,例如WindowsNT赌莺、windows2000以及UNIX/Linux等操作系統(tǒng)冰抢。
多線程則擴(kuò)展了多進(jìn)程的概念,使得同一個(gè)進(jìn)程可以同時(shí)并發(fā)(輪換執(zhí)行)處理多個(gè)任務(wù)艘狭。線程(Thread)也被稱作輕量級進(jìn)程(LightweightProcess)挎扰,線程是進(jìn)程的執(zhí)行單元。就像進(jìn)程在操作系統(tǒng)中的地位一樣巢音,線程在進(jìn)程中是獨(dú)立的遵倦、并發(fā)的執(zhí)行流。
進(jìn)程操作系統(tǒng)--線程進(jìn)程當(dāng)進(jìn)出被初始化后官撼,主線程就被創(chuàng)建了對于應(yīng)用程序而言梧躺,通常至少有一個(gè)主線程,可以在該進(jìn)程內(nèi)創(chuàng)建多條順序執(zhí)行流傲绣,這些順序執(zhí)行流就是線程掠哥,每條線程也是相互獨(dú)立的;線程是進(jìn)程的的組成部分秃诵,一個(gè)進(jìn)程可以擁有多個(gè)線程续搀,一個(gè)線程必須有一個(gè)父進(jìn)程,線程可以擁有自己的堆棧顷链、自己的程序計(jì)數(shù)器和自己的局部變量目代,但是不再擁有系統(tǒng)資源屈梁,它與父進(jìn)程的其他線程共享該進(jìn)程所擁有的全部資源。因?yàn)槎鄠€(gè)線程共享父進(jìn)程里的全部資源榛了,因此編程更加方便在讶;但必須更加小心,必須確保線程不會妨礙同一進(jìn)程里的其他線程霜大。??
??? 線程可以完成一定的任務(wù)构哺,可與其他線程共享父進(jìn)程中的共享變量及部分環(huán)境,相互之間協(xié)同來完成進(jìn)程所要完成的任務(wù)战坤;??
??? 線程是獨(dú)立運(yùn)行的曙强,它并不知道進(jìn)程中是否還有其他線程存在。線程的執(zhí)行是搶占式的途茫,也就是說碟嘴,當(dāng)前運(yùn)行的線程在任何時(shí)候都可能被掛起,以便另一個(gè)線程可以運(yùn)行囊卜;??
??? 一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程娜扇,同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行;??
??? 從邏輯角度看栅组,多線程存在于一個(gè)運(yùn)行中的應(yīng)用程序中雀瓢,讓一個(gè)運(yùn)行中的應(yīng)用程序中可以有多個(gè)執(zhí)行部分同時(shí)執(zhí)行(宏觀上),但操作系統(tǒng)無須將多個(gè)線程看作多個(gè)獨(dú)立的應(yīng)用玉掸,對多線程實(shí)現(xiàn)調(diào)度和管理以及資源分配刃麸。線程的調(diào)度和管理由進(jìn)程本身負(fù)責(zé)完成。
簡而言之司浪,一個(gè)程序運(yùn)行后至少有一個(gè)進(jìn)程泊业,一個(gè)進(jìn)程里至少要包含一個(gè)線程(即主線程),可以包含多個(gè)線程断傲。操作系統(tǒng)可以同時(shí)執(zhí)行多個(gè)任務(wù)脱吱,每個(gè)任務(wù)就是進(jìn)程;進(jìn)程可以同時(shí)執(zhí)行多個(gè)任務(wù)认罩,每個(gè)任務(wù)就是線程箱蝠。多線程線程在運(yùn)行中的程序中是獨(dú)立的、并發(fā)的執(zhí)行流垦垂,與分隔的進(jìn)程相比宦搬,進(jìn)程中的線程之間的隔離程序要小,因?yàn)樗鼈児蚕韮?nèi)存劫拗、文件句柄和其它每個(gè)進(jìn)程應(yīng)有的狀態(tài)间校。? 因?yàn)榫€程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高页慷。
進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元憔足,而多個(gè)線程共享內(nèi)存胁附,從而極大地提高了程序的運(yùn)行效率。線程比進(jìn)程具有更高的性能:這是因?yàn)橥粋€(gè)進(jìn)程中的線程都有共性——多個(gè)線程將共享同一個(gè)進(jìn)程虛擬空間滓彰。線程共享的環(huán)境包括:進(jìn)程代碼段控妻、進(jìn)程的公有數(shù)據(jù)等。利用這些共享的數(shù)據(jù)等揭绑,線程很容易實(shí)現(xiàn)相互之間的通信弓候。當(dāng)操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程時(shí),必須為該進(jìn)程分配獨(dú)立的內(nèi)存空間他匪,并分配大量的相關(guān)資源菇存;但創(chuàng)建一個(gè)線程則簡單很多,因此使用多線程來實(shí)現(xiàn)并發(fā)比使用多進(jìn)程實(shí)現(xiàn)并發(fā)的性能要高得多邦蜜。
使用多線程編程具有如下優(yōu)點(diǎn):??
??? 進(jìn)程之間不能共享內(nèi)存依鸥,但同一進(jìn)程中的線程之間共享內(nèi)存非常容易;??
??? 系統(tǒng)創(chuàng)建進(jìn)程需要為該進(jìn)程重新分配系統(tǒng)資源畦徘,但創(chuàng)建線程則代價(jià)小得多毕籽,因此使用多線程來實(shí)現(xiàn)多任務(wù)并發(fā)比多進(jìn)程的效率高;