無論我們寫出怎樣的程序,最後都是由操作系統來運行我們的程序,而操作系統如何管理我們的程序,我們程序的數據如何保存和計算,這些都是操作系統需要處理的事情,我們隻要将寫好的程序交給操作系統就好。
雖然操作系統可以幫助我們做很多事情,但是它并不是萬能的,有時候我們需要告訴它如何處理,或者說我們需要按照它的規則來辦事。而操作系統本質的作用就是用來管理調度内存和cpu。
進程
進程是操作系統分配資源的最小單位,也就是我們寫的每個程序都至少包含一個進程,當然也可能包括多個進程。在進程中,我們有自己的資源管理,我們可以申請内存,可以進行數據的運算,這些都是進程需要處理的事情。
線程
既然有了進程,為什麼還要線程呢?因為進程切換太消耗資源了。我們知道一個事物或者一種方法的出現,一定是為了解決某種問題或者某些問題。而線程的出現就是為了方便操作系統調度,因此,線程是操作系統調度的最小單位。一個進程裡面可以有一個線程,也可以有多個線程,多個線程之間互相做自己的事情,但是它們共享進程的存儲空間,也就是說它們都可以訪問進程的内存空間,這樣的好處就是方便線程的通信,缺點也很明顯,如果多個線程都想同時修改共享内存的數據,它們就會産生競争,而鎖的機制就是為了解決共享内存的線程之間修改共享内存的一種方法。
攜程
進程的創建需要最多的資源,線程需要的資源比它小很多,但是人們似乎還是不滿意,于是協程誕生了,它需要的資源的更少,隻需要幾kb,也就是說一個普通的主機也能夠輕輕松松啟動幾十萬個協程。之前我們說過,進程是cpu分配資源的最小單位,線程是cpu管理的最小單位,那麼協程cpu怎麼管理呢?答案就是操作系統cpu不直接管理協程,而是由用戶自己去管理,因此,我們經常也把協程叫做用戶态線程。
既然協程是有用戶管理的,因此我們可以根據我們的需要在不同協程之間進行切換,比如當一個協程遇到io耗時操作的時候,我們可以将cpu資源切換到其它協程,這樣我們就可以大幅提升cpu利用率。
雖然協程很方便,但是由于需要用戶自己去管理狀态切換,因此用戶需要實現一個處理器調度機制,這其實并不簡單,這也是為什麼知道最近才有很多語言實現協程。
總結
無論是進程,線程還是協程,它們統一說來都是一個資源塊,都是可以被cpu調度的一塊代碼塊,不同的就是cpu是如何調度它們的。操作系統通過進程和線程的管理來處理cpu的調度,操作系統封裝了進程和線程的實現,我們隻需要做的就是讓我們的程序盡可能合理分配處理器資源。
當明白了這些,我們更多關注的就是進程之間如何通信,線程和進程之間如何通信,協程間如何通信,這些其實才是我們在編碼過程中投入更多精力關注的。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!