進程、線程、協程(轉)

進程是執行着的應用程序,而線程是進程內部的一個執行序列。一個進程能夠有多個線程。線程又叫作輕量級進程。程序員

 

進程是讓操做系統的僞併發性成爲可能算法

線程是讓進程裏面內部子任務的併發成爲可能併發

最終目標是提升cpu的利用率高併發

 

進程是系統分配的最小單元,線程是cpu調度的最小單元操作系統

進程是具備必定功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源調度和分配的一個獨立單位。.net

線程是進程的實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程

一個進程能夠有多個線程,多個線程也能夠併發執行協程

 

進程的生命週期:建立-就緒-運行-等待-死亡blog

線程的生命週期:新建-就緒-運行-阻塞-等待-鎖池-死亡生命週期

 

二者的對比:

一、調度方面:在引入線程的OS中,線程是獨立的調度和分派單位,而進程做爲資源的擁有單位(至關於把未引入線程的傳統OS中的進程的兩個屬性分開了)。因爲線程不擁有資源,所以能夠顯著的提升併發度以及減小切換開銷。

二、併發性:引入了線程的OS中,進程間能夠併發,並且一個進程內部的多個線程之間也是能夠併發的,這就使OS具備更好的併發性,有效的提升了系統資源利用率和吞吐量。

三、擁有資源:不管OS是否支持線程,進程都是基本的資源擁有單位,線程只擁有不多的基本的資源,可是線程能夠訪問所隸屬的進程的資源(進程的代碼段,數據段和所擁有的系統資源如fd)

四、系統開銷:建立或者撤銷進程的時候,系統要爲之建立或回收PCB,系統資源等,切換時也須要保存和恢復CPU環境。而線程的切換隻須要保存和恢復少許的寄存器,不涉及存儲器管理方面的工做,因此開銷較小。此外,統一進程中的多個線程因爲共享地址空間,因此通訊同步等都比較方便。

 

如何理解一個程序能夠對應多個進程,一個進程也能夠對應多個程序?

        一個程序能夠重複運行,開幾個窗口,好比網遊的「雙開」,一個進程能夠對應多個程序就是一個DLL文件能夠被多個程序運用,好比DirectX9的動態連接庫,就是,許多遊戲都要有它才能運行。這就如同的車和路的關係,要去一個地方,能夠有多條路,而一條路也可到達多個地方。

 

 

從其餘方面詮釋:

        一開始你們想要同一時間執行那麼三五個程序,你們能一塊跑一跑。特別是UI什麼的,別一上計算量比較大的玩意就跟死機同樣。因而就有了併發,從程序員的角度能夠當作是多個獨立的邏輯流。內部能夠是多cpu並行,也能夠是單cpu時間分片,能快速的切換邏輯流,看起來像是你們一塊跑的就行。

        可是一塊跑就有問題了。我計算到一半,剛把屢次方程解到最後一步,你忽然插進來,個人中間狀態咋辦,我用來儲存的內存被你覆蓋了咋辦?因此跑在一個cpu裏面的併發都須要處理上下文切換的問題。進程就是這樣抽象出來的一個概念,搭配虛擬內存、進程表之類的東西,用來管理獨立的程序運行、切換。

        後來一個電腦上有了好幾個cpu,好咧,你們都別閒着,一人跑一個進程。就是所謂的並行。

        由於程序的使用涉及大量的計算機資源配置,把這活隨意的交給用戶程序,很是容易讓整個系統分分鐘被搞跪,資源分配也很難作到相對的公平。因此核心的操做須要陷入內核(kernel),切換到操做系統,讓老大幫你來作。

        有的時候碰着I/O訪問,阻塞了後面全部的計算。空着也是空着,老大就直接把CPU切換到其餘進程,讓人家先用着。固然除了I\O阻塞,還有時鐘阻塞等。一開始你們都這樣弄,後來發現不成,太慢了。爲啥呀,一切換進程得反覆進入內核,置換掉一大堆狀態。進程數一高,大部分系統資源就被進程切換給吃掉了。後來搞出線程的概念,大體意思就是,這個地方阻塞了,但我還有其餘地方的邏輯流能夠計算,這些邏輯流是共享一個地址空間的,不用特別麻煩的切換頁表、刷新TLB,只要把寄存器刷新一遍就行,能比切換進程開銷少點。

        若是連時鐘阻塞、 線程切換這些功能咱們都不須要了,本身在進程裏面寫一個邏輯流調度的東西。那麼咱們便可以利用到併發優點,又能夠避免反覆系統調用,還有進程切換形成的開銷,分分鐘給你上幾千個邏輯流不費力。這就是用戶態線程。

        從上面能夠看到,實現一個用戶態線程有兩個必需要處理的問題:一是碰着阻塞式I\O會致使整個進程被掛起;二是因爲缺少時鐘阻塞,進程須要本身擁有調度線程的能力。若是一種實現使得每一個線程須要本身經過調用某個方法,主動交出控制權。那麼咱們就稱這種用戶態線程是協做式的,便是協程。

        本質上協程就是用戶空間下的線程。

 

用戶線程與內核線程

       根據操做系統內核是否對線程可感知,能夠把線程分爲內核線程和用戶線程。

引入用戶線程,具體而言,有如下四個方面的優點:

    (1)能夠在不支持線程的操做系統中實現。
    (2)建立和銷燬線程、線程切換代價和線程管理的代價比內核線程少得多。
    (3)容許每一個進程定製本身的調度算法,線程管理比較靈活。
    (4)用戶線程可以利用的表空間和堆棧空間比內核級線程多。

用戶線程的缺點主要有如下兩點:
    (1)同一進程中只能同時有一個線程在運行,若是有一個線程使用了系統調用而阻塞,那麼整個進程都會被掛起。
    (2)頁面失效也會產生相似的問題。

 

參考連接:

https://mp.weixin.qq.com/s/zuWRx1FGuBC-_HwuA7jK3w原文:https://blog.csdn.net/qq_35642036/article/details/82798749 

相關文章
相關標籤/搜索