- Linux內核完全注釋(20周年版·第2版)
- 趙炯編著
- 613字
- 2024-05-10 12:20:18
2.3 Linux系統定時
在Linux 0.11內核中,PC的可編程定時芯片Intel 8253被設置成每隔10ms就發出一個時鐘中斷(IRQ0)信號。這個時間節拍就是系統運行的脈搏,我們稱之為1個系統滴答。因此每經過1個滴答就會調用一次時鐘中斷處理程序(timer_interrupt)。該處理程序主要用來通過jiffies變量來累計自系統啟動以來經過的時鐘滴答數。每當發生一次時鐘中斷該值就增1。然后從被中斷程序的段選擇符中取得當前特權級CPL作為參數調用do_timer()函數。
do_timer()函數則根據特權級對當前進程運行時間做累計。如果CPL=0,則表示進程是運行在內核態時被中斷,因此把進程的內核運行時間統計值stime增1,否則把進程用戶態運行時間統計值增1。如果程序添加過定時器,則對定時器鏈表進行處理。若某個定時器時間到(遞減后等于0),則調用該定時器的處理函數。然后對當前進程運行時間進行處理,把當前進程運行時間片減1。如果此時當前進程時間片還大于0,表示其時間片還沒有用完,于是就退出do_timer()繼續運行當前進程。如果此時進程時間片已經遞減為0,表示該進程已經用完了此次使用CPU的時間片,于是程序就會根據被中斷程序的級別來確定進一步處理的方法。若被中斷的當前進程是工作在用戶態的(特權級別大于0),則do_timer()就會調用調度程序schedule()切換到其他進程去運行。如果被中斷的當前進程工作在內核態,即在內核程序中運行時被中斷,則do_timer()會立刻退出。因此這樣的處理方式決定了Linux系統在內核態運行時不會被調度程序切換。進程在內核態程序中運行時是不可搶占的,但當處于用戶態程序中運行時則是可以被搶占的。
推薦閱讀
- Linux運維實戰:CentOS7.6操作系統從入門到精通
- UNIX操作系統設計
- 高性能Linux服務器構建實戰:運維監控、性能調優與集群應用
- Linux內核設計的藝術:圖解Linux操作系統架構設計與實現原理
- 計算機系統:基于x86+Linux平臺
- INSTANT Galleria Howto
- 分布式系統設計實踐
- μC/OS-III內核實現與應用開發實戰指南:基于STM32
- 電腦辦公(Windows 10 + Office 2016)入門與提高(超值版)
- Docker容器技術與應用
- Windows網絡編程(第2版)
- Less Web Development Essentials
- 基于Arduino的嵌入式系統入門與實踐
- 大規模Linux集群架構最佳實踐:如何管理上千臺服務器
- Linux網絡操作系統項目教程(RHEL 6.4/CentOS 6.4)(第2版)