Linux0.11 块驱动之电梯算法

电梯算法的本质就是将用户的request插入到合适的位置,减少磁头的移动,提高性能

1, IN_ORDER宏

/*
 * 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

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 2022-09-09 15:26  sudochen  阅读(128)  评论(0)    收藏  举报

导航