01-實現多執行緒切換和排程實驗介紹(協程原理)
阿新 • • 發佈:2019-02-11
本系列文章旨在記錄完成一個小型使用者級執行緒建立、切換與排程框架的過程,並不能代替作業系統為我們提供的執行緒框架。
為什麼要寫這樣的東西呢?目的很簡單,僅僅在於學習作業系統中的程序或執行緒切換與排程原理。所以,請不要把程式碼試圖用到你的工程或者專案中,出了問題也不要來找我啊。
如果你發現該專案中存在的問題或 bugs,請不要吝嗇,及時聯絡我,因為我也只是一個學習者,希望共同進步。
[注]
重要提示:請不要忘記給專案點 star 啊!!!還有一點,程式碼中可能存在 bug,請不要忘記在部落格後面評論。
應該說一直以來,我們學習執行緒切換與排程,都是通過閱讀作業系統書籍或 Linux 原始碼甚至反彙編 Window 核心程式碼。無論怎樣,這些東西都很抽象,學習起來十分困難。
本系列文章,準確的說是實驗指導書吧,會帶你循序漸近的掌握下面的知識點:
- 控制流如何切換
- 完成一個簡單的暴力跳轉
- 封裝 create_thread 函式
- 抽取排程函式
- 模組化專案
- 封裝阻塞類函式,以 sleep 函式為代表
- 時鐘與時間片概念
- 為執行緒新增時間片
- 時間片輪轉+優先順序排程
注意上面不是目錄,只是我們將要遇到的一些關鍵節點。最後,我們實現的效果應該是下面這個樣子:
圖1 最終的效果
客戶端完整程式碼見圖 2.
需要注意的是,上面的程式碼,並沒有使用作業系統為我們提供的 pthread 系列函式,thread_create 和 thread_join 函式都是自己純手工實現的。唯一使用作業系統的函式就是設定時鐘,因此會有時鐘訊號產生,這一步是為了模擬時間片輪轉演算法而做的。
接下來,廢話不多說了,開啟新篇章吧《控制流切換原理》;
圖 2 使用自己的編寫的多執行緒框架建立執行緒