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