現在的位置: 首頁 > 綜合 > 正文

線程、多線程、進程、多進程是什麼

2020年02月24日 綜合 ⁄ 共 1929字 ⁄ 字型大小 評論關閉

  1.線程和進程簡介:

  進程

  一個進程包括由操作系統分配的內存空間,包含一個或多個線程。一個線程不能獨立的存在,它必須是進程的一部分。一個進程一直運行,直到所有的非守護線程都結束運行後才能結束。

  線程

  又稱其為輕量級進程(Light Weight Process)。是操作系統能夠進行運算調度的最小單位。大部分情況下,它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。他們彼此之間交替執行,稱為多線程;

  多線程

  多線程(英語:multithreading),是指從軟體或者硬體上實現多個線程並發執行的技術。多線程能滿足程序員編寫高效率的程序來達到充分利用 CPU 的目的。

  硬體基礎:

  具有多線程能力的計算機因有硬體支持而能夠在同一時間執行多於一個線程,進而提升整體處理性能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶元級多處理(Chip-level multithreading)或同時多線程(Simultaneous multithreading)處理器。

  軟體多線程:

  即便處理器只能運行一個線程,操作系統也可以通過快速的在不同線程之間進行切換,由於時間間隔很小,來給用戶造成一種多個線程同時運行的假象。這樣的程序運行機制被稱為軟體多線程。如微軟的Windows作業系統和Linux就是在各個不同的線程間來回切換,被稱為單人多任務作業系統。而DOS這類文字介面作業系統在一個時間只能處理一項工作,被視為單人單工作業系統。

  2.操作系統中的多進程

  以圖形化界面操作系統Windows為例,桌面未點擊運行的程序不能稱之為進程,只有點擊運行之後才為進程,運行的進程會在任務管理器上可查看到

  Windows任務管理器

  單核的CPU在任何時間點上只能運行一個進程;而達到實際意義上在同一時間運行多個進程則需要多核CPU,這是最基本的硬體需求。

  單核cpu怎麼進行多進程操作的呢?

  假設我們現在Windows運行QQ,Chrome,IDEA等應用程序,那麼CUP的執行方式如下:

  多進程運行方式

  舉例:CPU先執行運行QQ的一百行代碼,然後進入暫停;CPU接著去執行Chrome一百多行代碼,進入暫停;CPU接著執行IDEA一百行代碼,進入暫停:然後重新回到QQ繼續執行······循環往複~這也體現了CPU的雨露均沾!

  因此這裡操作系統通過快速的在不同進程之間進行切換,因為CPU的執行速度是非常快的,CPU循環依次執行各個程序,以達到給用戶造成一種多個進程同時運行的假象。

  因此當從微觀角度去觀察時,其實線程還是串列進行的,但是從宏觀角度來看,整體是並行進行的,

  即:宏觀並行,微觀串列;

  3.程序中的多線程

  一個進程是由多個線程組成的,他們是包含關係;比如某個程序運行起來需要執行1000行代碼,CPU需要將這些代碼分給多個線程來執行,因為線程才是CPU的最小調度單位,當這些線程執行完畢之後,那麼我們的進程也就隨之執行完畢。

  回顧整個多進程的實現:

  在執行多進程的時候(執行QQ,Chrome,IDEA等應用程序),前文敘述是依次執行一些代碼,循環執行,事實上是,CPU會將每個進程的任務分配給多個線程,(如若QQ,Chrome,IDEA等三個進程分別包含5個線程),然後QQ執行該進程里的第一個線程,執行完畢後開始執行Chrome的第一個進程,其次執行IDEA的第一個進程,然後回到QQ看是執行它的第二個進程······循環往複~ 當這些線程執行完畢之後,那麼我們的進程也就隨之執行完畢。

  4.JVM(Java虛擬機)

  類似地, Java虛擬機是一個進程,當默認中包含主線程(Main),可通過代碼創建多個獨立進程,與Main並發執行。這就是程序員需要做的——多線程編程。

  5.線程的組成

  線程的組成:CPU時間片;運行數據:堆空間、棧空間;線程的邏輯代碼。

  CPU時間片:操作系統會為每個線程分配執行時間(執行的線程對象和執行的時間都是隨機的)。

  運行數據:

  堆空間:存儲線程需使用的對象,多線程可以共享堆中的對象。

  棧空間:存儲線程需使用的局部變數,每個線程都擁有獨立的棧。

  線程邏輯代碼:程序員需要寫相應的邏輯代碼讓CPU執行。

  堆:堆中是用來存放對象的,一個Java程序擁有一個堆,堆對於多個線程來說是可共享的;

  棧:棧裡面存的是棧幀結構,對應的是一個方法,每個方法裡面會有局部變數,僅供本方法使用,因此棧也稱之為線程私有空間;所有的線程都會擁有自己的棧;即:堆空間共享,棧空間獨立。

抱歉!評論已關閉.