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();
}

 

 

posted on   sudochen  阅读(111)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示