進程線程總是無法理解,小記一下

    進程和線程都是一個時間段的描述,是CPU工作時間段的描述,不過是顆粒大小不同。


    CPU+RAM+各種資源(比如顯卡,光驅,鍵盤,GPS,等等外設)構成我們的電腦,但是電腦的運行,實際就是CPU和相關寄存器以及RAM之間的事情。(計算機導論應該講     過)

  

     CPU的速度相當非常快,寄存器僅僅能追上他的腳步,RAM和別的掛在個總線上的設備完全是望其項背。那當多個任務要執行的時候怎麼辦呢?輪着來?或者優先級高誰來?

不管怎麼樣的策略,一句話就是在CPU看來就是輪着來的。


     執行一段程序代碼,實現一個功能的過程:

     當得到CPU的時候,相關的資源必須就位,就是顯卡啊,GPS啊什麼的必須就位,然後CPU開始執行。這裏除了CPU以外所有的就構成了程序的執行環境,也就是我們所定義的程序上下文。當這個程序執行完了,或者分配給他的CPU執行時間用完了,那麼它就要被切換出去,等待下一次CPU的臨幸。在被切換出去的最後一步工作就是保存程序上下文本,因爲這個是下次他被臨幸的運行環境,必須保存。

      在CPU看來所有的任務都是一個一個的輪流執行的,具體的輪流方法就是:

       先加載程序A的上下文,然後開始執行A,保存A的上下文,調入下一個要執行的程序B的程序上下文,然後開始執行B,保存程序B的上下文。

      

      進程和線程就是在這樣的背景下出來的,兩個名詞不過是對應的CPU時間段的描述。

      進程就是包括上下文切換的程序執行時間總和 = CPU加載上下文+CPU執行+CPU保存上下文

      

      線程是什麼?

      進程的顆粒度太大,每次都要有上下的調入,保存,調出。如果我們把進程比喻爲一個正在運行在電腦上的軟件,那麼一個軟件的執行不可能是一條邏輯執行的,必須有多個分支和多個程序段,就好比要實現程序A,實際分出去a,b,c等多個塊組合而成 。那麼這具體執行就可能變成:

      程序A得到CPU=》CPU加載上下文,開始執行程序A的a小段,然後執行A的b小段,然後執行A的c小段,最後CPU保存A的上下文。

      這裏a,b,c的執行共享A的上下文,CPU在執行的時候沒有進行上下文切換的。這裏的a,b,c就是線程,也就是說線程是共享了進程上下文環境的更細小的CPU時間段。

      資源共享是線程,資源獨立是進程;開銷小線程,開銷大進程。

      

      DOS時代,操作系統處理問題都是單任務的,我想做聽音樂和看小說兩件事兒,那麼一定要先排一下順序。隨着計算機的發展便出現了併發,是聽音樂和看電影這兩件事可以同時進行。

     CPU多核心的計算機(擁有多個處理器或者多核處理器或者兩者兼具),這些計算機都能並行運行超過一個任務。一個雙核計算機在處理這兩個任務時,每個任務可以在各自的核心執行。這樣可以實現一邊聽歌和看小說。但是,通常我們會打開電腦同時做很多事情,瀏覽不同的網頁,打開文本編輯器,聽歌,發qq等。硬件併發會受到硬件核心數或者處理器的限制。於是存在另一種實現併發的方式。

       多線程:

       我們的CPU也越來越快,CPU可以同時幹多個活都沒問題。我們可以一邊看小說和一邊聽歌。很多語言支持多線程。

       python 提供了thread和threading模塊實現多線程。

       C++也有頭文件<thread>作爲對多線程的支持。

      多進程編程相對安全,因爲一個進程崩潰,主進程不會影響。多線程在開銷上比較小,但是一個崩潰就全崩潰了。一般是進程與線程共用。多進程開啓任務,線程負責處理和監控。



發佈了55 篇原創文章 · 獲贊 22 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章