線程詳細概念
一、概述
在windows中,每一個打開運行的應用程序或後臺程序,比如運行中的QQ、谷歌瀏覽器、網易雲音樂、資源管理器等都是一個進程。我們感覺這些程序是“同時”運行的,但實際上,一個處理器同一時刻只能運行一個進程,只是CPU在高速輪換執行讓我們有這樣的錯覺,我們感受不到中斷的原因是CPU執行速度相對於我們的感覺實在是太快了。
我們學c,寫java,大部分時候做的都是單線程的編程。只有一條順序執行的主線——程序從main方法開始,依次執行代碼,直到執行完全部代碼,除非某一行代碼出錯導致主線阻塞。
多線程就是有多條順序執行流“同時”執行,且它們之間互不幹擾。多線程的應用場景,舉一個很簡單的例子,我們寫一個Web網站後臺,如果只支持單線程,那麽同時只能有一個用戶訪問站點,這現實嗎?我們是不是應該為每一個用戶創建一個線程,使每個用戶能“同時”訪問站點。
這裏,我所有的“同時”都畫上了引號,因為在計算機領域,宏觀的“同時”與微觀的“同時”是不同的,它們被叫做並發與並行。
並發是指,同一時刻只能有一條指令(或一個進程、一個線程)運行,但由於CPU的輪換執行速度超乎想象,在宏觀上看,就有多條指令同時執行的效果。
而並行,就像我們平時的理解,是同一時刻有多條指令在多個處理機上同時執行。
二、進程詳述
1、概念
我們都知道程序,一個程序是靜態的,通常是存放在外存中的。而當程序被調入內存中運行後,就成了進程。
顧名思義,進程就是進行中的程序,它是個動態的概念。是系統進行資源分配與調度的基本單位。
2、進程一般有如下三個特點:
a、獨立性:每個進程擁有自己獨立的資源,擁有私有的地址空間,其大小與處理機位數有關,如Win32系統,32位地址映射4GB地址空間,其中低地址的2GB作為用戶模式的虛擬地址空間(應用程序可共享,線程間獨立),高地址的2GB作為內核模式的虛擬地址空間(系統使用)。
b、動態性:這點從進程的概念可以看出,運行中的程序就是進程。進程中有時間、狀態(博文詳解)、生命周期等動態的概念。
c、並發性:多個進程在單個處理器上並發執行。
3、進程主要包含了三個部分:
a、程序代碼:用於描述進程要完成的功能。
b、數據集合:程序執行所需要的數據與工作區域。
c、PCB程序控制塊:包含進程的描述信息與控制信息,是進程的唯一標誌,也正是因為有了PCB,進程就成了一個動態的概念。
三、線程與多線程詳述
1、概念,由線程與進程關系論述
一個進程內部可能包含了很多順序執行流,每個順序執行流就是一個線程。
現在操作系統大多使用搶占式多任務操作策略,以支持多進程的並發性,而多線程是多進程的擴展,使一個進程也能像一個處理器一樣並發處理多項任務,線程就是進程中並發執行的基本單位,線程也因此被稱為“輕量級進程”。一個進程可以包含多個線程,每條線程都有其父進程。
2、線程的資源
我們可能了解過Java的內存機制,聽說過“線程私有”、“線程共享”這樣的名詞,方法棧(通過棧幀中的局部變量表存放局部變量)、程序計數器是線程私有的,它們的內存空間是專屬於某條線程的;而父進程的資源(如代碼段、進程公有數據)是子線程間共享的,對於共享資源區域的編程要十分小心,確保不會影響到其他線程。
3、多線程的優勢,由線程與進程的區別論述
a、獨立的線程與分隔的進程相比,隔離程度更小,因為線程共享了進程的資源,更容易實現線程間通信。
b、系統創建一個進程要為進程分配資源,而創建一個線程,只需要分配線程私有的資源即可,代價小很多,多以用多線程代替多進程實現高並發有更高的效率。
c、多線程編程更加方便,程序代碼級別即可實現。
線程詳細概念