linux I/O栈 预习(下)

二、预习下

由于我们在上一篇文章中,描述了比较高层的I/O stack的结构,接下来我们来讲讲底层的结构。

这一节,可能绝大多数的人在实际的工作中,并不是涉及到开发,但也是linux I/O中非常重要的。
那我们就一一列举,来讲讲它们都是什么。
1、Block Layer,在很多年前,我在看SCSI子系统的时候,我那时候就不是太确立Block Layer到底是什么,因为这其中要理解block device、BIO和一系列的request_fn。所以理解block layer应该不是什么简单的事情,因为它是一个很抽象的概念,更不能一言能概括,但是我们能够从图上看出一点,就是经过block layer的多个bio,最终都变成了有序的request,那么我们应该能看出来它可以排序合并bio,并且能够make request from bios。

2、I/O scheduler和blkmq,因为磁盘访问数据寻道和旋转延迟所导致出磁盘访问的一个特性,linux为磁盘设计了特殊的map bios to requests的方式,就叫做I/O scheduler,从这个function的结构来看,一个request从init到build之间的时差是用来map bios的,这个时差对于I/O scheduler是不可控的,linux i/o stack为此提供了一个专属的方法,被叫做blk_plug和blk_unplug,即从上层来派发bios的时候,上层是知道某些bios是需要并且可以做合并和排序的,那么就需要上层来plug这个bios seq,由unplug来触发build request,这个过程通常需要block device之间或和LIO/VFS配合实现。
blkmq:是linux为那些不需要做I/O scheduler的设备所设计的新的队列模型,具有高并发的特性,适用于新型的nvme ssd等具有高hardware queue depth的设备,由于几乎不再依赖blk_plug等增加latency的处理流程,这种I/O队列模型的性能会非常高。

3、scsi mid layer:scsi子系统一直是支持存储协议的big子系统,就连其内部也分为high layer、mid layer和low layer。这三层的特点就好像殖民地时期的殖民地结构,其中high layer扮演者那些殖民者,他们对当地并不熟悉,需要在当地建立傀儡政权,来保证其统治地位,也就是scsi子系统中的high layer用来实现的scsi disk,scsi tape,scsi cdrom,这种scsi高级特性的设备描述,他们是不管当地是什么情况,用同一的方式来发布scsi cmd。为了保证scsi high layer的命令得以执行,那么scsi subsystem中的傀儡政权,也就是scsi结构网络层,scsi mid layer构建了一个等级森严的拓扑方式:host:channel:target:lun,而且必须要所有的low layer都必须遵循这种拓扑方式,虽然说这种方式很残忍,甚至来说在一个host被注册的时候,它直接能和low layer通信的方式也显得很露骨(比如:slave_configure等),但是还有事一批的喜欢当slave的公司做出了无数的scsi low layer的产品,这其中比较著名的是:mpt3sas(lsi),pm8001(pmc),qla2xxx(qlogic)等吧,这些商品一般就是大家比较熟知的sas hba,raid card,fc hba等,所以没有谄媚就没有暴力,他们记住做硬件产品一定要抱个和scsi这样粗的大腿,做出来就不愁卖。但是这些年scsi也没有那么好过了,因为这充满等级森严的scsi mid layer的存储I/O,必须要求所有的scsi deivce去dispatch cmd都必须是一个接口到low layer,导致了单个scsi host没办法发挥新型介质nand flash的所有性能,让新的协议nvme大行其道,好比共产主义给殖民地同志们带来的希望,大家纷纷要突破scsi host的牢笼,那么scsi的命运如何,未来到底会不会被nvme所取代,我们拭目以待。

原文地址:http://blog.51cto.com/12580077/2310283

时间: 2024-10-11 05:31:39

linux I/O栈 预习(下)的相关文章

linux I/O 栈 预习(上)

二.预习 在我们进去device mapper的dm dedup学习之前,我们先要预习一下,什么是device mapper,和为什么device mapper能够做块重删. 1.device mapper照旧,我们先看一下维基百科对它的介绍.The device mapper is a framework provided by the Linux kernel for mapping physical block devices onto higher-level virtual block

Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 在博文Linux内核--网络栈

Linux内核--网络栈实现分析(十一)--驱动程序层(下)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 在博文Linux内核--网络栈

Linux内核--网络栈实现分析(一)--网络栈初始化

本文分析基于内核Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7488828 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 以后的系列博文将深入分析Linux内核的网络栈实现原理,这里看到曹桂平博士的分析后,也决定选择Linux内核1.2.13版本进行分析. 原因如下: 1.功能和网络栈层次

Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7497260 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 经过前面两篇博文的分析,已经对L

Red Hat Enterprise Linux 5.10在vmware10下的安装

Red Hat Enterprise Linux 5.10在vmware10下的安装 1.启动"新建虚拟机"向导程序.如下图,选择"自定义",点击"下一步" 2.选择虚拟机硬件兼容性,你可以根据自己需求选择,这里选择默认,如下图.单击"下一步" 3.指定虚拟机系统的安装方式.选择"稍后安装操作系统",如果选择"安装盘镜像文件(iso)",虚拟机启动后会自动执行快速安装,不方便用户控制安装

Linux进程的栈和进程中函数的栈帧

主要理解了Linux进程的栈和函数的栈帧的区别和联系 上图中刻画的是一个Linux进程的结构图,其中本文想要关注的栈如上图所示是栈底在0xc0000000地址递减的一块进程内存区域 Linux系统中为每个进程分配的实际大小未做深究 Linux进程的栈的整体认知就是这么多,即 1)栈底在0xc0000000(并不需要栈底指针,函数的栈帧才需要栈底指针) 2)栈的增长方向,地址递减方向 3)栈顶指针esp 4)大小未知(不是本文关注的重点) 5)里面存放的内容是什么呢? 另一个概念是上文中提到的函数

使用cygwin移植Linux的项目到Windows下之总结(转)

使用cygwin移植Linux的项目到Windows下之总结(转) 原文 http://my.oschina.net/michaelyuanyuan/blog/68615?p=1 一.why 接到一个任务,把公司的某个在Linux下开发的项目(也就是一个程序啦)移植到Windows下,使得其可以在Windows下运行,并且运行的结果当然要是正确的啦,何谓正确,当然就是和Linux运行结果比对,一样就行. 二.难在何处 难就难在如何在Windows下编译通过.假设你在Linux下开发了一个这样的程

[Linux] 批量转换整个目录下的文件编码为UTF-8;

[Linux] 批量转换整个目录下的文件编码为UTF-8: #!/bin/bash - #===============================================================================# #          FILE: conv.sh#  #         USAGE: ./conv.sh #  #   DESCRIPTION: 一个支持把整个目录递归转换GB2312为UTF-8的脚本: #  #       OPTIONS: