Linux0.11 块驱动之电梯算法
电梯算法的本质就是将用户的request插入到合适的位置,减少磁头的移动,提高性能
1, IN_ORDER宏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* * This is used in the elevator algorithm: Note that * reads always go before writes. This is natural: reads * are much more time-critical than writes. * #define READ 0 * #define WRITE 1 * #define READA 2 * #define WRITEA 3 * 确定s1是否比s2的优先级高,如果s1比s2的优先级高,返回真,否则返回假 * 读优先 * (s1)->cmd < (s2)->cmd 根据命令判断,读优先 * (s1)->cmd == (s2)->cmd 表示如果命令的优先级一样 * 则通过设备号进行对比,设备号低的优先 * 如果设备号一样 * 则根据扇区进行比较,小的优先 * IN_ORDER宏在add_request函数中调用,其作用是尽量让磁盘减少移动 */ #define IN_ORDER(s1, s2) \ ((s1)->cmd < (s2)->cmd || ((s1)->cmd == (s2)->cmd && \ ((s1)->dev < (s2)->dev || ((s1)->dev == (s2)->dev && \ (s1)->sector < (s2)->sector)))) |
2, add_request
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | static void add_request( struct blk_dev_struct * dev, struct request * req) { struct request * tmp; req->next = NULL; cli(); if (req->bh) req->bh->b_dirt = 0; /* * 如果dev当前的请求项为空,表示当前设备没有请求项 * 因此将req作为当前请求项,并立即进行request回调 */ if (!(tmp = dev->current_request)) { dev->current_request = req; sti(); (dev->request_fn)(); return ; } for ( ;tmp->next; tmp = tmp->next) { /* * 如果tmp的优先级比req高或者tmp比tmp的下一个的优先级高 * 并且req比tmp的下一个优先高 * 这个算法的目的是让磁头尽可能少的移动从而提高性能 * 电梯算法 */ if ((IN_ORDER(tmp, req) || !IN_ORDER(tmp, tmp->next)) && (IN_ORDER(req, tmp->next))) { break ; } } /* * 将req插入request链表中 */ req->next=tmp->next; tmp->next=req; sti(); } |
分类:
Linux0.11
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律