生動形象的講解 進程、線程、協程原理

在最原始的時候程序是這樣運行的,我們假設這兩個程序為 A 和 B

而這兩個程序都很大,每個程序大概有幾千到幾萬行代碼,它們兩個的存在意義就是到CPU上去運行,通過計算機和人類進行交互。

CPU 是一個稀缺資源,只有一個,程序 A 和 程序B必須排著隊輪流使用 CPU ,當程序 A

行頭到尾執行完了,讓出 CPU ,讓程序 B 去執行,這種執行邏輯就叫做 “批處理”

進程:

後來由於科技的進步,CPU 的速度越來越快,遠遠超過了內存,硬盤的處理速度,這樣的話這種批處理的方式效率自然就很低了,因為當程序A從硬盤上讀取數據的時候,CPU也一直在等待著,這明顯就造成了極大的浪費,這個空閒的時間完全可以讓程序B來運行以提高效率。但是你還不能完全不管程序A的執行進度,必須要將程序A的執行進度保存下來,比如:執行到哪一行指令了,函數調用到什麼層次了,每個函數調用都有什麼樣的參數,CPU寄存器中的值等,一系列的東西,如果不保存,那麼程序A將無法再繼續執行,而又得重新執行了。

同時為了執行效率:人們還規定了,進程不能長時間佔據CPU,只能在CPU上運行一小會兒,然後馬上切換到別的進程去執行。這個切換幾乎是毫秒級的,以人的速度基本上是感覺不到的,這就是併發執行,也就是為什麼你可以同時能聽著歌聊著天了。

生動形象的講解 進程、線程、協程原理

=======================================================

純個人手打,經常發些好看好玩,改裝,技術貼,在閒暇的時間裡為大家共享一些工作經驗和各種技術資源文章,希望幫助大家共同進步,也希望我的發佈對你有所幫助,喜歡的請點關注,謝謝。你們的關注是我不停發佈的最大動力=======================================================

線程:

再往後,人類的水平逐漸提高,再程序中加入了界面,同時還能訪問網絡資源,每當它聯網的時候就會比較耗時,這時就得吧CPU讓出來給程序B使用,即使程序A再次被調度執行,由於網絡數據還沒有返回,它必須等待,什麼事情都做不了,在人類看來界面根本無法操作,這時我們就會看到 “程序無法響應”,然後就得把進程給結束掉。

後來,為了解決這一尷尬,一個程序中加入了多條執行流程,這多個執行流程可以分別做著不同的操作,而這個流程就稱之為 “線程”,當線程1在讀寫磁盤數據時,線程2在同時處理界面,這樣的話即使有一個線程在忙碌,還有另一個線程可以操作。

於是,一個進程中至少有一個執行的主線程,也可以開啟新的執行線程,線程變成了一個最小的調度單位。

生動形象的講解 進程、線程、協程原理

協程:

協程類似於批處理,協程和線程的區別是:協程避免了無意義的調度,由此可以提高性能,但也因此,程序員必須自己承擔調度的責任,同時,協程也失去了標準線程使用多CPU的能力。協程在多核CPU上不佔優勢

打個比方:假設有一個操作系統,是單核的,系統上沒有其他的程序需要運行,有兩個線程 A 和 B ,A 和 B 在單獨運行時都需要 10 秒來完成自己的任務,而且任務都是運算操作,A B 之間也沒有競爭和共享數據的問題。現在 A B 兩個線程並行,操作系統會不停的在 A B 兩個線程之間切換,達到一種偽並行的效果,假設切換的頻率是每秒一次,切換的成本是 0.1 秒,總共需要 20 + 19 * 0.1 = 21.9 秒。

如果使用協程的方式:可以先運行協程 A, A 結束的時候讓位給協程 B ,只發生一次切換,總時間是 20 + 1 * 0.1 = 20.1 秒。如果系統是雙核的,而且線程是標準線程,那麼 A B 兩個線程就可以真並行,總時間只需要 10 秒,而協程的方案仍然需要 20.1 秒。


分享到:


相關文章: