文档章节

io工作机制

huihui1
 huihui1
发布于 2017/05/07 23:48
字数 1414
阅读 23
收藏 0

文件存储方式

    机械硬盘的最小存储单元叫做"扇区"(Sector),每个扇区储存512个字节的数据。操作系统在读取硬盘的时候,不会一个扇区一个扇区地读取,这样效率太低,而是一次性读取多个连续扇区,即一次性读取一个"块"(block)。block的大小通常有1K,2K,4K这三种。(注:一个文件可能占用多个block,每读取一个block就会消耗一次磁盘IO)

    文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode。每个inode都有一个号码,操作系统用inode号码来识别不同的文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

    inode也会消耗硬盘空间,所以在硬盘格式化的时候,操作系统会自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

    inode需要记录的信息非常多,但偏偏inode的大小存在限制。当一个文件有400M且每个block为4k时,就需要大概10w(400*1024/4)个 指向block的索引。为了应对这种情况,系统将block索引区域划分为12个直接索引和3个间接索引(一级,二级,三级)。

    索引节点中的第13个地址指向磁盘中包含下一部分索引数据的block(即block中存储的是索引数据,系统可根据此索引数据找到真实的数据)。称为一级间接索引。依次类推,二级间接索引和三级间接索引就是根据多几次索引数据查询来找到真实数据。

 

标准文件访问方式

    

当应用程序调用read接口时,操作系统检查在内核的高速缓存有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,如果没有,则从磁盘中读取,然后缓存在操作系统的缓存中。

应用程序调用write接口时,将数据从用户地址空间复制到内核地址空间的缓存中,这时对用户程序来说,写操作已经完成,至于什么时候再写到磁盘中,由操作系统决定,除非显示调用了sync同步命令。

直接I/O的方式

这里写图片描述

    直接 I/O 方式就是应用程序直接访问磁盘数据,而不经过操作系统内核数据缓冲区,这样做的目的就是减少一次从内核缓冲区到用户程序缓存的数据复制。此种方式通常是在对数据的缓存管理由应用程序实现的数据库管理系统中。如在数据库管理系统中,系统明确的知道应该缓存哪些数据,应该失效哪些数据,还可以对一些热点的数据进行预加载,提前将热点数据加载到内存,可以加速数据的访问效率。在这些情况下,如果是由操作系统进行缓存,则很难做到,因为操作系统并不知道哪些是热点数据,哪些数据是访问一次后再也不会访问了,操作系统就是简单的缓存最近一次从磁盘读取的数据。

同步访问文件的方式

这里写图片描述

    同步访问文件的方式就是数据的读取和写入都是同步操作的,它与标准访问文件的方式不同的是,只有当数据被成功写到磁盘时才返回给应用程序成功的标志。

异步访问文件的方式

这里写图片描述

    异步访问文件的方式就是当访问数据的线程发出请求之后,线程会接着去处理其他事情,而不是阻塞等待,当请求的数据返回后继续处理下面的操作。这种方式可以明显的提高应用程序的效率(cpu使用率),但是不会改变访问文件的效率。

内存映射的方式(mmap)

    这里写图片描述

    内存映射的方式是指操作系统将内存中的某一块区域与磁盘中的文件关联起来,实现这样的映射关系后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用。相反,内核空间对这段区域的修改也直接反映到用户空间,从而可以实现不同进程间的文件共享。

© 著作权归作者所有

huihui1

huihui1

粉丝 2
博文 2
码字总数 2020
作品 0
昌平
程序员
私信 提问
加载中

评论(1)

庄文达
666
同步,非阻塞,复用,信号驱动,异步IO

划分的原则是线程。考虑的主语也是线程。 除异步以外的IO都是同步,因为只有异步会启用专门的线程。 只有线程才能完成工作。所以只有异步才能完成工作。 其余的都只是API。而IO是有非常实在的...

刘小兵2014
2011/09/01
0
1
[Win32] Win32 RS232讀寫

win32api所提供的serial port读写方式有分两种 同步方式: 读够了指定的字元才会返回(执行绪不会先返回去做其他工作) 非同步方式: ReadFile/WriteFile函式被呼叫之后,执行绪会先返回,win32api...

长平狐
2012/10/08
129
0
11《Java核心技术》之Java提供了哪些IO方式? NIO如何实现多路复用?

一、提出问题 IO 一直是软件开发中的核心部分之一,伴随着海量数据增长和分布式系统的发展,IO 扩展能力愈发重要。幸运的是,Java 平台 IO 机制经过不断完善,虽然在某些方面仍有不足,但已经...

飞鱼说编程
2018/10/22
0
0
C# 跨平台物联网通讯框架 ServerSuperIO (SSIO)

SSIO通信框架的设计思想是在SuperIO(SIO)基础上发展而来,并没有高大上的技术,主要是工作经验的积累,适合于不同应用场景的物联网的数据 采集与交互。SSIO和SIO并不是简单的对IO高性能的操...

wxzz
2016/03/24
21
0
spymemcached源码中Reactor模式分析

简介 spymemcached 是一个 memcached 的客户端, 使用 NIO 实现。采用Reactor模式实现,单线程,高性能Memcached客户端。 spymemcached源码分析:http://my.oschina.net/astute/blog/93492 R...

yychaov5
2013/01/04
0
3

没有更多内容

加载失败,请刷新页面

加载更多

jenkins定时构建时间设置

举几个例子: 每隔5分钟构建一次 H/5 * * * * 每两小时构建一次 H H/2 * * * 每天中午12点定时构建一次 H 12 * * * 每天下午18点定时构建一次 H 18 * * * 在每个小时的前半个小时内的每10分钟...

shzwork
23分钟前
0
0
Myeclipse 问题记录

1. 创建maven聚合(pom) 工程 ,子项目会带上 maven app这些文字,删掉后会导致工程文件在working set里消失,解决办法:右键子项目 import as project 解决问题。...

无敌小学僧
50分钟前
1
0
《Chez Scheme初探》定义变量、递归、测试性能、并列代码编写

普通fib函数 (define (fact n) (if (= n 1) 1 (* n (fact (- n 1)) ) )) 尾递归fib函数 (define (fact-tail n) (fact-rec n n))(defi......

flash胜龙
50分钟前
1
0
任正非对华为热点问题的回应亮了,终于知道华为为什么能扛过这一次的冲击!

任正非对华为热点问题的回应亮了,终于知道华为为什么能扛过这一次的冲击! 如果你是华为的老板,看到一条传遍网络的“美国封锁华为”、“华为禁令”的消息,你会怎么办? 昨天上午,华为创始...

forespider
今天
2
0
Java HTTP 组件库选型看这篇就够了

最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,包括连接创建和超时、空闲连接数控制、每个 host 的连...

Java面经
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部