前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >30天自制操作系统之第13天 定时器(2)

30天自制操作系统之第13天 定时器(2)

作者头像
全栈程序员站长
发布2022-07-14 15:25:35
2680
发布2022-07-14 15:25:35
举报
文章被收录于专栏:全栈程序员必看

这一节我们相同仅仅讲优化工作,关于缓冲区的优化。

我们为键盘、鼠标和定时器各维护了一个FIFO缓冲区,假设定时器有100个,我们要创建100个FIFO缓冲区。这是不优雅的。

FIFO缓冲区的作用:拿定时器1来说,我们如何知道定时器1超时了。如果它的超时时间是10s,那么10s后,定时器1被告知超时,同一时候往它的FIFO缓冲区写入数据,这样在其它地方,我们仅仅需查看它的FIFO缓冲区是否有数据,就知道它是否发生了超时,如果超时了进行对应的提示工作。事实上简单的说,FIFO缓冲区起到了通讯员的作用。

回到我们的”优雅“问题,我们不必为每个定时器都维护一个FIFO缓冲区,100个定时器共享一个缓冲区,这样来进行区分:每个定时器超时后往FIFO缓冲区写入不同数据,到时我们读取数据,依据数据是什么得知是哪个定时器超时了。但有一个问题,如果有两个定时器的超时时间是一样的,会不会混乱?如果它们写入FIFO缓冲区的数据是5(5通常是它们的超时时间),我们仅仅需当读到5时,遍历定时器,看谁的超时时间是5,那么这两个定时器都会被处理了,所以不必操心。

这样本来100个缓冲区缩减到了1个,使得以下对全部缓冲区状态的检查代码得以解脱:

代码语言:javascript
复制
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窗体的数字越大,说明性能越好。

优化前:

优化后:

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/118039.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档