Linux 2.6 中提供的几种文件访问方式

所有的 I/O 操作都是通过读文件或者写文件来完成的。在这里,我们把所有的外围设备,包括键盘和显示器,都看成是文件系统中的文件。访问文件的方法多种多样,这里列出下边这几种 Linux 2.6 中支持的文件访问方式。

标准访问文件的方式

在 Linux 中,这种访问文件的方式是通过两个系统调用实现的:read() 和 write()。当应用程序调用 read() 系统调用读取一块数据的时候,如果该块数据已经在内存中了,那么就直接从内存中读出该数据并返回给应用程序;如果该块数据不在内存中,那么数据会被从磁盘上读到页高缓存中去,然后再从页缓存中拷贝到用户地址空间中去。如果一个进程读取某个文件,那么其他进程就都不可以读取或者更改该文件;对于写数据操作来说,当一个进程调用了 write() 系统调用往某个文件中写数据的时候,数据会先从用户地址空间拷贝到操作系统内核地址空间的页缓存中去,然后才被写到磁盘上。但是对于这种标准的访问文件的方式来说,在数据被写到页缓存中的时候,write() 系统调用就算执行完成,并不会等数据完全写入到磁盘上。Linux 在这里采用的是我们前边提到的延迟写机制( deferred writes )。

图1.以标准方式对文件进行读写

同步访问文件的方式

同步访问文件的方式与上边这种标准的访问文件的方式比较类似,这两种方法一个很关键的区别就是:同步访问文件的时候,写数据的操作是在数据完全被写回磁盘上才算完成的;而标准访问文件方式的写数据操作是在数据被写到页高速缓冲存储器中的时候就算执行完成了。

 图2.数据同步写回磁盘

内存映射方式

在很多操作系统包括 Linux 中,内存区域( memory region )是可以跟一个普通的文件或者块设备文件的某一个部分关联起来的,若进程要访问内存页中某个字节的数据,操作系统就会将访问该内存区域的操作转换为相应的访问文件的某个字节的操作。Linux 中提供了系统调用 mmap() 来实现这种文件访问方式。与标准的访问文件的方式相比,内存映射方式可以减少标准访问文件方式中 read() 系统调用所带来的数据拷贝操作,即减少数据在用户地址空间和操作系统内核地址空间之间的拷贝操作。映射通常适用于较大范围,对于相同长度的数据来讲,映射所带来的开销远远低于 CPU 拷贝所带来的开销。当大量数据需要传输的时候,采用内存映射方式去访问文件会获得比较好的效率。

图3.利用mmap代替read

直接 I/O 方式

凡是通过直接 I/O 方式进行数据传输,数据均直接在用户地址空间的缓冲区和磁盘之间直接进行传输,完全不需要页缓存的支持。操作系统层提供的缓存往往会使应用程序在读写数据的时候获得更好的性能,但是对于某些特殊的应用程序,比如说数据库管理系统这类应用,他们更倾向于选择他们自己的缓存机制,因为数据库管理系统往往比操作系统更了解数据库中存放的数据,数据库管理系统可以提供一种更加有效的缓存机制来提高数据库中数据的存取性能。

图四.数据传输不经过操作系统内核缓冲区

异步访问文件的方式

Linux 异步 I/O 是 Linux 2.6 中的一个标准特性,其本质思想就是进程发出数据传输请求之后,进程不会被阻塞,也不用等待任何操作完成,进程可以在数据传输的时候继续执行其他的操作。相对于同步访问文件的方式来说,异步访问文件的方式可以提高应用程序的效率,并且提高系统资源利用率。直接 I/O 经常会和异步访问文件的方式结合在一起使用。


图5.CPU处理其他任务和I/O操作可以重叠进行

