内核为了处理来自IO层的请求,需要进行相应的优化,因为当请求很多时,且请求的块又都几种在一块,那么如果按照顺序处理这些请求无疑是很大的时间开销,所以,我们需要寻求方法来处理这种情况(当然,不只是这一种情况),这篇文章介绍的就是Linux中经典的IO调度程序--Linus电梯,这个是以Linux的发明者Linus自己的名字命名的。在2.4版的内核中,Linus电梯是默认的IO调度程序。虽然在后来的2.6版内核中它被另外两个调度程序所取代了,但是由于这个调度程序比后来的调度程序简单,而且它们执行的许多功能都相似,所以,它可以作为一个优秀的入门介绍程序。

      首先,讲解下为什么这个调度程序被称作是电梯调度

      大家都知道,我们在读磁盘上的数据时,首先肯定是磁头进行寻址,找到数据存储的位置(扇区)。而这个调度算法正是认为按着磁头方向移动的顺序调度请求是比较好的情况,当到达磁盘的末尾时,磁头再转换另一个方向移动到另一端,就像是生活中的电梯执行的方式,如下图所示:


      Linus电梯能执行合并于排序预处理。当有新的请求加入队列时,它首先会检查其他每一个挂起的请求是否可以和新的请求合并。Linus电梯IO调度程序可以执行向前和向后合并,合并类型描述的是请求向前面还是向后面,这一点和已有请求连接。如果新的请求正好连在一个现存的请求前,那么就是向前合并;相反,如果一个请求连接在一个现存的请求之后,那么就是向后合并。鉴于文件的分布特点和IO操作执行方式具有典型性,所以向前合并要比向后合并少得多,但是Linus电梯还是会对两种合并类型都进行检查。

      如果合并尝试失败,那么就需要寻找可能的插入点。如果找到,新的请求将被插入到该点;如果没有合适的位置,那么新的请求就被加入到队列的末尾。

      总而言之,当一个请求加入到队列中时,有可能发生四种操作,它们依次是:

1> 如果队列中已经存在一个相邻磁盘扇区操作的请求,那么新的请求将会和这个已经存在的请求进行合并

2> 如果队列中存在一个驻留时间过长的请求,那么新的请求将被插入到队列尾部,已防止其他旧的请求存在饥饿现象

3> 如果队列中以扇区方法为序存在合适的插入位置,那么新的请求将被插入到该位置,保证队列中的请求是以被访问磁盘物理位置为序进行排列的

4> 如果队列中不存在合适的请求插入位置,请求将被插入到队列尾部

Linux2.6--Linus电梯的更多相关文章

  1. 读书笔记之Linux系统编程与深入理解Linux内核

    前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...

  2. 《Linux内核设计与实现》读书笔记(十四)- 块I/O层

    最近太忙,居然过了2个月才更新第十四章.... 主要内容: 块设备简介 内核访问块设备的方法 内核I/O调度程序 1. 块设备简介 I/O设备主要有2类: 字符设备:只能顺序读写设备中的内容,比如 串 ...

  3. 20169210《Linux内核原理与分析》第九周作业

    第一部分:实验 首先还是网易云课堂的学习,这次的课程是可执行程序的装载. 预处理.编译和链接: 可执行程序是怎么来的 以c语言代码为例的话,经过预处理,编译成汇编代码,再汇编成目标码再链接可执行文件. ...

  4. 20179223《Linux内核原理与分析》第八周学习笔记

    视频学习 可执行文件是怎么得来的? .c汇编成汇编代码.asm,然后再汇编成目标码.o.然后在连接成可执行文件,然后加载到内存可执行了. 对hello.c文件预处理(cpp),预处理负责把includ ...

  5. Linux内核设计笔记14——块I/O层

    块I/O层 基本概念 系统中可以随机访问固定大小数据片的硬件设备称做块设备,这些固定大小的数据片称之为块.还有一种基本的设备称之为字符设备,其需要按照顺序访问,比如键盘. 扇区:块设备中最小的寻址单元 ...

  6. 2017-2018-1 20179205《Linux内核原理与设计》第八周作业

    <Linux内核原理与设计>第八周作业 视频学习及操作分析 预处理.编译.链接和目标文件的格式 可执行程序是怎么来的? 以C语言为例,经过编译器预处理.编译成汇编代码.汇编器编译成目标代码 ...

  7. Linux核心设计依据(六)该块I/O一层

    块设备是能随机存取装置固定大小的数据表设备.如硬盘:字符设备(如串口和键盘)它是按照字符流进入有序进行.不同之处在于是否足够的随机存取数据--这时候,你可以随心所欲地从一个位置跳到访问设备和位置.复杂 ...

  8. 初探内核之《Linux内核设计与实现》笔记下

    定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...

  9. linux2.6内核链表

    一.        链表数据结构简介      链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链 ...

随机推荐

  1. hdu 5451(矩阵 +Fibonacci )

    题意:求 [(5 + 2*sqrt(6))^(1 + 2^x)]  % M 基于hdu2256可以求(5 + 2*sqrt(6))^ n 但是n特别大,我们可以找矩阵的循环节 两种可能 1.mod-1 ...

  2. [bzoj4245][ONTAK2015]OR-XOR

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费 ...

  3. CTSC2017 铁牌记

    Day 0: 先到了丽都酒店. 看见北京八十中学生在发胸牌手册和T恤,领完之后开始分房间. 我和ryc一屋,lyd和ysq一屋,yzy和gzz分到了珀利酒店,老师尝试了半天把我们分到一个酒店,失败了. ...

  4. django-rest-framework 注意事项

    注意事项: 在使用django rest framework时候由于网上资料太多,出现了 由一下两个函数导致的问题: from django.views.decorators.csrf import ...

  5. SQL Server2008 安装失败后的解决办法

    SQL Server2008 安装不容易成功,或许用这种方法可能会安装成功.     首先,把电脑上的SQL Server2008 卸载干净 怎么卸载干净? 1.找到控制面板-->卸载程序--& ...

  6. C语言程序设计预报作业

    1. 阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:万物都是变化的,师生关系也一样.小学中学把老师看作春蚕,蜡烛的的比喻到了大学显然行不通了.大 ...

  7. JVM基础

    1.基础 JDK  将java文件编译成class文件 JRE   包含JVM JVM可以进行内存管理 利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(j ...

  8. manjaro备忘录

    updated 2018/4/3 manjaro 使用Linux发行版时需要注意几个方面的问题: 包管理器 包管理器无疑时各家发行版的最大特色之一.软件同时也是一个平台是否能够产生足够的吸引力的来源之 ...

  9. MYSQL 表左连接 ON AND 和ON WHERE 的区别

    首先是针对左右连接,这里与inner join区分 在使用left join时,on and 和on where会有区别 1. on的条件是在连接生成临时表时使用的条件,以左表为基准 ,不管on中的条 ...

  10. 动态SQL中不同变量的写法总结

    .一般变量的写法: if (str_kind is not null) then l_str_kind := str_kind; v_wheresql := v_wheresql || ' and k ...