本篇說清楚CPU
cpu是負責執行指令的,誰能給它指令?是線程(也叫任務), 任務是內核的調度單元,調度到哪個任務CPU就去執行哪個任務的指令. 要執行指令就要有個取指令的開始地址. 開始地址就是大家所熟知的main函數.一個程序被加載解析后內核會在ELF中找到main函數的位置,并自動創建一個線程,指定線程的入口地址為main函數的地址,由此開始了取指,譯指,執指之路.
多線程內核是怎么處理的? 一樣的, 以JAVA舉例,對內核來說 new thread中的run() 函數 和 main() 并沒有區別. 都是一個線程(任務)的執行入口. 注意在系列篇中反復的說任務就是線程,線程就是任務,它們是一個東西在不同層面上的描述.對應用層說線程,對內核層說任務. 有多少個線程就會有多少個入口,它們統一接受調度算法的調度, 調度算法只認優先級的高低,不會管你是main() 還是 run() 而區別對待.
定時器的實現也是通過任務實現的,只不過是個系統任務OsSwtmrTaskCreate,優先級最高,和入口地址OsSwtmrTask由系統指定.
所以理解CPU就要先理解任務,任務是理解內核的主線,把它搞明白了分析內核就輕輕松松,事半功倍了.看似高深的CPU只不過是摟草打兔子.
不相信?那就看看內核對CPU是怎么描述的吧.本篇就圍繞這個結構體展開說.
#內核如何描述CPU?
結構體不復雜,但很重要,一個一個掰開了說.
taskSortLink是干什么用的? 一個任務在運行過程中,會經常會主動或被動中斷,而進入等待狀態.主動中斷情況, 例如:主動delay300毫秒,這是應用層很常見的操作.被動中斷情況, 例如:申請互斥鎖失敗,等待某個事件發生 等等. 發生這些情況時任務將被掛到taskSortLink上.
`OsAdd2SortLink`,將任務掛到排序鏈表上,因等待時間不一樣,所以內核會對這些任務按時間長短排序.
定時器相關三個變量,在系列篇定時器機制篇中已有對定時器的詳細描述,可前往查看.
搞明白定時器的機制只需搞明白: 定時器(SWTMR_CTRL_S),定時任務(swtmrTaskID),定時器響應函數(SwtmrHandlerItem),定時器處理隊列swtmrHandlerQueue 四者的關系就可以了. 一句話概括:定時任務swtmrTaskID是個系統任務,優先級最高,它循環讀取隊列swtmrHandlerQueue中的已到時間的定時器(SWTMR_CTRL_S),并執行定時器對應的響應函數SwtmrHandlerItem.
idleTaskID空閑任務,注意這又是個任務,每個cpu核都有屬于自己的空閑任務,cpu沒事干的時候就待在里面.空閑任務長什么樣?Look!
taskLockCnt 這個很簡單,記錄等鎖的任務數量.任務在運行過程中優先級是會不斷地變化的, 例如 高優先級的A任務在等某鎖,但持有鎖的一方B任務優先級低,這時就會調高B的優先級至少到A的等級,提高B被調度算法命中的概率,如此就能快速的釋放鎖交給A運行.taskLockCnt記錄被CPU運行過的正在等鎖的任務數量.schedFlag 調度的標簽.
調度并不是每次都能成功的,在某些情況下內核會阻止調度進行.例如:OS_INT_ACTIVE硬中斷發生的時候.
excFlag標識CPU的運行狀態,只在多核CPU下可見.
以上為內核對CPU描述的全貌,不是很復雜.
編輯:hfy
-
cpu
+關注
關注
68文章
10858瀏覽量
211643 -
鴻蒙系統
+關注
關注
183文章
2634瀏覽量
66316
發布評論請先 登錄
相關推薦
評論