【30天自制操作系统】 计时器

Abstract: 《30天自制操作系统》计时器
Keywords: 《30天自制操作系统》,Macbook,计时器

计时器

昨天一直在搭建环境,想在mac下实现书上制作镜像和编译连接相关文件的功能,无奈,弄了一天还是不太好用,看到另外一个微博上的童鞋用Linux完成了相关操作,想试一下,但os x上没有objcopy等命令,而且gcc好像也是改版的,而且现在被我折腾的连命令行下使用command line tools 都有问题,所以,我还是回来把笔记补上。一会儿再去弄,争取放假之前能把环境搞定,这样寒假就可以专心研制自己的系统了,而不用把时间花到细枝末节上。
昨天的内容讲的是计时器,我一开始没觉得定时器有啥功能,无非是弄个钟表出来,后来我看到了超时(timeout)恍然觉得这个东西很主要,作者并没有直接说去定时器在以后的实现中有什么作用,但是一直对中断处理程序进行优化可以看出,这个东西以后要被不停地使用,而且作者提出定时器后,马上有多弄了几个,而且最多能实现500个定时器,第十二天的主要工作就是优化处理速度,因为中断处理时所有的中断信号都被屏蔽了,所以必须快速的处理,恢复中断响应。
下面的图是作者最开始的设计:
Center
其中条状的是定时器的执行时间,横坐标是时间,纵坐标是各定时器,不论有多少个定时器,都要循环500次(也就是最多个的情况),所以这对要求效率的工作并不是个好主意,于是开始优化。
首先可以将定时器排队,就像我们有两场球赛在不同的频道,一个十分钟后在c1频道,一个二十分钟后在c2频道,我们只要盯着那个十分钟后开始的c1频道就可以了,你可以每两分钟过来看一下,如果c1开始了,我们才会去关注c2是否开始(寝室有一哥们能同时看三场球。。。。)也就是说c1不发生,理论上来说c2绝不会发生,所以就优化出了下图:
Center 1
上图横轴是时间,没有纵轴,每个小格子就是不同的定时器之间的间隔,每个定时器都是从头开始到对应的线,也就是把所有定时器从小到大排列起来,然后弄到一根轴上,这样就可以只监视下一个要超时的定时器就可以了。
而上图还是要监视500个,于是下一步的优化就是记录当前计时器的个数,减少循环,之前还有一步就是尽量减少循环中的计算,包括比较(if语句)尽量减少少数情况的判断,提高速度。
涉及到的主要问题就是速度优化,下面列举一些常用到的比较简单的循环体的优化方式:

1:将在循环里面多次计算,但是结果不会改变的计算,移到循环外面去。

2:减少函数调用

3:减少内存访问

4:减少对少数特殊情况的测试

目前就这些,以后用到定时器会继续说。。

0%