進程、線程與協程


進程

進程是指在系統中正在運行的一個應用程序,是CPU的最小工作單元。

進程運行中的三種狀態:就緒、運行、阻塞。創建和退出是描述產生和釋放的狀態。

在任務簡單or偏向CPU密集型(計算多IO少)時,進程的CPU利用率較高。隨着程序功能越來越復雜,常規的程序更加偏向IO密集型。但IO存在阻塞等待的特點,當一個程序獲得了CPU的時間片由就緒態切換至運行態,往往因為長時間等待IO而進入阻塞態,在IO操作完成后進入就緒態,在下一次獲得CPU時間片時才能完成。

無法即時完成的任務帶來大量的上下文切換代價與時間代價。

    • 進程的上下文:當一個進程在執行時,CPU的所有寄存器中的值、進程的狀態以及堆棧中的內容被稱為該進程的上下文。
    • 上下文切換:當內核需要切換到另一個進程時,它需要保存當前進程的所有狀態,即保存當前進程的上下文,以便在再次執行該進程時,能夠得到切換時的狀態並執行下去。

 

當人們開始思考使用更小的粒度提高進程單位時間的CPU利用率,線程應運而生。

線程

線程是CPU的最小執行單元(調度單元)。

進程作為線程的容器,按不同的功能,或想達到更高效率(如多個IO線程)的同一功能,可以考慮產生多個線程。

在CPU切換到本進程的時間段時,由於線程間共享進程的上下文,線程切換只需要切換線程的上下文,而不需要切換另一片內存或者寄存器資源,在功能並行執行的同時降低了開銷。

    • 開更多的線程不會導致本進程得到更多CPU的青睞

進程才是CPU的最小作業單元(最小資源管理單元),開更多的線程不會導致本進程得到更多CPU的青睞,而是提高了CPU在本進程使用時間段的利用率。但是,本進程使用時間段的各線程優先級是用戶可以自己設置的。

 

協程

雖然線程大幅的提高了CPU的效率,且能夠設置一定的優先級,但是線程的資源片分配還是由CPU來管理的。

那么能不能人為管理線程的資源分配(切換)呢?協程在語言層面實現了這一點。

協程=微線程=纖程

如同一個進程可以有很多線程一樣,一個線程可以有很多協程。

但是,協程不是被操作系統所管理的,沒有改變CPU最小執行單元是線程,協程是完全由程序所控制的(用戶態執行),不會產生上下文切換。

 

目前只有部分語言實現了協程

  1. python的yield/send,當協程執行到yield關鍵字時,會暫停在那一行,等到主線程調用send方法發送了數據,協程才會接到數據繼續執行。
  2. Lua從5.0版本開始使用協程,通過擴展庫coroutine來實現。
  3. Go語言對協程的實現非常強大而簡潔,可以輕松創建成百上千個協程並發執行。
  4. Java語言並沒有對協程的原生支持,但是某些開源框架模擬出了協程的功能,有興趣的小伙伴可以看一看Kilim框架的源碼:https://github.com/kilim/kilim


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM