OS Project中简单的缓存优化

最近在做()操作系统的project。

整个系统基本照着《30天自制操作系统》(OSASK)这本书上的代码写。不过,我在系统UI方面一直是颜控,这样做出来的操作系统只有256色,而且处处受制于所谓的调色板,界面连我自己都看不下去。经过参考其他hobby OS的代码,发现了multiboot这一系统规范,其中最吸引我的就是32位颜色以及最高4k分辨率(需要efi)的原生支持。

经过几天的努力,我成功将大部分OSASK的代码移植到了multiboot中,并尽量保持了API的一致。

为了实现炫(zhuang)(bi)的界面,OSASK里面关于绘图的代码当然不能直接用了。

最麻烦的就是透明度。OSASK里面的256色界面几乎没有透明度的概念,而我特别喜欢的半透明窗口边框要求必须引入透明度,所以各图层的缓冲区就得用32位保存。接下来还得重写刷新缓冲区的代码。

考虑到同时叠加的半透明图层可能不止一层,刷新部分使用了简单的递归,也就是每个像素从最上面一层开始往下刷新直到透明度为0。

最终效果确实不错。开始没有引入窗口拖动,所以并没有觉得性能很差。而在实现窗口拖动后能感到严重的延迟。为了优化性能我尝试给每个图层加一个缓冲区,每次只刷新变化了的像素,可惜由于内存管理存在未知bug而反复系统崩溃。

突然想起来计算机组成原理课上讲过关于缓存优化的部分。我们知道CPU缓存的作用是加速大部分内存访问,其核心思想就是Direct mapped cache,也就是说每个内存地址都对应到固定的一块缓存区,每次遇到Cache Miss就把那一块内存搬到缓存中。既然是“块”,就是连续的。到此为止思路就很明确了,尽量连续操作内存就能大大降低缓存的Miss Rate,平均下来的内存访问延迟也就会大大降低。

在显存里面像素是逐行储存的。之前实现刷新像素时由于个人习惯先循环x后循环y。表面看上去没啥问题,实际上每次循环y+1时总体内存偏移量很大,造成了大量没必要的Cache Miss。而简单替换两层循环后刷新速度翻了好几倍,甚至拖动窗口都不卡了。有些时候只需要一点简单的trick就能起到非常显著的效果。

优化前:

优化后:

项目代码:https://github.com/imxieyi/os_project_kernel

文章目录
|