一直以來,我們學習線程切換與調度,都是通過閱讀操作系統書籍或 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 的線程,是如何切換到其它進程的
這一整篇文章裏,我們完成了線程切換與線程調度的框架,在此基礎上,我們還可以做更多有關線程的東西,比如線程的同步與互斥,還有更多的線程狀態。理解了本文之後,更深入的學習對你來說已經不是難事了!
點擊鏈接 瞭解本場 Chat,開始實戰操作系統!