openKylin论坛

 找回密码

linux系统定时 [复制链接]

1.在 Linux 0.11 内核中, PC 机的可编程定时芯片 Intel 8253 被设置成每隔 10 毫秒就发出一个时钟中断( IRQ0 )信号。这个时间节拍就是系统运行的脉搏,我们称之为 1 个系统滴答。因此每经过 1 个滴答就会调用一次时钟中断处理程序( timer_interrupt )
2.该处理程序主要用来通过 jiffies 变量来累计自系统启动以来经过的时钟滴答数。每当发生一次时钟中断该值就增 1 。然后从被中断程序的段选择符中取得当前特权级 CPL 作为参数调用 do_timer() 函数。
3.do_timer() 函数则根据特权级对当前进程运行时间作累计。如果 CPL=0 ,则表示进程是运行在内核态时被中断,因此把进程的内核运行时间统计值 stime 增 1 ,否则把进程用户态运行时间统计值增 1
4.如果程序添加过定时器,则对定时器链表进行处理。若某个定时器时间到(递减后等于 0 ),则调用该定时器的处理函数。然后对当前进程运行时间进行处理,把当前进程运行时间片减 1 。如果此时当前进程时间片并还大于 0 ,表示其时间片还没有用完,于是就退出 do_timer() 继续运行当前进程。如果此时进程时间片已经递减为 0 ,表示该进程已经用完了此次使用 CPU 的时间片,于是程序就会根据被中断程序的级别来确定进一步处理的方法
5.若被中断的当前进程是工作在用户态的(特权级别大于 0 ),则 do_timer() 就会调用调度程序 schedule() 切换到其它进程去运行。如果被中断的当前进程工作在内核态,也即在内核程序中运行时被中断,则 do_timer() 会立刻退出
6.这样的处理方式决定了 Linux 系统在内核态运行时不会被调度程序切换。内核态程序是不可抢占的,但当处于用户态程序中运行时则是可以被抢占的

楼主
发表于 2013-11-21 14:00:26
回复

使用道具 举报

openKylin

GMT+8, 2024-5-14 15:06 , Processed in 0.019510 second(s), 17 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表