操作系统定时器原理分析(基于linux0.11)

2024-03-27 21:38

本文主要是介绍操作系统定时器原理分析(基于linux0.11),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

操作系统的定时器原理是,操作系统维护了一个定时器节点的链表,新增一个定时器节点时,设置一个jiffies值,这是触发定时中断的频率。linux0.11版本里是1秒触发100次,即10毫秒一次。加入新增一个定时器的jiffies值是2,那经过两次定时中断后就会被执行。jiffies值在每次定时中断时会加一。

_timer_interrupt:push %ds		# save ds,es and put kernel data spacepush %es		# into them. %fs is used by _system_callpush %fspushl %edx		# we save %eax,%ecx,%edx as gcc doesn'tpushl %ecx		# save those across function calls. %ebxpushl %ebx		# is saved as we use that in ret_sys_callpushl %eaxmovl $0x10,%eaxmov %ax,%dsmov %ax,%esmovl $0x17,%eaxmov %ax,%fsincl _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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853465

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。