協(xié)程切換相比于線程切換來說不需要從用戶態(tài)切換到系統(tǒng)態(tài)掐暮,并且不需要切換頁(yè)表。因此協(xié)程切換更輕量政钟。協(xié)程又可以分為有棧協(xié)程與無(wú)棧協(xié)程路克。
有棧協(xié)程
協(xié)程一個(gè)重要的特點(diǎn)是樟结,對(duì)于某一個(gè)方法,可以執(zhí)行到某個(gè)操作的時(shí)候 yield 出去精算,然后在某個(gè)時(shí)候再 resume瓢宦。對(duì)于一個(gè)方法其調(diào)用棧由多個(gè)棧幀構(gòu)成。因此一種實(shí)現(xiàn)的方式是在 yield 的時(shí)候?qū)⒃摲椒捌湔{(diào)用方法的棧幀都拷貝到另一個(gè)臨時(shí)的棧中灰羽。等 resume 的時(shí)候再將臨時(shí)棧中的數(shù)據(jù)再拷貝到系統(tǒng)棧中驮履,用于恢復(fù)現(xiàn)場(chǎng),繼續(xù)執(zhí)行未執(zhí)行完成的部分廉嚼。有棧協(xié)程有一個(gè)優(yōu)點(diǎn)玫镐,即是可以在任何方法中 yield,例如 go 語(yǔ)言就是采用這種方式實(shí)現(xiàn)的協(xié)程怠噪。舉個(gè)例子恐似, python 無(wú)法在一個(gè)普通方法中調(diào)用 await,其必須必須在 async 修飾的方法中傍念。
無(wú)棧協(xié)程
無(wú)棧協(xié)程其實(shí)現(xiàn)原理是將執(zhí)行的方法編譯為一個(gè)狀態(tài)機(jī)矫夷,實(shí)現(xiàn)的時(shí)候不需要在臨時(shí)棧和系統(tǒng)棧直接拷貝現(xiàn)場(chǎng)。因此無(wú)棧協(xié)程的效率和占用的資源更少憋槐。但無(wú)棧協(xié)程有一個(gè)缺點(diǎn)双藕,即上面提到的,無(wú)法在一個(gè)普通方法中 yield秦陋。比如 python 采用的就是無(wú)棧協(xié)程蔓彩。