I/O系列 磁盘结构-随机I/O/顺序IO 转

出处: 初识I/O | I/O系列(一)

 

  • I/O,input/output的简写,也就是输入/输出。在计算机系统中,I/O与处理器(CPU)、存储器(内存和磁盘)是计算机的重要组成部件。输入是从I/O设备复制数据到主存,输出是从主存复制数据到I/O设备。I/O实现的功能是通过某种方式,实现计算机和外部环境(磁盘、终端、网络等)之间移动数据。

I/O设备,包括磁盘、键盘、显示器、各种网络传输设备、及各种驱动程序等。计算机系统参与I/O的外设大体分为三类:

  • 人可读:适用于计算机用户间的交互,如打印机和终端,终端包括显示器和键盘,以及鼠标;
  • 机器可读:适用于与电子设备通信,如磁盘驱动器、USB密钥、传感器、控制器和执行器;
  • 通信:适用于与远程设备通信,如数字线路驱动器和调制解调器;

另外,按照输入输出特性还可分为输入型外围设备、输出型外围设备和存储型外围设备。

I/O的控制技术

  询问方式:CPU通过轮询方式,读取设备的标志位状态,在整个数据传输过程中,CPU和外围设备串行工作,效率较低;

  中断方式:外围设备通过中断方式通知CPU,由CPU进行数据的读写,CPU不需要全程参与。不过每次读写都需要CPU复制数据到内存,特点是处理的数据量小,而且,CPU每次都需要处理中断,比较浪费CPU资源,不过相对于询问方式,CPU和外围设备可以并行工作;

  DMA方式:由DMA直接复制内存与外设的数据传输,不需要CPU参与,CPU只负责处理DMA的中断请求,不需要参与数据的读取,效率比较高;

  通道方式:通道又叫输入输出处理器,负责完成主存储器和外围设备之间的信息传送,与CPU并行地执行操作,CPU负责处理通道的开始和结束事件,与DMA相比,通道可以完成数据更多的I/O操作。

  纵观I/O发展过程可以发现,越来越多I/O功能可在没有CPU参与的情况下执行。CPU逐渐从I/O任务中解脱出来,因此提高了性能。

I/O的通用性和效率

在现代计算机系统中,I/O操作通常是计算机系统的瓶颈,与内存和处理器相比,大多数I/O设备的速度都非常低。

引用一张存储设备的金字塔结构图

为了理解操作系统的I/O类型,将I/O操作的几个部分进行抽象化,按照分层思想将I/O组织类型分成三种重要的逻辑结构:逻辑外部设备、通信端口、文件系统。

  本地外部设备:用户进程将外部设备当做一个逻辑资源来处理,用户进程根据设备标识符及简单的命令,如打开、关闭、读、写等,与设备进行打交道;具体操作和数据由驱动程序转换成适当的I/O指令、控制器命令;由调度和控制层进行处理I/O队列、调度、中断等。

  网络通信:网络通信与本地外设的区别在于,逻辑I/O模块被网络通信体系结构取代。如,我们通常使用的HTTP、RPC、TCP/IP。

  文件系统:文件系统通常是操作系统中重要的组成部分,所有文件都存在文件系统中。通常文件的访问通过带有文件目录的标识访问(目录管理,还包括目录本身的操作);文件的操作包括打开、关闭、读、写等(文件管理,还包括访问权限模块);不同物理设备的组织结构的特点,如物理磁道和扇区、磁盘阵列、虚拟内存、物理内存等。

文件系统

  在计算机中,数据存储的地方主要是内存和磁盘,从用户角度看,用户通过磁盘来存储数据,而用户直接使用的就是基于磁盘的文件系统,从系统角度来看,文件系统是操作系统为存储设备和用户之间提供的一个抽象接口,主要实现对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。用户不需要关心磁盘存放数据的细节,用户只需知道文件名称,就可以存取文件中的数据。

磁盘及其原理

  磁盘主要部件为磁盘盘片、传动手臂、读写磁头和主轴马达,实际数据都是写在盘片上,读写主要是通过传动手臂上的读写磁头来完成。结构如下图所示:

  当磁盘需要读取数据时,系统会将数据逻辑地址传给磁盘,磁盘按照寻址逻辑将逻辑地址翻译成物理地址(某个磁道、某个扇区),为了读到某个扇区的数据,需要将磁头放到这个扇区上。整个确定柱面,磁头对准相应磁道的过程叫做寻道时间;然后,将磁盘的带访问地址区域旋转到磁头位置,这个时间叫旋转延迟;最后,就是数据的传输时间,这主要取决于磁盘的旋转速度速度。

所以,总平均存取时间表示为:

其中,Ts为平均寻道时间,r为旋转速度(转/秒),N为一个磁道中的字节数,b为要传送的字节数。

注:为什么机械硬盘随机读取性能和连续读写性能差那么多?(https://www.zhihu.com/question/48254780)

  我们知道磁盘在进行每次读写时候,除了数据的传输时间,都需要寻道时间和旋转时间,这是没有办法避免的,所以,尽量使用顺序读取以减少硬盘的机械处理时间,可以提升整体的读写性能。很多开源框架Kafka、HBase就是将,随机I/O转化成顺序I/O,以此来降低寻址时间和旋转时延,提高IOPS。

 

操作系统对磁盘性能的优化

页面缓存

  由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理

  当一个数据被用到时,其附近的数据也通常会马上被使用;

程序运行期间所需要的数据通常比较集中;

  由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

I/O调度

  I/O调度层的功能是管理块设备的请求队列。即接收通用块层发出的I/O请求,缓存请求并试图合并相邻的请求。并根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的I/O请求。

  如果简单地以内核产生请求的次序直接将请求发给块设备的话,那么块设备性能肯定让人难以接受,因为磁盘寻址是整个计算机中最慢的操作之一。为了优化寻址操作,内核不会一旦接收到I/O请求后,就按照请求的次序发起块I/O请求。

  常见的I/O调度算法包括Noop调度算法(No Operation)、CFQ(完全公正排队I/O调度算法)、DeadLine(截止时间调度算法)、AS预测调度算法等。

缓冲技术

  为了缓和CPU和I/O设备速度不匹配的矛盾,提高CPU和I/O设备的并行性,减少CPU响应中断的频率,在现代操作系统中,几乎所有的I/O设备在与处理机交换数据时都用了缓冲区。通常CPU的速度要比I/O设备的速度快得多得多,所以可以设置缓冲区,对于从CPU来的数据,先放在缓冲区中,然后设备可以慢慢地从缓冲区中读出数据。常见几种方案包括单缓冲,双缓冲,循环缓冲,缓冲池

其他关键概念

  • 多道程序设计技术:单处理器系统中的多个进程调度
  • 多处理器技术:多处理器系统中的多个进程调度
  • 分布式处理器技术:多台分布式计算机系统中多个进程的调度

引申关键字

  • TFS——Taobao File System
  • HDFS
  • Kafka
  • 流式文件
  • SSD
  • 磁盘阵列
  • Buffer与Cache

 


  1. 《操作系统精髓与设计原理》
  2. 《深入理解计算机系统》 第三版
  3. https://blog.csdn.net/qwe6112071/article/details/71822185
  4. https://tech.meituan.com/2017/05/19/about-desk-io.html
  5. https://blog.csdn.net/hguisu/article/details/7408047
  6. https://cloud.tencent.com/developer/news/332953
  7. https://baike.baidu.com/item/%E7%BC%93%E5%86%B2%E6%8A%80%E6%9C%AF/1937843?fr=aladdin

 

posted @ 2020-03-09 12:21  myseries  阅读(1338)  评论(0编辑  收藏  举报