您的位置:首页 > 数据库

数据文件的DIO

2013-10-19 12:56 316 查看
如大家现在知道的,数据库系统一般都是在操作系统之上去运行的,因此,与底层的硬件是有着一层隔离的。但是对于数据库系统来说,我们并希望通过操作系统的错误而导致数据库的错误产生,因此,我们希望数据库对磁盘的操作是直接进行读写的,这种读写,我们称作DIO,也就是直接IO机制。

首先来看一下,普通的通常情况下的文件IO,此时呢,读写文件会借助于操作系统的文件缓冲区,这样能够减少磁盘的读写次数,一是缩短了时间,二是延长了磁盘的使用寿命,三是增快的文件的读写时间。在这种情况下,我们也称为是缓存IO。

但是,在数据库系统数据文件中,我们通常不会使用缓存IO方式,大家可以想象一下,如果你在数据库中,插入一条数据,此时,肯能要写文件,同时,你也写成功了,于是你关闭了文件,写入了成功的日志。但是在系统中,文件是此时就写到磁盘的吗,通常情况是没有这么及时的,又突然,系统断电或者生病,死了,在系统缓存中的文件是否写回去了呢,如果有,那是幸运,如果没有呢,那就是玩完了。

当然在系统的IO中,拥有不同三种机制:同步IO机制、异步IO机制、延时IO机制。这三种中,貌似同步异步IO可以使用在数据库系统中,但是在仔细一想,我想大家就可以发现,同步IO造成的读写磁盘次数过多,异步IO显然是可以进行数据库文件读写,比如Oracle中也有使用异步IO的,但是具体的实现与原理,我还没有接触到,考虑到基于两个e(Embedded,Experiment),我决定采用自缓存策略,一来,可以控制缓存的大小,控制程序所需的内存;二来,在缓存替换算法那块,可以做一点铺垫,以便以后大家用的到的地方进行实验与研究。因此在文件读写上,我是决定使用直接IO的机制。

当然,还有很多中读写方式,但是据我所需,我想这些我也就够用了。下面是一种linux文件标识符:我可能常用到也就O_RDWR、O_

DIRECT、O_LARGEFILE(这个标识目前还不知道最大文件到多大啊,支持可以大于2G)。

标识符名
标识符描述
O_RDONLY
以只读的方式打开文件
O_WRONLY
以只写的方式打开文件
O_RDWR
以读写的方式打开文件
O_CREAT
若文件不存在,则创建该文件
O_EXCL
以独占模式打开文件;若同时设置 O_EXCL 和 O_CREATE, 那么若文件已经存在,则打开操作会失败
O_NOCTTY
若设置该描述符,则该文件不可以被当成终端处理
O_TRUNC
截断文件,若文件存在,则删除该文件
O_APPEND
若设置了该描述符,则在写文件之前,文件指针会被设置到文件的底部
O_NONBLOCK
以非阻塞的方式打开文件
O_NELAY
同 O_NELAY,若同时设置 O_NELAY 和 O_NONBLOCK,O_NONBLOCK 优先起作用
O_SYNC
该描述符会对普通文件的写操作产生影响,若设置了该描述符,则对该文件的写操作会等到数据被写到磁盘上才算结束
FASYNC
若设置该描述符,则 I/O 事件通知是通过信号发出的
O_DIRECT
该描述符提供对直接 I/O 的支持
O_LARGEFILE
该描述符提供对超过 2GB 大文件的支持
O_DIRECTORY
该描述符表明所打开的文件必须是目录,否则打开操作失败
O_NOFOLLOW
若设置该描述符,则不解析路径名尾部的符号链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息