進(jìn)程
“進(jìn)程” 兩字,我第一次看到應(yīng)該是在用Windows系統(tǒng)時(shí),當(dāng)我的軟件卡死,沒辦法退出,我會調(diào)出任務(wù)管理器,然后看到上面有各種進(jìn)程,其中運(yùn)行著我的各種已經(jīng)打開的軟件,所以我通俗地把他理解為系統(tǒng)里面的一個(gè)應(yīng)用程序。
線程
“線程”兩字,是我做iOS開發(fā)之后才看到的,在我的理解就是,CPU處理多任務(wù)時(shí),有些任務(wù)是可以一個(gè)一個(gè)地按順序執(zhí)行,但是同時(shí)也有一些任務(wù)是必須同時(shí)進(jìn)行,就像我們在進(jìn)行網(wǎng)絡(luò)請求時(shí),因?yàn)檫@個(gè)操作是一個(gè)相對較耗時(shí)的操作,如果我們讓CPU按順序去執(zhí)行這些操作的話,那我們在網(wǎng)絡(luò)請求的過程中去點(diǎn)擊界面,我們將會比較久才得到響應(yīng)(俗稱卡頓),這是因?yàn)镃PU要處理完網(wǎng)絡(luò)請求之后才會處理我們點(diǎn)擊的相應(yīng),這樣就造成很差的用戶體驗(yàn),由此,多線程就產(chǎn)生了,而線程就是我們CPU運(yùn)行這個(gè)應(yīng)用程序時(shí)開的一條處理任務(wù)的路徑,多線程就是我們CPU在執(zhí)行多個(gè)任務(wù)時(shí)開了多條路徑,各自在個(gè)自的線程上執(zhí)行,互不影響,從而避免了界面的卡頓。
以上是我自己的理解,下面貼上知乎上面一個(gè)解釋地比較專業(yè)和透徹的回答:
首先來一句概括的總論:進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是CPU工作時(shí)間段的描述。
下面細(xì)說背景:CPU+RAM+各種資源(比如顯卡,光驅(qū),鍵盤,GPS, 等等外設(shè))構(gòu)成我們的電腦,但是電腦的運(yùn)行,實(shí)際就是CPU和相關(guān)寄存器以及RAM之間的事情。
一個(gè)最最基礎(chǔ)的事實(shí):CPU太快,太快,太快了,寄存器僅僅能夠追的上他的腳步,RAM和別的掛在各總線上的設(shè)備完全是望其項(xiàng)背。那當(dāng)多個(gè)任務(wù)要執(zhí)行的時(shí)候怎么辦呢?輪流著來?或者誰優(yōu)先級高誰來?不管怎么樣的策略,一句話就是在CPU看來就是輪流著來。
一個(gè)必須知道的事實(shí):執(zhí)行一段程序代碼,實(shí)現(xiàn)一個(gè)功能的過程介紹 ,當(dāng)?shù)玫紺PU的時(shí)候,相關(guān)的資源必須也已經(jīng)就位,就是顯卡啊,GPS啊什么的必須就位,然后CPU開始執(zhí)行。這里除了CPU以外所有的就構(gòu)成了這個(gè)程序的執(zhí)行環(huán)境,也就是我們所定義的程序上下文。當(dāng)這個(gè)程序執(zhí)行完了,或者分配給他的CPU執(zhí)行時(shí)間用完了,那它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最后一步工作就是保存程序上下文,因?yàn)檫@個(gè)是下次他被CPU臨幸的運(yùn)行環(huán)境,必須保存。串聯(lián)起來的事實(shí):前面講過在CPU看來所有的任務(wù)都是一個(gè)一個(gè)的輪流執(zhí)行的,具體的輪流方法就是:先加載程序A的上下文,然后開始執(zhí)行A,保存程序A的上下文,調(diào)入下一個(gè)要執(zhí)行的程序B的程序上下文,然后開始執(zhí)行B,保存程序B的上下文。。。。
========= 重要的東西出現(xiàn)了========進(jìn)程和線程就是這樣的背景出來的,兩個(gè)名詞不過是對應(yīng)的CPU時(shí)間段的描述,名詞就是這樣的功能。進(jìn)程就是包換上下文切換的程序執(zhí)行時(shí)間總和 = CPU加載上下文+CPU執(zhí)行+CPU保存上下文線程是什么呢?進(jìn)程的顆粒度太大,每次都要有上下的調(diào)入,保存,調(diào)出。如果我們把進(jìn)程比喻為一個(gè)運(yùn)行在電腦上的軟件,那么一個(gè)軟件的執(zhí)行不可能是一條邏輯執(zhí)行的,必定有多個(gè)分支和多個(gè)程序段,就好比要實(shí)現(xiàn)程序A,實(shí)際分成 a,b,c等多個(gè)塊組合而成。那么這里具體的執(zhí)行就可能變成:程序A得到CPU =》CPU加載上下文,開始執(zhí)行程序A的a小段,然后執(zhí)行A的b小段,然后再執(zhí)行A的c小段,最后CPU保存A的上下文。這里a,b,c的執(zhí)行是共享了A的上下文,CPU在執(zhí)行的時(shí)候沒有進(jìn)行上下文切換的。這里的a,b,c就是線程,也就是說線程是共享了進(jìn)程的上下文環(huán)境,的更為細(xì)小的CPU時(shí)間段。
到此全文結(jié)束,再一個(gè)總結(jié):進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是CPU工作時(shí)間段的描述,不過是顆粒大小不同。
最后,我再打個(gè)簡單比喻:
進(jìn)程就像我國的鐵路局運(yùn)營的所有高鐵站,線程就像每個(gè)高鐵站里面的線路,例如廣州站里面有去湖南的線路,有去廈門的線路、有去云南的線路。
以上為我個(gè)人理解,如有不對或者不全,歡迎更正和補(bǔ)充,謝謝!