協(xié)程相比線程主要有幾點(diǎn)優(yōu)勢(shì):
- 更輕量碗旅。當(dāng)一個(gè)線程被創(chuàng)建時(shí)砚尽,操作系統(tǒng)會(huì)為該線程分配一定的內(nèi)存空間拆撼,其中包括線程棧和線程控制塊等信息容劳。線程棧用于存儲(chǔ)線程的局部變量、函數(shù)調(diào)用棧等信息闸度,而線程控制塊則用于存儲(chǔ)線程的狀態(tài)竭贩、優(yōu)先級(jí)、調(diào)度信息等莺禁。而協(xié)程創(chuàng)建時(shí)留量,默認(rèn)僅需要分配4KB的空間
- 更高并發(fā)性。這個(gè)也是因?yàn)楦p量哟冬,所以可以創(chuàng)建更多
- 更低開(kāi)銷(xiāo)楼熄。這個(gè)是因?yàn)閰f(xié)程的調(diào)度是發(fā)生在用戶(hù)態(tài),不想線程需要在用戶(hù)態(tài)和內(nèi)核態(tài)來(lái)回切換
- 更易用浩峡。這個(gè)就不言自明了
協(xié)程其實(shí)底層還是依附于線程的可岂,相當(dāng)于在線程的基礎(chǔ)上做了更高一層的抽象。協(xié)程創(chuàng)建時(shí)默認(rèn)分配的4KB空間主要會(huì)存儲(chǔ)以下信息:
- 局部變量:用來(lái)存儲(chǔ)協(xié)程的局部變量翰灾,這些變量只在協(xié)程的生命周期內(nèi)有效缕粹。
- 函數(shù)調(diào)用棧:協(xié)用來(lái)存儲(chǔ)函數(shù)調(diào)用棧稚茅,每當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),該函數(shù)的參數(shù)致开、返回值和局部變量等信息都會(huì)被存儲(chǔ)在協(xié)程的棧中峰锁,當(dāng)函數(shù)返回時(shí),這些信息會(huì)被彈出棧双戳。
- 協(xié)程狀態(tài):用來(lái)存儲(chǔ)協(xié)程的狀態(tài)信息虹蒋,例如協(xié)程的調(diào)度狀態(tài)、堆棧指針等信息飒货。
協(xié)程的椘切疲空間是在堆上分配的,也會(huì)根據(jù)需要?jiǎng)討B(tài)的分配塘辅,從而減少內(nèi)存占用晃虫。
在Go語(yǔ)言中,協(xié)程會(huì)綁定在一個(gè)線程上扣墩,但是協(xié)程的調(diào)度是由協(xié)程庫(kù)來(lái)實(shí)現(xiàn)的哲银,而不是由操作系統(tǒng)來(lái)實(shí)現(xiàn)的。當(dāng)一個(gè)協(xié)程被創(chuàng)建時(shí)呻惕,它會(huì)被綁定到當(dāng)前線程上荆责,如果當(dāng)前線程中已經(jīng)有其他協(xié)程在執(zhí)行,那么新創(chuàng)建的協(xié)程會(huì)被加入到協(xié)程隊(duì)列中等待調(diào)度亚脆。當(dāng)一個(gè)協(xié)程被阻塞時(shí)做院,協(xié)程庫(kù)會(huì)自動(dòng)將該協(xié)程從當(dāng)前線程中移除,并將其加入到其他線程的協(xié)程隊(duì)列中等待調(diào)度