? ? ? 先講清楚程序的概念:程序是一個(gè)沒有生命的實(shí)體惭婿。CPU賦予了程序有時(shí)限的生命找田,這樣它就成為了一個(gè)“活”的實(shí)體-進(jìn)程歌憨,進(jìn)程是一個(gè)執(zhí)行中的程序。
1.進(jìn)程就像一個(gè)大容器午阵。在程序被運(yùn)行之后躺孝,就相當(dāng)于將程序裝進(jìn)了這個(gè)容器,然后你還可以往容器里面加其他東西底桂,比如一些共享庫植袍。當(dāng)程序被運(yùn)行兩次時(shí),容器里的東西并不會被倒掉籽懦,而是再找一個(gè)新的容器來裝程序于个。
2.線程也屬于進(jìn)程的一部分,相當(dāng)于在進(jìn)程這個(gè)容器中又劃分出了許多小間隔暮顺。這些小間隔將進(jìn)程這個(gè)大容器中的程序劃分成了很多獨(dú)立的部分厅篓。但是這些小間隔并沒有將整個(gè)程序劃分干凈秀存,還留下了一些,而留下的這些可以在任意的小間隔中游蕩羽氮。
總的說或链,進(jìn)程包含了若干個(gè)線程但是不只有線程,每一個(gè)進(jìn)程都有它自己的地址空間档押,一般情況下澳盐,包括文本區(qū)域(text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)令宿。文本區(qū)域存儲處理器執(zhí)行的代碼叼耙;數(shù)據(jù)區(qū)域存儲變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存;堆棧區(qū)域存儲著活動(dòng)過程中調(diào)用的指令和本地變量粒没。
進(jìn)程有獨(dú)立的地址空間筛婉,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響癞松,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑爽撒。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間拦惋,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉匆浙,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí)厕妖,耗費(fèi)資源較大,效率要差一些挑庶。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作言秸,只能用線程,不能用進(jìn)程迎捺。
windows和linux:
windows是支持線程這一派的操作系統(tǒng)举畸,往往在系統(tǒng)內(nèi)部是以線程的調(diào)度為實(shí)體篱蝇,進(jìn)程對他來說就是一堆數(shù)據(jù)結(jié)構(gòu)星澳。以Unix為代表的支持進(jìn)程這一派的操作系統(tǒng),其系統(tǒng)調(diào)度實(shí)體是進(jìn)程粥庄,而線程基本上是在酸澹花招叛买。所以windows調(diào)度起來遠(yuǎn)比Unix要靈活的多。
1.Linux采用了NPTL蹋订,原生POSIX線程庫率挣。Windows的調(diào)度實(shí)體就是線程,進(jìn)程只是一堆數(shù)據(jù)結(jié)構(gòu)露戒。而Linux不是椒功。Linux將進(jìn)程和線程做了同等對待捶箱,進(jìn)程和線程在內(nèi)核一級沒有差別,只是通過特殊的內(nèi)存映射方法使得它們從用戶的角度看來有了進(jìn)程和線程的差別动漾。
2.Windows至今也沒有真正的多進(jìn)程概念丁屎,創(chuàng)建進(jìn)程的開銷遠(yuǎn)大于創(chuàng)建線程的開銷。Linux則不然旱眯。Linux在內(nèi)核一級并不區(qū)分進(jìn)程和線程悦屏,這使得創(chuàng)建進(jìn)程的開銷與創(chuàng)建線程的開銷差不多。
3.Windows與Linux的任務(wù)調(diào)度策略也不盡相同键思。Windows會隨著線程越來越多而變得越來越慢础爬,這也是為什么Windows服務(wù)器在運(yùn)行一段時(shí)間后必須重啟的原因。但是Linux卻可以持續(xù)很長時(shí)間吼鳞,系統(tǒng)效率也沒怎么變化看蚜。