陜西中洋建設(shè)有限公司網(wǎng)站自己怎么做關(guān)鍵詞優(yōu)化
文章目錄
- 1. 概述
- 2. 進(jìn)程
- 3. 線(xiàn)程
- 4. 協(xié)程
- 5. 進(jìn)程與線(xiàn)程區(qū)別
1. 概述
進(jìn)程和線(xiàn)程這兩個(gè)名詞天天聽(tīng),但是對(duì)于它們的含義和關(guān)系其實(shí)還有點(diǎn)懵的,其實(shí)除了進(jìn)程和線(xiàn)程,還存在一個(gè)協(xié)程,它們的關(guān)系如下:
首先,我們需要明白一個(gè)籠統(tǒng)的定義(并不嚴(yán)謹(jǐn)):進(jìn)程 > 線(xiàn)程 > 協(xié)程。
它們的基本概念如下:
- 進(jìn)程: 是并發(fā)執(zhí)行的程序在執(zhí)行過(guò)程中分配和管理資源的基本單位,是一個(gè)動(dòng)態(tài)概念,競(jìng)爭(zhēng)計(jì)算機(jī)系統(tǒng)資源的基本單位。
- 線(xiàn)程: 是進(jìn)程的一個(gè)執(zhí)行單元,是進(jìn)程內(nèi)科調(diào)度實(shí)體。比進(jìn)程更小的獨(dú)立運(yùn)行的基本單位。線(xiàn)程也被稱(chēng)為輕量級(jí)進(jìn)程。
- 協(xié)程: 是一種比線(xiàn)程更加輕量級(jí)的存在。一個(gè)線(xiàn)程也可以擁有多個(gè)協(xié)程。其執(zhí)行過(guò)程更類(lèi)似于子例程,或者說(shuō)不帶返回值的函數(shù)調(diào)用。
2. 進(jìn)程
打開(kāi)任務(wù)管理器可以看見(jiàn)當(dāng)前系統(tǒng)正在運(yùn)行的所有進(jìn)程,這些進(jìn)程都有一個(gè)屬于自己的獨(dú)立空間,并且一個(gè)進(jìn)程最少有一個(gè)線(xiàn)程。
一個(gè)進(jìn)程就是一個(gè)程序,程序之間的切換會(huì)帶來(lái)比較大的開(kāi)銷(xiāo)。并且,進(jìn)程之間不能共享堆和方法區(qū)的資源,因此如果發(fā)生了進(jìn)程之間的切換,負(fù)擔(dān)會(huì)比較大。
最最最重要的是,進(jìn)程是CPU資源分配的最小單位!
3. 線(xiàn)程
線(xiàn)程是進(jìn)程的一個(gè)執(zhí)行任務(wù)(控制單位),負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行。
一個(gè)進(jìn)程最少有一個(gè)線(xiàn)程,最多可以有很多的線(xiàn)程,同一個(gè)進(jìn)程內(nèi)的多個(gè)線(xiàn)程可以共享數(shù)據(jù),它們可以共享方法區(qū)和堆內(nèi)存,每個(gè)線(xiàn)程都有它們自己的程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧。
正是因?yàn)橥痪€(xiàn)程之間可以共享數(shù)據(jù),所以各個(gè)線(xiàn)程出現(xiàn)切換工作的時(shí)候,這個(gè)代價(jià)比不同進(jìn)程之間發(fā)生發(fā)生切換的代價(jià)要小。所以,線(xiàn)程也被稱(chēng)為輕量級(jí)進(jìn)程。
線(xiàn)程是CPU調(diào)度的最小單位。
4. 協(xié)程
協(xié)程,也被稱(chēng)為微線(xiàn)程,是用戶(hù)態(tài)的輕量級(jí)的線(xiàn)程。
協(xié)程有自己的寄存器上下文和棧,當(dāng)協(xié)程調(diào)度切換的時(shí)候,會(huì)將寄存器上下文和棧保存到其他地方,在切換回來(lái)的時(shí)候,可以恢復(fù)先前保存的寄存器上下文和棧。
因此協(xié)程可以保留上一次調(diào)用的狀態(tài),每次過(guò)程重入的時(shí)候,相當(dāng)于進(jìn)入上一次調(diào)用的狀態(tài)。
協(xié)程最突出的優(yōu)點(diǎn)就是高并發(fā)、高擴(kuò)展性和低成本,一個(gè)CPU可以支持上萬(wàn)個(gè)協(xié)程,所以很適合用來(lái)做高并發(fā)處理。
協(xié)程的好處:
- 無(wú)需線(xiàn)程上下文切換的開(kāi)銷(xiāo)
- 無(wú)需原子操作鎖定及同步的開(kāi)銷(xiāo)
- 方便切換控制流,簡(jiǎn)化編程模型
協(xié)程的壞處:
- 無(wú)法利用多核資源:協(xié)程的本質(zhì)其實(shí)就是單線(xiàn)程,所以它無(wú)法充分利用多核CPU的優(yōu)勢(shì),協(xié)程需要和進(jìn)程配合才能運(yùn)行在多CPU上。
- 進(jìn)行阻塞(Blocking)操作(如IO時(shí))會(huì)阻塞掉整個(gè)程序
5. 進(jìn)程與線(xiàn)程區(qū)別
- 根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線(xiàn)程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位。
- 資源開(kāi)銷(xiāo):每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷(xiāo);線(xiàn)程可以看做輕量級(jí)的進(jìn)程,同一類(lèi)線(xiàn)程共享代碼和數(shù)據(jù)空間,每個(gè)線(xiàn)程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線(xiàn)程之間切換的開(kāi)銷(xiāo)小。
- 包含關(guān)系:如果一個(gè)進(jìn)程內(nèi)有多個(gè)線(xiàn)程,則執(zhí)行過(guò)程不是一條線(xiàn)的,而是多條線(xiàn)(線(xiàn)程)共同完成的;線(xiàn)程是進(jìn)程的一部分,所以線(xiàn)程也被稱(chēng)為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程。
- 內(nèi)存分配:同一進(jìn)程的線(xiàn)程共享本進(jìn)程的地址空間和資源,而進(jìn)程之間的地址空間和資源是相互獨(dú)立的。
- 影響關(guān)系:一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線(xiàn)程崩潰整個(gè)進(jìn)程都死掉。所以多進(jìn)程要比多線(xiàn)程健壯。
- 執(zhí)行過(guò)程:每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口、順序執(zhí)行序列和程序出口。但是線(xiàn)程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制,兩者均可并發(fā)執(zhí)行6.
參考:
- 進(jìn)程和線(xiàn)程的區(qū)別(超詳細(xì))_ThinkWon的博客-CSDN博客
- 面試題:線(xiàn)程與進(jìn)程區(qū)別 - 騰訊云開(kāi)發(fā)者社區(qū)-騰訊云