進(jìn)程
進(jìn)程之間不共享任何狀態(tài)优烧,進(jìn)程的調(diào)度由操作系統(tǒng)完成,每個進(jìn)程都有自己的獨(dú)立的內(nèi)存空間链峭,進(jìn)程間的通訊主要是通過信號傳遞的方式來實(shí)現(xiàn)的畦娄,實(shí)現(xiàn)的方式有多種,信號量弊仪,管道熙卡,事件等,任何一種方式的通訊效率都需要通過內(nèi)核励饵,導(dǎo)致通訊效率比較低驳癌。由于是獨(dú)立的內(nèi)存空間,上下文切換的時候需要保存先調(diào)用棧的信息役听,CPU各寄存器的信息颓鲜,虛擬內(nèi)存,以及打開的相關(guān)句柄等信息典予,所以導(dǎo)致上下文進(jìn)程間切換開銷很大甜滨,通訊麻煩。
線程
線程之間共享變量瘤袖,解決了通訊麻煩的問題衣摩,但對變量的訪問需要鎖,線程的調(diào)度主要也是有操作系統(tǒng)完成捂敌,一個進(jìn)程可以擁有多個線程艾扮,但是其中每個線程會共享父進(jìn)程向操作系統(tǒng)申請資源,這個包括虛擬內(nèi)存占婉,文件等泡嘴,由于是共享資源,所以創(chuàng)建線程所需要的系統(tǒng)資源占用比進(jìn)程小很多锐涯,相應(yīng)的可創(chuàng)建的線程數(shù)量也變得相對多很多磕诊。線程時間的通訊除了可以使用進(jìn)程之間通訊的方式之外還可以通過共享內(nèi)存的方式進(jìn)行通信填物,所以這個速度比通過內(nèi)核要快很多纹腌。另外在調(diào)度方面也是由于內(nèi)存是共享的,所以上下文切換的時候需要保存的東西就相對少一些滞磺,這樣一來上下文切換也變得高效
協(xié)程
協(xié)程的調(diào)度完全由用戶控制升薯,一個線程可以有多個協(xié)程,用戶創(chuàng)建了幾個線程击困,然后每個線程都是循環(huán)按照指定的任務(wù)清單順序完成不同的任務(wù)涎劈,當(dāng)任務(wù)被堵塞的時候執(zhí)行下一個任務(wù)广凸,當(dāng)恢復(fù)的時候再回來執(zhí)行這個任務(wù),任務(wù)之間的切換只需要保存每個任務(wù)的上下文內(nèi)容蛛枚,就像直接操作棧一樣的谅海,這樣就完全沒有內(nèi)核切換的開銷,可以不加鎖的訪問全局變量蹦浦,所以上下文的切換非撑び酰快;另外協(xié)程還需要保證是非堵塞的且沒有相互依賴盲镶,協(xié)程基本上不能同步通訊侥袜,多采用一步的消息通訊,效率比較高溉贿。
進(jìn)程與線程的定義
進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運(yùn)行活動枫吧,進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的單位。
線程是進(jìn)程的一個實(shí)體宇色,是CPU調(diào)度和分派的基本單位九杂,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線程自己基本上不擁有系統(tǒng)資源代兵,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計數(shù)器尼酿,一組寄存器和棧),但是它可與同屬于一個進(jìn)程的其他的線程共享進(jìn)程所擁有的全部資源植影。
線程與進(jìn)程的關(guān)系
一個線程可以創(chuàng)建和銷毀另一個線程裳擎,同一個進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行。相對進(jìn)程而言思币,線程是一個更加接近執(zhí)行體的概念鹿响,它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的椆榷觯空間惶我,擁有獨(dú)立的執(zhí)行序列。
線程與進(jìn)程的區(qū)別
進(jìn)程與線程的主要差別在于它們是不同的操作系統(tǒng)的資源管理方式博投。進(jìn)程有獨(dú)立的地址空間绸贡,一個進(jìn)程崩潰后,在保護(hù)模式下不會對其他進(jìn)程產(chǎn)生影響毅哗,而線程死掉就等于整個進(jìn)程死掉听怕,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時虑绵,耗費(fèi)資源較大尿瞭,效率要差一些。但對于一些要求同時進(jìn)行并且又要共享某些變量的并發(fā)操作翅睛,只能用線程声搁,不能用進(jìn)程黑竞。
1)一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程疏旨。
2)線程的劃分尺度小于進(jìn)程很魂,使得多線程程序的并發(fā)性高。
3)另外檐涝,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元莫换,而多個線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率骤铃。
4)線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的拉岁。每個獨(dú)立的線程有一個程序運(yùn)行的入口,順序執(zhí)行序列和程序的出口惰爬。但是線程不能夠獨(dú)立執(zhí)行喊暖,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制撕瞧。
5)從邏輯角度來看陵叽,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行丛版。但操作系統(tǒng)并沒有將多個線程看做多個獨(dú)立的應(yīng)用巩掺,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別页畦。
線程與進(jìn)程的優(yōu)缺點(diǎn)
線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小胖替,但不利于資源的管理和保護(hù);而進(jìn)程正相反豫缨。同時線程適合于在SMP機(jī)器上運(yùn)行独令,而進(jìn)程則可以跨機(jī)器遷移。
這個解釋是我看到最容易讓人理解的好芭,耐心讀下來
一般將進(jìn)程定義為一個正在運(yùn)行的程序的實(shí)例燃箭。我們在任務(wù)管理器重所看到的每一項(xiàng),就可以理解為一個進(jìn)程舍败,每個進(jìn)程都有一個地址空間招狸,這個地址空間里有可執(zhí)行文件的代碼和數(shù)據(jù),以及線程堆棧等邻薯。一個程序至少有一個進(jìn)程裙戏。進(jìn)程可以創(chuàng)建子進(jìn)程,創(chuàng)建的子進(jìn)程可以和父進(jìn)程一起工作弛说,也可以獨(dú)立運(yùn)行挽懦。
而線程是隸屬于進(jìn)程的翰意,也就是說木人,線程是不能單獨(dú)存在的信柿,線程存在于進(jìn)程中。每個進(jìn)程至少有一個主線程醒第,進(jìn)程里的線程就負(fù)責(zé)執(zhí)行進(jìn)程里的代碼渔嚷,這也叫做進(jìn)程的“惰性”。線程所使用的資源是它所屬的進(jìn)程的資源稠曼。線程也有自己的資源形病,主要組成部分就是一些必要的計數(shù)器和線程棧,占用的資源很少霞幅。我們可以理解為進(jìn)程就是個容器漠吻,而線程才是真正干活的。線程可以在內(nèi)核空間實(shí)現(xiàn)司恳,也可以在用戶空間實(shí)現(xiàn)途乃。
下面列舉一下進(jìn)程和線程中的一些概念。
進(jìn)程:創(chuàng)建扔傅,銷毀耍共,創(chuàng)建子進(jìn)程(fork),優(yōu)先級猎塞。
線程:創(chuàng)建试读,掛起,恢復(fù)荠耽,銷毀钩骇,切換,協(xié)作铝量,睡眠伊履,喚醒,等待款违,同步唐瀑,鎖,優(yōu)先級
擴(kuò)展知識
linux沒有內(nèi)核上的多線程實(shí)現(xiàn)插爹,但是不能說linux沒有多線程哄辣。WINDOWS有內(nèi)核的多線程實(shí)現(xiàn)。
進(jìn)程開銷大赠尾,線程開銷小力穗,但是linux的進(jìn)程和線程開銷差異不明顯。
并行的實(shí)現(xiàn)離不開多線程气嫁。