程序只是一組指令的有序集合栋荸,以文件的形式存儲(chǔ)在磁盤上何之。
進(jìn)程是資源(CPU跟畅、內(nèi)存等)分配的基本單位,它是程序執(zhí)行時(shí)的一個(gè)實(shí)例溶推。程序運(yùn)行時(shí)系統(tǒng)就會(huì)創(chuàng)建一個(gè)進(jìn)程徊件,并為它分配資源,然后把該進(jìn)程放入進(jìn)程就緒隊(duì)列蒜危,進(jìn)程調(diào)度器選中它的時(shí)候就會(huì)為它分配CPU時(shí)間虱痕,程序開始真正運(yùn)行。
線程是程序執(zhí)行時(shí)的最小單位辐赞,它是進(jìn)程的一個(gè)執(zhí)行流部翘,是CPU調(diào)度和分派的基本單位,一個(gè)進(jìn)程可以由很多個(gè)線程組成响委,線程間共享進(jìn)程的所有資源略就,每個(gè)線程有自己的堆棧和局部變量。線程由CPU獨(dú)立調(diào)度執(zhí)行晃酒,在多CPU環(huán)境下就允許多個(gè)線程同時(shí)運(yùn)行。同樣多線程也可以實(shí)現(xiàn)并發(fā)操作窄绒,每個(gè)請(qǐng)求分配一個(gè)線程來處理贝次。
線程和進(jìn)程各自有什么區(qū)別和優(yōu)劣呢?
進(jìn)程是資源分配的最小單位彰导,線程是程序執(zhí)行的最小單位蛔翅。
a.地址空間和其它資源:進(jìn)程有自己的獨(dú)立地址空間,每啟動(dòng)一個(gè)進(jìn)程位谋,系統(tǒng)就會(huì)為它分配地址空間山析,建立數(shù)據(jù)表來維護(hù)代碼段、堆棧段和數(shù)據(jù)段掏父,這種操作非常昂貴笋轨。而線程是共享進(jìn)程中的數(shù)據(jù)的,使用相同的地址空間,因此CPU切換一個(gè)線程的花費(fèi)遠(yuǎn)比進(jìn)程要小很多爵政,同時(shí)創(chuàng)建一個(gè)線程的開銷也比進(jìn)程要小很多仅讽。
b.通信:線程之間的通信更方便,同一進(jìn)程下的線程共享全局變量钾挟、靜態(tài)變量等數(shù)據(jù)洁灵,而進(jìn)程之間的通信需要以通信的方式(IPC)進(jìn)行。不過如何處理好同步與互斥是編寫多線程程序的難點(diǎn)掺出。
c.調(diào)度和切換:線程上下文切換比進(jìn)程上下文切換要快得多徽千。
d.健壯性:但是多進(jìn)程程序更健壯,多線程程序只要有一個(gè)線程死掉汤锨,整個(gè)進(jìn)程也死掉了双抽,而一個(gè)進(jìn)程死掉并不會(huì)對(duì)另外一個(gè)進(jìn)程造成影響,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間泥畅。
什么時(shí)候用進(jìn)程荠诬?什么時(shí)候用線程?
進(jìn)程與線程的選擇取決以下幾點(diǎn):
1位仁、需要頻繁創(chuàng)建銷毀的優(yōu)先使用線程柑贞;因?yàn)閷?duì)進(jìn)程來說創(chuàng)建和銷毀一個(gè)進(jìn)程代價(jià)是很大的。
2聂抢、線程的切換速度快钧嘶,所以在需要大量計(jì)算,切換頻繁時(shí)用線程琳疏,還有耗時(shí)的操作使用線程可提高應(yīng)用程序的響應(yīng)
3有决、因?yàn)閷?duì)CPU系統(tǒng)的效率使用上線程更占優(yōu),所以可能要發(fā)展到多機(jī)分布的用進(jìn)程空盼,多核分布用線程书幕;
4、并行操作時(shí)使用線程揽趾,如C/S架構(gòu)的服務(wù)器端并發(fā)線程響應(yīng)用戶的請(qǐng)求台汇;
5、需要更穩(wěn)定安全時(shí)篱瞎,適合選擇進(jìn)程苟呐;需要速度時(shí),選擇線程更好俐筋。