块设备是能随机存取装置固定大小的数据表设备。如硬盘;字符设备(如串口和键盘)它是按照字符流进入有序进行。不同之处在于是否足够的随机存取数据——这时候,你可以随心所欲地从一个位置跳到访问设备和位置。复杂多,实际上内核在块设备上下了大工夫——块I/O层。

基础概念

  • 块设备中最小的可寻址单元是扇区。
  • 文件系统的最小寻址单元是块。

  • 所谓的缓冲区是块在内存中的表示。
  • 对于一个缓冲区(块),内核须要知道它的控制信息。这时须要一个结构进行描写叙述——缓冲区头。

I/O调度机制

首先,这里的I/O调度指的是磁盘调度。磁盘寻址是非常耗时的一项操作。对于同一时候存在的各种磁盘I/O请求,我们须要利用一些I/O调度程序实现最省时的请求处理——I/O调度程序让整个请求队列按扇区增长方向有序排列。使全部请求按硬盘上扇区的排列顺序有序排列的目的不仅是为了缩短单独一次请求的寻址时间,更重要的优化在于,通过保持磁盘头以直线方向移动,缩短了全部请求的磁盘寻址时间。

该排序算法类似于电梯调度——电梯不能任意地从一层跳到还有一层,它应该向一个方向移动。当抵达了同一方向上的最后一层后,再掉头向还有一个方向移动。所以I/O调度程序称作电梯调度。

另外出了排序,合并也是一种降低磁盘寻址时间的方法。合并是将两个或多个请求结合成一个新请求,这样将多次请求的开销压缩成一次请求的开销,更重要的是,请求合并后仅仅须要传递给磁盘一条寻址命令。就能够訪问到请求合并前必须要多次寻址才干訪问完的磁盘区域,总之降低了磁盘寻址次数。

排序。降低寻址时间。而合并,降低寻址次数,二者共同作为I/O调度程序的准则。

以下看一下五个Linux实际使用的I/O调度程序。
(1)Linus电梯
当一个请求增加到队列中时。有可能发生四种操作:
  • 假设队列中已存在一个对相邻磁盘扇区操作的请求。那么新请求将和这个已经存在的请求合并成一个请求。
  • 假设队列中存在一个驻留时间过长的请求,那么新请求将被插入到队列尾部,以防止其它旧的请求饥饿发生。
  • 假设队列中以扇区方向为序存在合适的插入位置。那么新的请求将被插入到该位置,保证队列中的请求是以被訪问磁盘物理位置为序进行排列的。
  • 假设队列中不存在合适的请求插入位置。请求将被插入到队列尾部。
(2)终于期限I/O调度程序
对磁盘同一位置的连续请求造成较远位置的其它请求永远得不到执行机会,这是一种非常不公平的饥饿现象。

在最后期限I/O调度中。每一个请求都有一个超时时间,默认情况下。读请求的超时时间是500ms。写请求的是5s,最后期限I/O调度请求类似于Linus电梯,也以磁盘物理位置为次序维护请求队列,这个队列称为排序队列。当一个新请求递交给排序队列时,最后期限I/O调度程序在执行合并和插入请求时类似于Linus电梯,可是最后期限I/O同一时候也会以请求类型为根据将它们插入到额外队列中。

读请求按次序被插入到特定的读FIFO队列中,写请求按次序插入到特定的写FIFO队列中,尽管普通队列以磁盘扇区为序进行排列。可是这些队列是以FIFO(以时间为序)组织的,结果新队列总是被增加到队列尾部,对于普通操作来说。最后期限I/O将请求从排序队列头部取下。再推入到派发队列,由派发队列将请求提交给磁盘驱动。从而保证了最小化的请求寻址。

而最后期限I/O的超时体如今读写FIFO队列头的请求超时时。调度程序便会提取请求进行服务。这样不用操心有请求不能得到服务的不公平现象。

(3)预測I/O调度程序
基本上同终于期限。只是它能进行预測。假设读请求一个接着一个,对于终于期限来说要不停地为读请求寻址。而且中断正在进行的写请求,这会损害系统全局吞吐量。假设我们能等待,将一个接着一个的读请求进行统一寻址,这会避免大量的寻址操作。在一个请求提交后,预測会接着有I/O请求在等待期到来。从而有意等待片刻(不是一提交请求就立马返回处理其它请求),这便是预測I/O的巧妙之处。

这样的预測依靠一系列的启示和统计工作。

