進程、線程、協程三個概念傻傻分不清
進程,是并發(fā)執(zhí)行的程序在執(zhí)行過程中分配和管理資源的基本單位,每一個進程都有一個自己的地址空間,即進程空間或(虛空間)。
進程空間的大小 只與處理機的位數有關,一個 16 位長處理機的進程空間大小為 216 ,而 32 位處理機的進程空間大小為 232 。
進程至少有 5 種基本狀態(tài),它們是:初始態(tài),執(zhí)行態(tài),等待狀態(tài),就緒狀態(tài),終止狀態(tài)。

線程,在網絡或多用戶環(huán)境下,一個服務器通常需要接收大量且不確定數量用戶的并發(fā)請求,為每一個請求都創(chuàng)建一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。
因此,操作系統中線程的概念便被引進了。線程,是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱為輕權進程或輕量級進程,也是 CPU 調度的一個基本單位。
共享進程的地址空間,全局變量(數據和堆)。在一個進程中,各個線程共享堆區(qū),而進程中的線程各自維持自己的棧。

Each thread has its own:
棧區(qū)和棧指針(Stack area and stack pointer)
寄存器(Registers)
調度優(yōu)先級Scheduling properties (such as policy or priority)
信號(阻塞和懸掛)Signals (pending and blocked signals)
普通變量Thread specific data ( automatic variables )
線程是指進程內的一個執(zhí)行單元,也是進程內的可調度實體.
與進程的區(qū)別:
(1)地址空間:進程內的一個執(zhí)行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3)線程是處理器調度的基本單位,但進程不是.
4)二者均可并發(fā)執(zhí)行.
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發(fā)性。簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。
另外,進程在執(zhí)行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨立執(zhí)行,必須依存在應用程序中,由應用程序提供多個線程執(zhí)行控制。
從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區(qū)別。
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行。
協程:協程其實可以認為是比線程更小的執(zhí)行單元。為啥說他是一個執(zhí)行單元,因為他自帶CPU上下文。
簡單來說可以認為協程是線程里不同的函數,這些函數之間可以相互快速切換,協程和用戶態(tài)線程非常接近,用戶態(tài)線程之間的切換不需要陷入內核,但部分操作系統中用戶態(tài)線程的切換需要內核態(tài)線程的輔助。
協程切換:協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。
來源:https://www.cnblogs.com/LUO77/p/5771237.html
推薦:
全網最全的 Android 音視頻和 OpenGL ES 干貨,都在這了
