块设备/字符设备/裸设备

  弄清硬盘的低格和高格的概念数据库

  系统中能够随机访问(不须要按顺序)访问固定大小数据片(chunks)的设备称为块设备,这些数据片就称做块。最多见的块设备是硬盘,除此之外,还有软盘驱动器(floppy),CD-ROM驱动器和闪存等等许多其余块设备。注意,他们都是以安装文件系统的方式使用的-----这也是块设备的通常访问方式。缓存

  另外一种基本的设备类型是字符设备。字符设备按照字节流的方式被有序访问,像串口和键盘就属于字符设备(网卡??)。若是一个硬件设备以字符流的方式被访问的话,那就应该归于字符设备;反过来,若是一个设备是随机(无序的)访问的,那么就属于块设备。性能

  这两种类型的设备的根本区别在于它们是否能够被随机访问——换句话说就是,可否在访问设备时随意地从一个位置跳转到另外一个位置。举个例子,键盘这种设备提供的就是一个数据流,当你敲入“fox” 这个字符串时,键盘驱动程序会按照和输入彻底相同的顺序返回这个由三个字符组成的数据流。若是让键盘驱动程序打乱顺序来读字符串,或读取其余字符,都是没有意义的。因此键盘就是一种典型的字符设备,它提供的就是用户从键盘输入的字符流。对键盘进行读操做会获得一个字符流,首先是“f”,而后是“o”,最后是“x”,最终是文件的结束(EOF)。当没人敲键盘时,字符流就是空的。硬盘设备的状况就不大同样了。硬盘设备的驱动可能要求读取磁盘上任意块的内容,而后又转去读取别的块的内容,而被读取的块在磁盘上位置不必定要连续,因此说硬盘能够被随机访问,而不是以流的方式被访问,显然它是一个块设备。   内核管理块设备要比管理字符设备细致得多,须要考虑的问题和完成的工做相比字符设备来讲要复杂许多。这是由于字符设备仅仅须要控制一个位置—当前位置—而块设备访问的位置必须可以在介质的不一样区间先后移动。因此事实上内核没必要提供一个专门的子系统来管理字符设备,可是对块设备的管理却必需要有一个专门的提供服务的子系统。不只仅是由于块设备的复杂性远远高于字符设备,更重要的缘由是块设备对执行性能的要求很高;对硬盘每多一分利用都会对整个系统的性能带来提高,其效果要远远比键盘吞吐速度成倍的提升大得多。另外,咱们将会看到,块设备的复杂性会为这种优化留下很大的施展空间。   简单来说,块设备能够随机存取,而字符设备不能随机存取,那裸设备又该如何解释呢?   难道裸设备,如磁盘裸设备也不能随机读取吗?那在数据库中用裸设备建一个2g的数据文件,为了存取最后一个数据块,难道ORACLE还要把前面的全部数据块都读一遍,显然不符合事实,若是这样解释呢,操做系统不能随机读取,并不意味着数据库也不能随机读取。优化

  块设备经过系统缓存进行读取,不是直接和物理磁盘读取。字符设备能够直接物理磁盘读取。不通过系统缓存。(如键盘,直接相应中断)spa

 

 

在计算机,特别是在类Unix操做系统中,裸设备是一种特殊类型的块设备文件,容许以直接访问硬盘的方式访问一个存储设备,而不通过操做系统的高速缓存和缓冲器(尽管可能仍旧使用硬件高速缓存)。应用程序如数据库管理系统能够直接使用裸设备,启用它们来管理数据的缓存方式,而不将这些任务推给操做系统。操作系统

 

在FreeBSD系统中,全部的块设备实际都是裸设备。为了简化缓存的管理以及加强可测量性和性能,FreeBSD 4.0中中止了对非裸设备的支持。接口

 

  在Linux中,裸设备被反对并列入了移除计划,由于能够经过使用O_DIRECT标志来替代。[1]为了代替访问裸设备文件,应用程序能够(且必须!)经过启用O_DIRECT标志来访问一个文件,且高速缓存将被禁用。因为如今裸设备仍然有必定用户群且仍有一些应用程序没有对O_DIRECT的支持,有关在Linux内核中将裸设备移除仍然是一个有争议的话题。裸设备是一种设备文件系统(major number 162)。Linux为裸设备预留了(i.e. 0),一般状况能够在/dev/rawctl找到它。有人主张,裸设备技术能够将一个裸设备绑定至一个已有的块设备。“已有的块设备”多是Linux所能支持的全部类型接口的磁盘或CDROM/DVD。(如,IDE/ATA或SCSI)ip