开始新对话

未解决

此帖子已超过 5 年

5784

2012年10月17日 22:00

Linux存储管理基础:如何理解I/O?

​ ​
​ ​

​Linux​​存储管理基础:如何理解​​I/O​​?​

​ ​
​ ​

​ ​

​转载请在文首保留原文出处:​​EMC​​中文支持论坛​

​ ​
​ ​

​介绍​

​ ​
​ ​

​ ​

​Linux​​存储管理系统是如何处理​​I/O​​的?本文介绍了在操作系统的应用层和存储设备终端生成​​I/O​​的基本步骤和属性以及​​I/O​​类型。​

​ ​
​ ​

​更多信息​

​ ​
​ ​

​ ​

​通常定义的​​I/O​​(或​​Input/Output​​)是指在电脑和设备之间执行一次输入和​​/​​或输出操作的能力。输入设备可以是键盘或鼠标,基于输入设备,更新光标坐标的监视器可作为输出设备。在数据存储方面,​​I/O​​通常表示输入和输出磁盘设备的数据流(如:块设备)。​

​ ​

​ ​

​块设备是指能够处理文件系统和​​/​​或存储非易失性数据的设备​​(​​即:硬盘驱动,​​CD-ROM​​,软盘等​​)​​。在现代计算机系统里,块设备只能处理一次传输整个或多个块(或扇区)的​​I/O​​操作,通常为​​512​​字节长度(或​​2​​的指数倍)。块设备可以通过本地、网络或通过物理设备接口共享挂载的文件系统节点来访问。使用文件系统的优点是增加数据存储的组织结构特性使其可以同时被用户和操作系统(及其应用程序)访问。文件系统因众多的功能模块而日趋先进,用户能够管理冗余并在高性能环境下进行操作。没有文件系统,物理设备也只是一系列无意义的字节值。也将不会出现识别文件位置的源数据,包括文件相关信息如:文件大小、权限等。​

​ ​

​ ​

​回到​​I/O​​处理。有多种方式用于初始化存储设备的​​I/O​​处理。在操作系统的应用层和存储设备终端生成​​I/O​​的基本步骤包括:​

​ ​
    ​ ​
  • ​打开设备或文件​
  • ​ ​
  • ​设置读取或写入地址​
  • ​ ​
  • ​执行读或写操作​
  • ​ ​
  • ​重复执行步骤​​2​​和步骤​​3​
  • ​ ​
  • ​关闭设备或文件​
  • ​ ​
​ ​

​ ​

​尽管这些步骤看起来较为简单,但仍需采用很多变量以定义​​I/O​​处理的行为。这些变量通常称为​​I/O​​属性。配置​​I/O​​属性的其中一部分参数包括:​

​ ​
    ​ ​
  • ​传送大小 —— 需传送字节数或块数。​
  • ​ ​
  • ​寻址方式 —— 顺序、随机或混合。​
  • ​ ​
  • ​范围 —— 执行并维护​​I/O​​操作及其大小的区域。例如:磁盘设备的前​​100​​个块或创建长度小于​​1GB​​的文件。​
  • ​ ​
  • ​进程数量 —— 产生同时运行在磁盘设备之上的​​I/O​​的进程总数。包括最大主机数及对中断存储设备进行​​I/O​​操作的进程数。​
  • ​ ​
  • ​数据模式 —— 载入读写缓存并写入​​/​​读出磁盘设备的数据模式。​
  • ​ ​
  • ​时序 —— ​​I/O​​生成的速率包括读写操作的不同耗时差异。​
  • ​ ​
​ ​

​ ​

​以上列出了构成​​I/O​​属性的大部分参数,​​I/O​​属性也包括了主机总线适配器​​HBA​​的类型及配置,​​SCSI​​层队列深度,​​SCSI​​磁盘的超时限制,如果磁盘设备位于阵列中,用户还需考虑磁盘设备的​​stripe/chunk​​大小甚至​​RAID​​类型等其他因素。理解​​I/O​​属性的构成在研发,设计和故障定位中显得尤为重要。​

​ ​

​ ​

​当用户空间发起一个需要读出​​/​​写入磁盘设备时,需进入内核空间以恢复该进程。​​Linux​​系统​​I/O​​分为以下两类:​

​ ​

​1.​​文件​​I/O​

​ ​

​对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符。​

​ ​

​可用的文件​​I/O​​函数​​——​​打开文件,读文件,写文件等。​​UNIX​​系统中的大多数文件​​I/O​​只需用到​​5​​个函数:​​open​​、​​read​​、​​write​​、​​lseek​​以及​​close​​。它们是不带缓冲的​​I/O​​,都使用文件描述符。在使用​​read​​和​​write​​函数时,选定不同大小的缓冲区(保存读和写的数据),效率是不同的。存在一个最佳效率的缓冲区大小,就是缓冲区大小等于文件系统的块长。​

​ ​

​ ​

​2.​​标准​​I/O​

​ ​

​对于标准​​I/O​​库,它们的操作则是围绕流进行的。当用标准​​I/O​​库打开或创建一个文件时,使用一个流与一个文件相关联。当打开一个流时,标准​​I/O​​函数​​fopen​​返回一个指向​​FILE​​对象的指针。该对象通常是一个结构,它包含了标准​​I/O​​库为管理该流所需要的所有信息,包括:用于实际​​I/O​​的文件描述符,指向用于该缓冲区的指针、缓冲区的长度、当前在缓冲区中的字符数以及出错标志等。​

​ ​

​预定义了三个标准​​I/O​​流,分别为三个文件指针​​stdin​​,​​stdout​​和​​stderr​​。​

​ ​

​标准​​I/O​​库提供缓冲的目的是尽可能减少使用​​read​​和​​write​​调用的次数。它对每个​​I/O​​流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。标准​​I/O​​提供三种类型的缓冲:全缓冲、行缓冲和不带缓冲。​

​ ​

​1​​)全缓冲:直到缓冲区填满,才调用系统​​I/O​​函数。​

​ ​

​2​​)行缓冲:直到遇到换行符​​\n​​才调用系统​​I/O​​函数。​

​ ​

​3​​)无缓冲:灭有缓冲区,数据会立即读入或者输出到外存文件和设备上。​

​ ​
​ ​

​参考​

​ ​
​ ​

​ ​

​Linux​​存储管理基础​

​ ​
​ ​

​应用于​

​ ​
​ ​

​ ​

​Linux​​主机系列​

​ ​

​ ​

1 消息

2015年12月24日 02:00

透彻

找不到事件!

Top