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