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