基于linux0.11操作系统定时器的原理分析
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天就跟大家聊聊有关基于linux0.11操作系统定时器的原理分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。操作系统的定时器原理是,操作系
千家信息网最后更新 2026年10月31日基于linux0.11操作系统定时器的原理分析
今天就跟大家聊聊有关基于linux0.11操作系统定时器的原理分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
操作系统的定时器原理是,操作系统维护了一个定时器节点的链表,新增一个定时器节点时,设置一个jiffies值,这是触发定时中断的频率。linux0.11版本里是1秒触发100次,即10毫秒一次。加入新增一个定时器的jiffies值是2,那经过两次定时中断后就会被执行。jiffies值在每次定时中断时会加一。
_timer_interrupt: push %ds # save ds,es and put kernel data space push %es # into them. %fs is used by _system_call push %fs pushl %edx # we save %eax,%ecx,%edx as gcc doesn't pushl %ecx # save those across function calls. %ebx pushl %ebx # is saved as we use that in ret_sys_call pushl %eax movl $0x10,%eax mov %ax,%ds mov %ax,%es movl $0x17,%eax mov %ax,%fs incl _jiffies ...
下面是定时器的结构图
#define TIME_REQUESTS 64// 定时器数组,其实是个链表static struct timer_list {long jiffies;void (*fn)();struct timer_list * next;} timer_list[TIME_REQUESTS], * next_timer = NULL;void add_timer(long jiffies, void (*fn)(void)){struct timer_list * p;if (!fn)return;// 关中断,防止多个进程"同时"操作cli();// 直接到期,直接执行回调if (jiffies <= 0)(fn)();else {// 遍历定时器数组,找到一个空项for (p = timer_list ; p < timer_list + TIME_REQUESTS ; p++)if (!p->fn)break;// 没有空项了if (p >= timer_list + TIME_REQUESTS)panic("No more time requests free");// 给空项赋值p->fn = fn;p->jiffies = jiffies;// 在数组中形成链表p->next = next_timer;// next_timer指向第一个节点,即最早到期的next_timer = p;/*修改链表,保证超时时间是从小到大的顺序原理:每个节点都是以前面一个节点的到时时间为坐标,节点里的jiffies即超时时间是前一个节点到期后的多少个jiffies后该节点到期。*/while (p->next && p->next->jiffies < p->jiffies) {// 前面的节点比后面节点大,则前面节点减去后面节点的值,算出偏移值,下面准备置换位置p->jiffies -= p->next->jiffies;// 先保存一下fn = p->fn;// 置换两个节点的回调p->fn = p->next->fn;p->next->fn = fn;jiffies = p->jiffies;// 置换两个节点是超时时间p->jiffies = p->next->jiffies;p->next->jiffies = jiffies;/*到这,第一个节点是最快到期的,还需要更新后续节点的值,其实就是找到一个合适的位置插入,因为内核是用数组实现的定时器队列,所以是通过置换位置实现插入,如果是链表,则直接找到合适的位置,插入即可,所谓合适的位置,就是找到第一个比当前节点大的节点,插入到他前面。*/p = p->next;}/*内核这里实现有个bug,当当前节点是最小时,需要更新原链表中第一个节点的值,,否则会导致原链表中第一个节点的过期时间延长,修复代码如下:if (p->next && p->next->jiffies > p->jiffies) {p->next->jiffies = p->next->jiffies - p->jiffies;}即更新原链表中第一个节点相对于新的第一个节点的偏移,剩余的节点不需要更新,因为他相对于他前面的节点的偏移不变,但是原链表中的第一个节点之前前面没有节点,所以偏移就是他自己的值,而现在在他前面插入了一个节点,则他的偏移是相对于前面一个节点的偏移*/}sti();}// 定时中断处理函数void do_timer(long cpl){extern int beepcount;extern void sysbeepstop(void);if (beepcount)if (!--beepcount)sysbeepstop();// 当前在用户态,增加用户态的执行时间,否则增加该进程的系统执行时间if (cpl)current->utime++;elsecurrent->stime++;// next_timer为空说明还没有定时节点if (next_timer) {// 第一个节点减去一个jiffies,因为其他节点都是相对第一个节点的偏移,所以其他节点的值不需要变next_timer->jiffies--;// 当前节点到期,如果有多个节点超时时间一样,即相对第一个节点偏移是0,则会多次进入while循环while (next_timer && next_timer->jiffies <= 0) {void (*fn)(void);fn = next_timer->fn;next_timer->fn = NULL;// 下一个节点next_timer = next_timer->next;// 执行定时回调函数(fn)();}}if (current_DOR & 0xf0)do_floppy_timer();// 当前进程的可用时间减一,不为0则接着执行,否则可能需要重新调度if ((--current->counter)>0) return;current->counter=0;// 是系统进程则继续执行if (!cpl) return;// 进程调度schedule();}
看完上述内容,你们对基于linux0.11操作系统定时器的原理分析有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
节点
定时器
时间
偏移
系统
位置
进程
操作系统
原理
数组
更新
置换
合适
内容
就是
分析
两个
内核
函数
多个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深圳九邦互联网科技有限公司
蓝思科技飞鸽互联网
互联网科技活动banner
互联网下的科技发展
重庆互联网络科技
关于新基建和互联网科技
互联网科技开发公司
互联网科技小贷
互联网科技媒体
电子科技大学互联网
米客互联网科技
碳银互联网科技有限公司
互联网科技有限公司 翻译
本届互联网博览会上的黑科技
为客找房互联网科技公司怎么样
上海同邻互联网科技有限公司规模
恒生科技指数 中概互联网
科技互联网专业工作会议发言稿
数字科技和互联网金融哪个好
知域互联网科技有限公司官网
深圳科技互联网
互联网金融 科技金融
互联网科技革命
长亮科技互联网金融
科技与互联网的利与弊
互联网金融中的现代科技
企晟互联网信息科技有限公司
张家口科技产业互联网平台
恒生科技指数 中概互联网
互联网科技快速发展优美句子