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