掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
話不多說,先來張思維腦圖~~

我們編寫的代碼只是一個(gè)存儲(chǔ)在硬盤的靜態(tài)文件,通過編譯后就會(huì)生成二進(jìn)制可執(zhí)行文件,當(dāng)我們運(yùn)行這個(gè)可執(zhí)行文件后,它會(huì)被裝載到內(nèi)存中,接著 CPU 會(huì)執(zhí)行程序中的每一條指令,那么這個(gè)運(yùn)行中的程序,就被稱為「進(jìn)程」(Process)。進(jìn)程包括程序計(jì)數(shù)器、寄存器和程序變量的當(dāng)前值。
進(jìn)程的特征
進(jìn)程的創(chuàng)建、銷毀與切換存在著較大的時(shí)空開銷,在80年代,線程的概念開始出現(xiàn),線程被設(shè)計(jì)成進(jìn)程的一個(gè)執(zhí)行路徑,同一個(gè)進(jìn)程中的線程共享進(jìn)程的資源,因此系統(tǒng)對線程的調(diào)度所需的成本遠(yuǎn)遠(yuǎn)小于進(jìn)程。
同一個(gè)進(jìn)程內(nèi)多個(gè)線程之間可以共享代碼段、數(shù)據(jù)段、打開的文件等資源,但每個(gè)線程各自都有一套獨(dú)立的寄存器和棧,這樣可以確保線程的控制流是相對獨(dú)立的。
線程的優(yōu)點(diǎn):
對于,線程相比進(jìn)程能減少開銷,體現(xiàn)在:
所以,不管是時(shí)間效率,還是空間效率線程比進(jìn)程都要高。
多個(gè)程序、交替執(zhí)行的思想,就有 CPU 管理多個(gè)進(jìn)程的初步想法。
對于一個(gè)支持多進(jìn)程的系統(tǒng),CPU 會(huì)從一個(gè)進(jìn)程快速切換至另一個(gè)進(jìn)程,其間每個(gè)進(jìn)程各運(yùn)行幾十或幾百個(gè)毫秒。
雖然單核的 CPU 在某一個(gè)瞬間,只能運(yùn)行一個(gè)進(jìn)程。但在 1 秒鐘期間,它可能會(huì)運(yùn)行多個(gè)進(jìn)程,這樣就產(chǎn)生并行的錯(cuò)覺,實(shí)際上這是并發(fā)。
所謂的進(jìn)程上下文,就是一個(gè)進(jìn)程在執(zhí)行的時(shí)候,CPU的所有寄存器中的值、進(jìn)程的狀態(tài)以及堆棧上的內(nèi)容,當(dāng)內(nèi)核需要切換到另一個(gè)進(jìn)程時(shí),它 需要保存當(dāng)前進(jìn)程的所有狀態(tài),即保存當(dāng)前進(jìn)程的進(jìn)程上下文,以便再次執(zhí)行該進(jìn)程時(shí),能夠恢復(fù)切換時(shí)的狀態(tài),繼續(xù)執(zhí)行。
發(fā)生進(jìn)程上下文切換有哪些場景?
當(dāng)進(jìn)程擁有多個(gè)線程時(shí),這些線程會(huì)共享相同的虛擬內(nèi)存和全局變量等資源,這些資源在上下文切換時(shí)是不需要修改的;
不過,線程也有自己的私有數(shù)據(jù),比如棧和寄存器等,這些在上下文切換時(shí)也是需要保存的。
線程上下文切換的是什么?
當(dāng)兩個(gè)線程是屬于同一個(gè)進(jìn)程,因?yàn)樘摂M內(nèi)存是共享的,所以在切換時(shí),虛擬內(nèi)存這些資源就保持不動(dòng),只需要切換線程的私有數(shù)據(jù)、寄存器等不共享的數(shù)據(jù);
所以,線程的上下文切換相比進(jìn)程,開銷要小很多。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流