進程(process)和線程(thread)是操作系統的基本概念。
進程和線程都是CPU工作時間段的描述。
背景:由于CPU與其他PC資源之間速度的不協調,人們想提高資源利用率,所以提出了多任務系統。得益于CPU的計算速度,我們可以“同時”運行多個任務,實質上是多個任務之間輪流使用CPU資源,由于速度超快,給用戶的感覺就是連續的。
如何實現:任務的執行需要依賴各個PC資源,我們可以稱為計算機執行的上下文環境。要實現“同時執行”,就需要不斷輪換,為了下一次繼續從當前狀態執行下去,計算機需要保存切換前的程序上下文。所以有了進程:用進程去描述程序當前上下文的狀態信息----內存位置、變量值、任務ID……所以,進程是資源分配的單位。一般來說宏觀上可以看做是一個軟件的運行,例如一個word文檔的打開。
多個任務之間切換因為要保存上下文、調入上下文,一旦多了的時候,還是有一定的時間消耗。為了進一步提高資源利用率,人們在進程中,引入了線程,線程只是CPU輪流調度的單位,其他上下文信息用所在進程中的。這樣上下文切換的耗時就降了下來。同樣的,宏觀上來可以看做是一個軟件中的多個處理功能,例如上述打開word中拼寫檢查功能、字體加粗……
區別:
進程:
進程是具有獨立功能的程序關于某個數據集合上的一次運行活動,是系統進行資源分配的獨立單位。
進程之間的地址空間是相互獨立的,每個進程都是用虛擬地址空間,每個進程都以為整個地址空間只有自已在運行。操作系統在進行進程切換時,要把每個進程的上下文保存完整;
進程之間不能共享資源;
進程切換的開銷較大。
線程:
線程是進程中的一個執行路徑。(進程可以創建多個線程);
線程是CPU調度的單位;
線程共享所在進程的地址空間和其它資源。同時線程還有自己的棧和棧指針,程序計數器等寄存器;
線程沒有自己獨立的地址空間,線程必須依賴于進程而存在;
線程切換的開銷相對較小。
其他術語:
并發:
Concurrency,是并發的意思。并發的實質是一個物理CPU(也可以多個物理CPU) 在若干道程序(或線程)之間多路復用,并發性是對有限物理資源強制行使多用戶共享以提高效率。
從微觀角度看,所有的并發處理都有排隊等候、喚醒、執行等這樣的步驟,在微觀上他們都是序列被處理的,如果是同一時刻到達的請求(或線程)也會根據優先級的不同,而先后進入隊列排隊等候執行。
從宏觀角度看,多個幾乎同時到達的請求(或線程)在宏觀上看就像是同時在被處理。
并行:
Parallelism,即并行,指兩個或兩個以上事件(或線程)在同一時刻發生,是真正意義上的不同事件或線程在同一時刻,在不同CPU資源呢上(多核),同時執行。并行,不存在像并發那樣競爭,等待的概念。
通過多線程實現并發,并行:
1.java中的Thread類定義了多線程,通過多線程可以實現并發或并行。
2.在CPU比較繁忙,資源不足的時候(開啟了很多進程),操作系統只為一個含有多線程的進程分配僅有的CPU資源,這些線程就會為自己盡量多搶時間片,這就是通過多線程實現并發,線程之間會競爭CPU資源爭取執行機會。
3.在CPU資源比較充足的時候,一個進程內的多線程,可以被分配到不同的CPU資源,這就是通過多線程實現并行。
4.至于多線程實現的是并發還是并行?上面所說,所寫多線程可能被分配到一個CPU內核中執行,也可能被分配到不同CPU執行,分配過程是操作系統所為,不可人為控制。所有,如果有人問我我所寫的多線程是并發還是并行的?我會說,都有可能。
5.不管并發還是并行,都提高了程序對CPU資源的利用率,最大限度地利用CPU資源。
串行、并行:
并行和串行指的是任務的執行方式。串行是指多個任務時,各個任務按順序執行,完成一個之后才能進行下一個。并行指的是多個任務可以同時執行,異步是多個任務并行的前提條件。
異步和同步
異步和同步是相對的,同步就是順序執行,執行完一個再執行下一個,需要等待、協調運行。異步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這一事件完成后再工作。線程就是實現異步的一個方式。異步是讓調用方法的主線程不需要同步等待另一線程的完成,從而可以讓主線程干其它的事情。
并發編程又叫多線程編程
并發的實質是一個物理CPU(也可以多個物理CPU) 在若干道程序之間多路復用,并發性是對有限物理資源強制行使多用戶共享以提高效率。