官术网_书友最值得收藏!

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系統在核態運行時不會被調度程序切換。進程在內核態程序中運行時是不可搶占的,但當處于用戶態程序中運行時則是可以被搶占的。

主站蜘蛛池模板: 永济市| 新余市| 买车| 四平市| 布尔津县| 酉阳| 丰城市| 双牌县| 蕲春县| 施甸县| 油尖旺区| 南京市| 固镇县| 龙口市| 黎平县| 珠海市| 新昌县| 如皋市| 东山县| 中西区| 武汉市| 扬中市| 崇文区| 吴江市| 前郭尔| 银川市| 新野县| 镇赉县| 琼海市| 抚顺市| 房山区| 七台河市| 平武县| 阿拉善左旗| 翼城县| 策勒县| 上饶县| 隆昌县| 辽宁省| 平顺县| 西平县|