一直以來,我們學習線程切換與調度,都是通過閱讀操作系統書籍或 Linux 源碼甚至反彙編 Window 內核代碼。無論怎樣,這些東西都很抽象,學習起來十分困難。

另外,隨着現代化編程語言逐漸流行,C++20 的正式發佈,都離不開用戶態線程這些基礎知識。再比如 Golang 的 Goroutine,騰訊公司的開源的 libco,百度的 BRPC 中的 bhtread,如果想深刻理解它們,都需要紮實的基本功。

本次 Chat 會帶你循序漸近的掌握下面的知識點:控制流切換原理上下文切換線程設計調度函數的封裝與代碼模塊化線程的主動切換時間片輪轉調度

本文實驗環境:ubuntu 16.04 32 位操作系統(讀者請務必提前安裝好);挑選一個你自己覺得好用的虛擬機軟件,比如 VMWare;請把你的虛擬機環境配置成單核 CPU。

學習時間:大於 5 小時

爲什麼使用 32 位系統?因爲方便初學者學習,能更快速的掌握原理。

圖1 用戶態線程運行示例

需要注意的是,上面的代碼,並沒有使用操作系統爲我們提供的pthread系列函數,thread_create和thread_join函數都是自己純手工實現的。唯一使用操作系統的函數就是設置時鐘,因此會有時鐘信號產生,這一步是爲了模擬時間片輪轉算法而做的。

本場 Chat 作者——Allen()

百度高級研發工程師,CSDN 博客專家。目前從事智能交互式對話系統雲端開發。負責過大流量、高併發等業務場景。

掃碼查看完整 Chat 原文

進入讀者圈與作者深度交流

本場 Chat 關鍵點總結:理解“棧切換”的本質掌握指令執行與棧的關係掌握上下文是如何切換的理解主動切換,知道主動切換可能會發生在哪些地方理解什麼是時間片對於不主動讓出 cpu 的線程,是如何切換到其它進程的

這一整篇文章裏,我們完成了線程切換與線程調度的框架,在此基礎上,我們還可以做更多有關線程的東西,比如線程的同步與互斥,還有更多的線程狀態。理解了本文之後,更深入的學習對你來說已經不是難事了!

相關文章