Linux 2.6 中的直接 I/O 技术相关推荐

  1. Alibaba Cloud Linux 2.1903 LTS 64位服务器yum源下载404,Alibaba Cloud Linux 2实例中使用docker-ce、epel等YUM源安装软件失败

    [Alibaba Cloud Linux 2.1903 LTS 64位]服务器yum源下载404 failure: repodata/repomd.xml from docker-ce-stable: ...

  2. Linux(CentOS6.5)中安装maven

    Linux(CentOS6.5)中安装maven 1.上传相关包(*.tar.gz等) 使用相关软件上传或用Xshell连接后下载命令:yum install lrzsz 2.安装maven 1> ...

  3. Linux下C++中可使用的3种Hook方法

    Hook即钩子,截获API调用的技术,是将执行流程重定向到你自己的代码,类似于hack.如使程序运行时调用你自己实现的malloc函数代替调用系统库中的malloc函数.这里介绍下Linux下C++中 ...

  4. Linux之vim中翻页的命令

    Linux之vim中翻页的命令 当我们进入Linux的vim编辑器查看脚本时,按上下键查看是不是非常慢?这个时候就要用到我们的翻页快捷键了,快捷键命令如: 整页翻页 ctrl-f ctrl-b ctr ...

  5. linux系统内核文百科,Linux之内核中的文件系统 -电脑资料

    文件描述符 一般说起文件和文件系统的时候,都会下意识的想到它们存在于磁盘上,管理各种文件呢?即运行时文件系统在内核中的表示. 我们知道,进程是操作系统分配资源的基本单位,文件也是在进程中被处理的.比如 ...

  6. Linux 多线程应用中编写安全的信号处理函数

    2019独角兽企业重金招聘Python工程师标准>>> Linux 多线程应用中编写安全的信号处理函数 在 开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_m ...

  7. linux命令在哪里使用,在Linux不同场景中Linux命令的使用方法

    文章目录 1.日志查看实时查看tomcat日志文件查看: 2.修改配置文件内容最常见的就是修改环境变量 3.vi/vim编辑器 4.查看tomcat进程,杀死进程,重启进程. 5.压缩解压缩文件 6. ...

  8. linux命令行 正则,在Linux命令行中使用正则表达式

    上一节我们介绍过grep命令在搜索文本信息时的基本用法,其实,grep命令还可以配合正则表达式执行更加复杂的搜索操作. 本节我们将对如何在Linux命令行中使用正则表达式进行介绍. 所谓正则表达式,就 ...

  9. linux在shell中获取时间

    linux在shell中获取时间 获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量 DATE=$(date +%Y%m%d) 有时候我们需要使用 ...

最新文章

  1. Java项目:教材管理系统(java+SSM+jsp+mysql+maven)
  2. 图像的读取,显示与保存(基于skimage模块)
  3. BZOJ 3489: A simple rmq problem(K-D Tree)
  4. 数据运营者的福音:海量数据处理利器Greenplum
  5. airpods2使用_如何使用AirPods和AirPods Pro:完整指南
  6. hibernate的初次使用
  7. Java 生态圈知识汇总
  8. OpenCV3 for python3 学习笔记3-----用OpenCV3处理图像2
  9. bootstrap dialog
  10. 如何用记事本编写Java代码?
  11. 2016年个人简历模板
  12. 基于eNSP的千人中型校园/企业网络设计与规划(可以自己按步骤实现)
  13. 月薪过万的90后,都是做什么职业的?
  14. win10系统怎么把语言栏弄回去
  15. 【黑马程序员】-c函数
  16. less06 引入(importing)
  17. 飞鹅云打印机api接口asp版,asp源码对接飞鹅云小票打印机
  18. 这是?国内跨境电商降本增收营销神器
  19. 安装vpn和nat以及使用
  20. 简单的面向对象思想,写一个传奇人物的属性

热门文章

  1. ERROR MESSAGE: Invalid command line: Malformed walker argument: Could not find walker with name
  2. [转]SQL SERVER – Find Most Expensive Queries Using DMV
  3. 项目百态:软件项目管理面面观
  4. SolrJ查询Solr数据
  5. Confluence 6 下载和安装 MySQL 驱动
  6. java下实现调用oracle的存储过程和函数
  7. iOS8新特性之交互式通知
  8. PING的原理以及ICMP协议
  9. Android Json生成及解析实例
  10. 面向初级 Web 开发人员的 Tomcat