30天自制操作系统之第13天 定时器(2)
来源:互联网 发布:安装禅道pathinfo.php 编辑:程序博客网 时间:2024/05/22 05:23
这一节我们同样只讲优化工作,关于缓冲区的优化。
我们为键盘、鼠标和定时器各维护了一个FIFO缓冲区,如果定时器有100个,我们要创建100个FIFO缓冲区。这是不优雅的。
FIFO缓冲区的作用:拿定时器1来说,我们怎样知道定时器1超时了。假设它的超时时间是10s,那么10s后,定时器1被告知超时,同时往它的FIFO缓冲区写入数据,这样在其他地方,我们只需查看它的FIFO缓冲区是否有数据,就知道它是否发生了超时,如果超时了进行相应的提示工作。其实简单的说,FIFO缓冲区起到了通讯员的作用。
回到我们的”优雅“问题,我们不必为每一个定时器都维护一个FIFO缓冲区,100个定时器共享一个缓冲区,这样来进行区分:每个定时器超时后往FIFO缓冲区写入不同数据,到时我们读取数据,根据数据是什么得知是哪个定时器超时了。但有一个问题,假设有两个定时器的超时时间是一样的,会不会混乱?假设它们写入FIFO缓冲区的数据是5(5一般是它们的超时时间),我们只需当读到5时,遍历定时器,看谁的超时时间是5,那么这两个定时器都会被处理了,所以不必担心。
这样本来100个缓冲区缩减到了1个,使得下面对所有缓冲区状态的检查代码得以解脱:
if (fifo8_status(&keyfifo) + fifo8_status(&mousefifo) + fifo8_status(&timerfifo) == 0) {
否则,后面要接着fifo8_status(&timerfifo2), fifo8_status(&timerfifo3), ...。同理我们也可以将键盘、鼠标、定时器的缓冲区进行合并,用缓冲区存的数字来区分。
(写入FIFO的数值 中断类型)
0~1 .............................. 光标闪烁用定时器
3 ................................... 3秒定时器
10 ................................ 10秒定时器
256~511 ..................... 键盘输入(从键盘控制器读入的值再加上256)
512~767 ..................... 鼠标输入(从鼠标控制器读入的值再加上512)
这样我们就可以用一个缓冲区进行统一管理了。
这样只需对一个缓冲区的状态进行check,而不用再对1000个,3个进行check,从而大大提高性能。
下面是优化前后的对比,counter窗口的数字越大,说明性能越好。
优化前:
优化后:
- 30天自制操作系统之第13天 定时器(2)
- 30天自制操作系统之第12天 定时器(1)
- 30天自制操作系统之第一天
- 《30天自制操作系统》第2天
- 30天自制操作系统(第一天)
- 30天自制操作系统之第1周(一)【袖珍操作系统怎么转】
- 《30天自制操作系统》之——第03天
- 《30天自制操作系统》之——第04天
- 《30天自制操作系统》之——第05天
- 30天自制操作系统之第11天 制作窗口
- 30天自制操作系统之第17天 命令行窗口
- 30天自制操作系统之第0天备忘梳理
- 30天自制操作系统之第1天
- 《30天自制操作系统》第0天
- 《30天自制操作系统》第1天
- 《30天自制操作系统》第3天
- 《30天自制操作系统》第4天
- 《30天自制操作系统》第5天
- URAL--1008. Image Encoding
- POJ 2299 Ultra-QuickSort(线段树+离散化)
- 设计模式六大原则(3):依赖倒置原则
- Effective Objective-C(第47-52条)系统架构,foundation、for-in、NSTimer
- hdu4845 状态压缩BFS
- 30天自制操作系统之第13天 定时器(2)
- Android Service在测试工程中使用的注意事项
- 要想快,先慢下来
- 使用aireplay-ng时报错“mon0 is on channel ×, but the AP uses channel ×”
- Ubuntu中解决解压zip文件中文乱码问题
- Struts2源码试读1-filter
- 【奇偶剪枝】HDU 1010 Tempter of the Bone
- memcpy的自定义实现的源代码
- hdu oj 2544 最短路(最短路径)