程序,進程,線程的最形象理解(理解不了可以直接懟我)


備注:閱讀本博客之前,需要具備一點面向對象編程的知識(很少的一部分,別慌)

關於進程的一點理解

在任何時刻需要記住一點:任何某一時刻CPU只能執行一條指令,為 一個進程服務,而不是多個進程服務。

什么是多進程?

比如你可以一邊聽網易音樂,一邊聊天;這是兩個不同的進程,這就是多進程;

但是上文說某一時刻CPU只能干一件事情,是否矛盾?

        在操作系統的管理下,所有正在運行的進程輪流使用CPU,每個進程允許占用CPU的時間非常短(比如1毫秒),這樣用戶根本感覺不出來 CPU是在輪流為多個進程服務,就好象所有的進程都在不間斷地運行一樣,給用戶的感覺就是並行。但實際上在任何一個時間內有且僅有一個進程占有CPU(這就是實現並發技術的時間片輪流調度算法)。 

程序,進程,線程的血緣關系(不看后悔)

我們究竟應該如何理解程序,理解進程,理解線程呢?下面講解一些我個人對於程序,對於進程,對於線程的理解:

從另一個角度看程序和進程

        假如對於QQ這個應用程序(注意這里我們稱其為程序),張三可以登錄他自己的QQ,李四也可以在同一台電腦上,同一個系統下登錄他的QQ;再比如,同一個 瀏覽器你也可以打開兩次;注意,我們在QQ未運行的時候,並沒有說:這是張三的QQ,或者這是李四的QQ,我們給它取了個名字:QQ應用程序;瀏覽器也可以同時打開兩次;但我們並沒有因此而區分他們,我們仍然管"他們''叫做瀏覽器。可這和我們理解程序和進程有什么關系呢?

        學習c++或者Java的時候,我們學習類這個概念, 並學習了如何創建類;也學習了對象這個概念,並認識到對象是類的實例化 ,說到這里的時候,是否有些明白?不明白我再講的具體一些:

        學習創建類的時候,我們知道,創建一個類並不為這個類分配內存;而根據這個類來創建一個對象的時候,則是分配了內存;而且一個類是可以創建多個對象的。有沒有發現這和程序和進程的概念有些相似.

        對於桌面上的未打開的 QQ應用程序,就如同我們創建的一個類,我們暫且把它 稱為 QQ類 吧;寫QQ應用軟件的過程,就如同創建一個類的過程; 桌面上未打開的QQ應用程序 是裝在磁盤里面的吧,並沒有為其分配內存空間吧;而當我們打開它,並登錄張三的賬號的時候,實際上就如同一個類創建了一個對象一個;我們不妨把這個對象稱之為:張三QQ 吧,那么你也知道,這個張三QQ 對象是 占了內存空間的;而這個打開的 張三QQ 對象,我們給它的稱呼就是:進程;當然針對同一個QQ應用程序,你同樣可以創建一個:李四QQ 進程;這就如同一個類實例化多個對象一樣

        也就是從本質上講:進程是程序在內存中的實例化!!!雖然這個實例化的過程是相當的復雜,涉及到操作系統多方面的知識,但是其本質並未發生變化,至於這個實例化的過程,后續再作說明。

從另一個角度看進程和線程

      上面的例子中,將程序比作聲明的類,將進程比作類的實例化:對象。那么線程又該處於一個什么地位呢?回顧一下我們類的組成:成員變量和成員方法。我們再來問這樣一個問題:當我們要用類來實現一個功能的時候,我們是通過誰來實現的?

      毫無疑問,我們必須先實例化一個對象,因為類只是一個抽象概念,你連內存空間都沒有,你說尼瑪呢?實例化了一個對象后,我們具備實現一個功能的條件,但是實現這個功能是通過對象實現的嗎?顯然不是,你創建了類,或許調用了構造函數,或許為該對象進行了相關配置;但是接觸過面向對象的人都知道,是類方法,也就是最終我們實現某一個功能,落腳到了類方法,比如,我們要改變某個類成員,或者完成與其他對象的交互,是通過類方法來完成這件事情的,因此,類方法就就類比到了:線程。(其實你仔細想想:當一個函數被調用的時候,程序計數器發生的改變(保存並跳轉),堆棧的改變(重新為新的函數建立棧).....你有沒有思考過,這個過程和線程調度時底層發生的事件是何其的相似啊!!!)

也就是對象保證了我們有內存空間(就像進程提供了資源一樣);但最終的實現是通過類方法來實現功能的,而這,就是線程

 轉載請注明出處,謝謝,如有不懂或者見解,請留言!

 


免責聲明!

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



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