AD

linux中的块设备和字符设备

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

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

这两种类型的设备的根本区别在于它们是否可以被随机访问——换句话说就是,能否在访问设备时随意地从一个位置跳转到另一个位置。举个例子,键盘这种设备提供的就是一个数据流,当你敲入“fox”这个字符串时,键盘驱动程序会按照和输入完全相同的顺序返回这个由三个字符组成的数据流。如果让键盘驱动程序打乱顺序来读字符串,或读取其他字符,都是没有意义的。所以键盘就是一种典型的字符设备,它提供的就是用户从键盘输入的字符流。对键盘进行读操作会得到一个字符流,首先是“f”,然后是“o”,最后是“x”,最终是文件的结束(EOF)。当没人敲键盘时,字符流就是空的。硬盘设备的情况就不大一样了。硬盘设备的驱动可能要求读取磁盘上任意块的内容,然后又转去读取别的块的内容,而被读取的块在磁盘上位置不一定要连续,所以说硬盘可以被随机访问,而不是以流的方式被访问,显然它是一个块设备。

内核管理块设备要比管理字符设备细致得多,需要考虑的问题和完成的工作相比字符设备来说要复杂许多。这是因为字符设备仅仅需要控制一个位置—当前位置—而块设备访问的位置必须能够在介质的不同区间前后移动。所以事实上内核不必提供一个专门的子系统来管理字符设备,但是对块设备的管理却必须要有一个专门的提供服务的子系统。不仅仅是因为块设备的复杂性远远高于字符设备,更重要的原因是块设备对执行性能的要求很高;对硬盘每多一分利用都会对整个系统的性能带来提升,其效果要远远比键盘吞吐速度成倍的提高大得多。另外,我们将会看到,块设备的复杂性会为这种优化留下很大的施展空间。

简单来讲,块设备可以随机存取,而字符设备不能随机存取,那裸设备又该如何解释呢?

难道裸设备,如磁盘裸设备也不能随机读取吗?那在数据库中用裸设备建一个2g的数据文件,为了存取最后一个数据块,难道oracle还要把前面的所有数据块都读一遍,显然不符合事实,如果这样解释呢,操作系统不能随机读取,并不意味着数据库也不能随机读取。

块设备通过系统缓存进行读取,不是直接和物理磁盘读取。

字符设备可以直接物理磁盘读取。不经过系统缓存。(如键盘,直接相应中断)

标签:
分类: 技巧
时间: 2014-03-21

相关文章

  1. 字符设备驱动程序中重要的三个数据结构file_operations.inode.file

    字符设备驱动程序中重要的三个数据结构file_operations.inode.file 在学习字符设备驱动的开始,我们必须了解的是三个很重要的数据结构,他们分别是file_operations.inode.file.下 ...
  2. linux设备驱动第三篇:写一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如 ...
  3. ceph中关于块设备的操作

    一.创建块设备 qemu-img create -f rbd rbd:资源池名/块设备名 文件大小 例如: qemu-img create -f rbd rbd:rbd/test 1G 说明:在资源池rbd下创建一个名为 ...
  4. LDD3阅读笔记-字符设备驱动

    主要开发流程介绍 module_init宏和module_exit宏 当模块装载时需要调用module_init宏指定的函数,卸载时需要调用 module_exit宏指定的函数 以下是简单的init流程: 初始化设备 初 ...
  5. Android中查看USB连接的外接设备信息的代码实例

    这篇文章主要介绍了Android中查看USB连接的外接设备信息的代码实例,需要的朋友可以参考下 1,USB存储设备(如:U盘,移动硬盘): //USB存储设备 插拔监听与 SD卡插拔监听一致. private USBBr ...
  6. find ----- Linux中find常见用法示例

    find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数: pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示 ...
  7. linux中强大且常用命令:find.grep

    在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 find命令的常用 ...
  8. 在嵌入式Linux中实现802.11b无线网关

    构成有线 网络的传输媒介主要依赖铜缆或光缆:但有线网络在某些场合要受到布线的限制,特别是当要把相隔较远的节点连接起来时,敷设专用通信线路的布线施工难度大. 费用高.耗时长,对正在迅速扩大的连网需求形成了瓶颈.无线局域网的 ...
  9. Linux中增加软路由的三种方法

    Linux中增加软路由的三种方法 第一种:route add -net 172.16.6.0 netmask 255.255.255.0 gw 172.16.2.254 dev eth0/* 增加一条网络172.16.6 ...
  10. Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载

    王瑞川 ( [email protected]), linux爱好者 简介: 动态链接,一个经常被人提起的话题.但在这方面很少有文章来阐明这个重要的软件运行机制,只有一些关于动态链接库编程的文章.本系列文章就是要从源 ...
  11. Linux中SUID和SGID详解

    如果你对SUID.SGID仍有迷惑可以好好参考一下! 由 于用户在UNIX下经常会遇到SUID.SGID的概念,而且SUID和SGID涉及到系统安全,所以用户也比较关心这个问题.关于SUID.SGID的 问题也经常有人提 ...
  12. Linux中find常见用法示例

    ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数: pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表 ...
  13. Linux中获取某个进程的系统调用以及参数(故障排查案例)

    这篇文章主要介绍了Linux中获取某个进程的系统调用以及参数的方法,总结自一个故障排查案例,需要的朋友可以参考下 当一个程序发生故障时,有时候想通过了解该进程正在执行的系统调用来排查问题.通常可以用 strace 来跟踪 ...
  14. linux中ls命令使用详解

    这篇文章主要介绍了linux中ls命令使用详解,基本上涵盖了所有的操作了,需要的朋友可以参考下 ls命令是linux下最常用的命令.ls命令就是list的缩写?缺省下ls用来打印出当前目录的清单?如果ls指定其他目录?那 ...
  15. Linux中从普通用户启动Wireshark抓包

    译自http://packetlife.net/blog/2010/mar/19/sniffing-wireshark-non-root-user/ 本文介绍Linux中的方法,Windows用户可以参照Wireshar ...
  16. 完美解读Linux中文件系统的目录结构

    一.前 言 接触Linux也有一段时间了,不过这几天在编译开源程序时,才发现自己对linux文件系统的目录结构了解的不够透彻,很多重要目录都说不清楚是用来干嘛的,于是在网上百度了一下这方面的介绍,根据自己的使用习惯,整理 ...
  17. linux中的"瑞士军刀"

    linux中的"瑞士军刀" busybox 俗称linux中的瑞士军刀,它类似于linux系统中bash 的一个缩微版,常用于嵌入式设备中,例如你的android手机中等等.busybox作为一个开源 ...
  18. Linux中文件查找方法大全

    每一种操作系统都是由成千上万个不同种类的文件所组成的.其中有系统本身自带的文件,用户自己的文件,还有共享文件等等.我们有时候经常忘记某份文件放在硬盘中的哪个地方.在微软的Windows操作系统中要查找一份文件是相当简单的 ...
  19. C语言中使用lex统计文本文件字符数

    这篇文章主要介绍了C语言中使用lex统计文本文件字符数,本文直接给出实现代码,需要的朋友可以参考下 我曾经在Linux上写的一个C程序,借助Lex做词法分析来同时统计N个文本文件的字符数,单词数和行数.让我觉得Lex确实 ...