你真的知道協程是怎麼來的嗎?

ssdlh發表於2021-05-11

超超為了讓女朋友婷婷過上幸福美滿的生活,決定去大廠歷練一番,下面是他在面試過程中關於作業系統的幾個問題

單程式系統

超超:面試官,您好~

面試官:你好呀,我們來簡單聊會,你們平時是在Linus還是Windows上進行開發?

超超:我們用的是基於unix的macOS(:哈哈

面試官:Linux也是基於unix開發的,那我們來聊一下作業系統的發展歷程吧,你知道單道批處理系統嗎?

考點:單道批處理系統

超超:這個知道的,單道批處理系統記憶體中始終只保持一道作業,cpu只能將記憶體中作業執行完畢,才能執行下一道作業,程式之間序列執行,A、B、C三個程式按順序執行

圖片

單道批處理系統不用考慮併發問題,程式設計較為簡單,但是每次只能執行一個程式功能過於單一,且當程式存在大量IO操作時,會造成CPU資源的浪費。

分時系統

面試官:那你知道分時系統的機制嗎?

考點:多程式程式

超超:知道的,分時系統引申出了時間片的概念,程式按照排程演算法分時間片在CPU上執行,A、B、C三個程式按照時間片併發執行

圖片

這樣做有倆個優點,一是對於單個核可以併發執行多個程式,應用場景更加豐富,二是當某個程式是IO密集型程式時,也能保證CPU的利用率。但是隨著時代的發展,CPU通過程式來進行排程的缺點也越發的明顯。大量的程式切換,建立和銷燬,將浪費大量的CPU資源。如果一個程式比較複雜,那麼大量的程式之間通訊也會給系統帶來負擔。

面試官:那後來進行了怎樣的改進了?

考點:多執行緒

超超:後來引入了執行緒的概念,在程式的基礎上再細分出執行緒,執行緒比程式更輕量,執行緒之間的通訊也更為便捷,任務的最小載體變成了執行緒。

圖片

這樣一來當一個程式中有執行緒阻塞時,不妨礙其他執行緒的執行。並且核心級執行緒只有很小的資料結構和堆疊,切換速度快。

面試官:你剛剛提到了核心級執行緒,那你知道核心級執行緒和使用者級執行緒的區別嗎?

考點:執行緒知識點廣度

超超:嘿嘿,這個我也研究過的

使用者執行緒:剛有執行緒概念時,執行緒只能在使用者態中執行,因此執行緒的排程由使用者態程式中的排程器執行,對於核心來說排程的仍是程式,因此如果一個程式中的某一個執行緒發生阻塞,那麼整個程式中的執行緒都無法執行。

核心執行緒:後來執行緒的技術逐步成熟,則在核心中新增了核心級執行緒,此時CPU排程的最小單位就變為執行緒。

圖片

協程

面試官:嗯,不錯!那執行緒這麼好,為什麼我們還要引入協程呢?

考點:協程

超超:隨著時代的發展,為每個任務都建立一個執行緒是不現實的,因為會消耗大量的記憶體(程式虛擬記憶體會佔用4GB[32位作業系統], 而執行緒也要大約4MB)。同時多執行緒也會給核心的排程管理帶來巨大的壓力。基於執行緒所佔空間較大和核心排程壓力大這倆個缺點,可以將執行緒做的更加輕量級,因此將協程抽象成執行緒,並在使用者空間做協程的管理,減小核心的壓力。

圖片

協程佔用的記憶體更小(幾kb),而執行緒通常需要4M。並在使用者層再封裝一次排程,減輕核心負擔。

面試官:以後覺得協程大了,不知道還會不會再細分哈,那我們再聊一下Goroutine排程器吧。

超超:可以啊(:還好這個知識點在「Golang面試寶典看過」

未完待續~

如果你有什麼問題想問超超,歡迎新增我的微信,進讀者群和超超一起討論呀!

圖片

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章