Linux內核源碼流水筆記之進程的調度運行

Linux內核源碼流水導讀之進程的調度運行

基於linux.2.0 源碼

內核通過schedule函數完成進程的任務調度通過switch_to宏完成進程切換

  1. do_bottom_half();run_task_queue(&tq_scheduler);完成中斷下半部任務,如網卡接收到一個完整的包後將觸發中斷,cpu響應中斷調用網卡驅動程序分配一個sk_buff從網卡緩衝區拷貝此包到sk_buff,把去除mac幀頭後的sk_buff放入back_log隊列,在中斷下半部會從back_log隊列取出此sk_buff進行處理通過ip層,tcp層最終放入socket的讀緩衝區,被系統調用read讀取到用戶緩衝區
  2. 判斷當前進程是否使用SCHED_RR調度策略進行調度,如是且時間片已用完則prev->counter = prev->priority;並將此進程移動到可運行隊列尾部
  3. 判斷當前進程是否調用alarm設定了鬧鐘定時,如有設定且已超時則向其發送send_sig(SIGALRM, p, 1);信號
  4. 判斷當前進程是否處於TASK_INTERRUPTIBLE狀態的任務,如是則判斷是否有信號需要處理且信號未被阻塞或p->timeout已超時則置timeout=0(如阻塞的select系統調用在下一次輪循時將超時返回),如有則修改任務狀態爲p->state = TASK_RUNNING;當進程下一次被調度運行時將從內核態返回到用戶態,並調用信號處理函數(信號僅在從內核態返回用戶態時才被處理),此時系統調用將返回錯誤errno=EINTER,如無則將其從可運行隊列刪除
  5. 通過優先級和調度策略從可運行隊列選出需要調度運行的進程,如果所有可運行進程的時間片已用完,pid爲0的進程idle_task將會被調度運行,並則按優先級重新調整每個任務的時間片 p->counter = (p->counter >> 1) + p->priority;
  6. switch_to切換到新任務,如新任務與當前任務是同一任務則不會產生任務切換,反之則進行切換把當前運行任務使用的cpu現場保存到當前任務的struct thread_struct tss中,把新任務struct thread_struct tss中保存的寄存器值加載到cpu,還原上一次運行的現場,完成任務切換,如果是線程切換隻會,更改cpu寄存器的值,完成同一個進程內從一個線程棧切換到另一個線程的棧,而從一個進程的線程切換到另一個進程的線程會導致進程的切換,進程切換會導致頁表切換,cache,tlb失效 ,linux.2.0還沒有支持線程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章