电梯算法

在看linux 0.11版本的块设备驱动部分,里面提到了电梯算法,总结下几种寻道的方式。

        第一种:最为原始的先到先服务(first come first served)的算法。假设此时我们正在第11道读取数据,然后陆陆续续有其他进程来要求我们提供磁盘内容给他们。这里我们把要读取的柱面按照进程提出要求的顺序记录下来,比如1, 36, 16, 34, 9, 12,那么严格按照先到先服务原则,我们下一个要去的柱面是1号,中间要经历10个柱面,然后是36号....... 等全部读下来,我们统计下,一共要"跑过"111个柱面,这个算法效率太低。
        第二种是最短寻道算法(shortest seek first) 这种算法有点类似贪心,即是每次我们选择距离我们现在所处的点最近的一个点(柱面)。如下图,若当前我们正好执行完对于11号块的读取,下一个最近的是12号块,那么我们读取12号块的数据,接着读取16号块...... 我们看到如果用这种算法的话,我们经过的方块号码 12, 9, 16, 1, 34, 36 这样我们总共的经历的柱面数为 61块,这样我们大大节省了寻道时间。 这个算法本来已经很好了,不过我们不得不面临这样一个问题: 现在我们正在读取16号块,马上要读取1号块了,这是一个进程闯进来要求我们为他提供20号块的信息,20号距离16号比较近,那我们就去二十号吧,然后我们又接到通知要23号数据.....假如一直有更接近的请求过来那1号很可能需要很久才能读取它内容!所以这里我们需要一种算法来平衡效率和公平性,避免上述过程中的饥饿,所以我们引进了电梯算法。
        第三种电梯算法:我们需要做一个标记,标记现在是向数字大的方向读,还是方向小的。如果现在是向前(数字大)读,那么我们就需要一直读下去,一直到最尾一个。同理向后读。这个算法如下图所示: 一种平衡效率和公平性的算法(不要让饿死)
        总结:①先到先服务:保证了公平性,但效率低;②最短寻道算法:效率高,但不能保证公平性(有可能饿死)③电梯算法:平衡了效率和公平性

你可能感兴趣的:(linux,0.11版本内核学习笔记)