(4)全然公正的排队I/O调度程序
它给每个进程维护一个队列,请求增加队列后的操作同Linus电梯的四种操作,这事实上在进程级提供了公平。
(5)空操作的I/O调度程序
不进行排序。也不预測。它仅仅进行合并——将相邻请求合并。而且维护请求队列以近乎FIFO的顺序排列。

版权声明:本文博主原创文章。博客,未经同意不得转载。

Linux核心设计依据(六)该块I/O一层的更多相关文章

  1. Linux核心设计依据(七)系统调用

    我理解的系统调用,用户进程和内核是内核提供了一个接口进行交互.除了异常和下降外.内核系统调用是唯一合法入境.像/proc还通过系统调用访问. 系统调用的意义: 让用户进程受限地訪问硬件设备 为用户空间 ...

  2. 《Linux Device Drivers》第十六章 块设备驱动程序——note

    基本介绍 块设备驱动程序通过主传动固定大小数据的随机访问设备 Linux核心Visual块设备作为基本设备和不同的字符设备类型 Linux块设备驱动程序接口,使块设备最大限度地发挥其效用.一个问题 一 ...

  3. bootparam - 介绍Linux核心的启动参数

    描叙 Linux 核心在启动的时候可以接受指定的"命令行参数"或"启动参数".在通常情况下,由于核心有可能无法识别某些硬件,或可能将某些硬件识别为不正确的配置, ...

  4. 举例说,Linux核心名单(两)

    使用列表 我认为最好的方式,成为熟悉的核心列表功能是看一些简单的例子,素材去更好的理解链表. 以下是一个样例.包括创建.加入.删除和遍历链表. <span style="font-si ...

  5. Linux系统查看有几块硬盘

    使用df命令即可查看.df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置: 示例:[root@localhost ~]# d ...

  6. Linux以列表格式显示块设备

    Linux以列表格式显示块设备 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ lsblk -l NAME MAJ:MIN RM SIZE RO TYPE MO ...

  7. Linux核心命令

    Linux核心命令 strace(查看系统调用的一个过程) 例:strace cat /test.txt netstat perf top pidstat mpstat dstat vmstat sl ...

  8. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  9. Linux下按扇区读写块设备

    本文介绍Linux下按扇区读写块设备(示例TF卡),实际应用是在Android系统上,主要方法如下: 1.找到sdcard的挂载点,在android2.1系统下应该为/dev/block/mmcblk ...

随机推荐

  1. (转)xshell无法在vim中复制黏贴

    ssh xshell 连接在vim中无法用 ctrl+insert 复制黏贴 修改.vimrc set mouse=c vi的三种模式:命令模式,插入模式,可视模式.鼠标可以启动于各种模式中: The ...

  2. java三大特性:封装、继承、多态

    Java三大特性之封装   一.定义 封装性指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问. 二.使用封装的好处: 1 ...

  3. 【例题5-9 UVA - 1592】Database

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举不同的列是哪两个列,然后枚举行. 把那一行的这两列的字符接在一起,然后用map判重. 为了防止逐个比较字符. 可以一开始先把字符 ...

  4. 23、V4L2应用编写及各个ioctl涉及结构体说明分析

    常用的结构体在内核目录include/linux/videodev2.h中定义 struct v4l2_requestbuffers  //申请帧缓冲,对应命令VIDIOC_REQBUFSstruct ...

  5. [慕课笔记]mongodb入门篇

    一:对mongodb有一个系统的完备的了解,只有概念清楚了,才能更好的使用 二:学会mongodb数据库的搭建 首先:了解如何部署数据库的服务 搭建简单的单机服务到搭建具有冗余容错功能的复制集再到搭建 ...

  6. Effective C++ 条款28

    避免返回handles指向对象内部成分 本节作者讲述的知识核心是对于一个类来说,应该避免类返回自己内部的私有数据. 例如以下: class Point{ public: Point(int x, in ...

  7. heredoc(实现模板与代码的分离)

    heredoc(实现模板与代码的分离) 一.总结 heredoc实现模板与代码的分离,实现的是在后台编程语言中批量输出html代码,在这个批量输出的html代码中又可以嵌套编程语言变量.所以很方便. ...

  8. 【29.42%】【POJ 1182】食物链

    Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64875 Accepted: 19085 Description 动物王国中有三 ...

  9. csdn博客栏目加入微博关注

    大家首先切换到:博客专栏,然后点击"加入专栏".然后直接复制下述代码就能够了: <a href="http://weibo.com/u/3247569660/hom ...

  10. ios开发之手势处理 之手势识别一

    #import "ViewController.h" @interface ViewController ()<UIGestureRecognizerDelegate> ...