在UNIX和Windows中关闭磁盘I/O缓冲
来源:互联网 发布:阿里大数据竞赛 编辑:程序博客网 时间:2024/06/01 09:12
现代操作系统对磁盘读写一般都提供提供了内存缓冲机制,通常分为直写(write through)和回写(write back)两种方式。直写就是操作系统确保写到磁盘中,系统调用(比如write()函数)才返回;回写可以理解为数据写到内存磁盘缓冲中即返回,由操作系统决定在合适的时间写到磁盘上。所以如果系统出现突然断电等故障,回写的数据可能无法保证其已经写到磁盘上,这对某些应用是不可接受的(比如数据库系统)。
一般在操作系统中,为保证效率,缺省都是采用回写方式。在C语言中,通常可以调用fflush()来把缓冲数据写到磁盘。
先看看UNIX中是怎么处理的。
UNIX主要使用sync, fsync,和 fdatasync函数来控制磁盘缓冲读写。对于传统的Unix系统实现,内核中都有一个buffer cache或 page cache,磁盘I/O的数据都通过它来传递。延迟写(delayed write):当向一个文件写数据时,数据通常被内核拷贝到它的缓冲区,排好序,在将来的某个时刻写到磁盘。为确保磁盘上文件系统和buffer cache中内容的一致性,提供了sync, fsync, 和 fdatasync三个函数。
int fsync(int filedes);
int fdatasync(int filedes);
void sync(void);
sync函数只是简单地将所有已修改的块缓冲排入写队列,并且返回,它不必等待磁盘写操作发生。通常Unix的write只是将数据放到写队列中,写操作在将来某时发生。为了保证有规则地清空内核的块缓冲,系统的一个守护进程(通常称作update)定期地(通常每隔30秒)调用sync。Sync命令也调用sync函数。
fsync函数在返回之前要等待磁盘写操作完成。使用fsync的目的是向应用程序,比如数据库,保证修改的数据块已经写到磁盘。
fdatasync函数类似于fsync,但它只影响文件的数据部分。fsync同时更新文件的属性。
另外,UNIX创建文件也提供了一些选项。比如,可以在open函数中指定O_DSYNC选项,这样每次写都要等上次物理I/O完成,如果不影响读取新写入的数据,则不等待文件属性更新。
在windows中,也有相应的机制,在CreateFile函数中,指定FILE_FLAG_WRITE_THROUGH标记,相当于UNIX的O_DSYNC选项。不过,此时的行为与fdatasync相同,写数据但不写文件的metadata。要同时写metadata,可以使用FlushFileBuffers()函数,相当于UNIX中的fsync函数。
在windows中,要关闭磁盘缓存,可以使用FILE_FLAG_NO_BUFFERING 选项。
http://blog.csdn.net/DLite/article/details/2972107
一般在操作系统中,为保证效率,缺省都是采用回写方式。在C语言中,通常可以调用fflush()来把缓冲数据写到磁盘。
先看看UNIX中是怎么处理的。
UNIX主要使用sync, fsync,和 fdatasync函数来控制磁盘缓冲读写。对于传统的Unix系统实现,内核中都有一个buffer cache或 page cache,磁盘I/O的数据都通过它来传递。延迟写(delayed write):当向一个文件写数据时,数据通常被内核拷贝到它的缓冲区,排好序,在将来的某个时刻写到磁盘。为确保磁盘上文件系统和buffer cache中内容的一致性,提供了sync, fsync, 和 fdatasync三个函数。
int fsync(int filedes);
int fdatasync(int filedes);
void sync(void);
sync函数只是简单地将所有已修改的块缓冲排入写队列,并且返回,它不必等待磁盘写操作发生。通常Unix的write只是将数据放到写队列中,写操作在将来某时发生。为了保证有规则地清空内核的块缓冲,系统的一个守护进程(通常称作update)定期地(通常每隔30秒)调用sync。Sync命令也调用sync函数。
fsync函数在返回之前要等待磁盘写操作完成。使用fsync的目的是向应用程序,比如数据库,保证修改的数据块已经写到磁盘。
fdatasync函数类似于fsync,但它只影响文件的数据部分。fsync同时更新文件的属性。
另外,UNIX创建文件也提供了一些选项。比如,可以在open函数中指定O_DSYNC选项,这样每次写都要等上次物理I/O完成,如果不影响读取新写入的数据,则不等待文件属性更新。
在windows中,也有相应的机制,在CreateFile函数中,指定FILE_FLAG_WRITE_THROUGH标记,相当于UNIX的O_DSYNC选项。不过,此时的行为与fdatasync相同,写数据但不写文件的metadata。要同时写metadata,可以使用FlushFileBuffers()函数,相当于UNIX中的fsync函数。
在windows中,要关闭磁盘缓存,可以使用FILE_FLAG_NO_BUFFERING 选项。
http://blog.csdn.net/DLite/article/details/2972107
- 在UNIX和Windows中关闭磁盘I/O缓冲
- 在UNIX和Windows中关闭磁盘I/O缓冲
- 在UNIX和Windows中关闭磁盘I/O缓冲 sync, fsync, fdatasync
- 异步磁盘 I / O 出现在 Windows NT、 Windows 2000 和 Windows XP 上同步
- [UNIX系统编程] I/O缓冲
- 出现在 WindowsNT、 Windows 2000, 和 WindowsXP, 同步异步磁盘 I/O
- I/O缓冲和内核缓冲
- linux中I/O流中的全缓冲、行缓冲和无缓冲,简明实例演示
- linux中I/O流中的全缓冲、行缓冲和无缓冲,简明实例演示
- 磁盘 I/O 和网络
- UNIX标准I/O的奇奇怪怪的缓冲
- unix c编程:不带缓冲的文件 I/O
- 不带缓冲I/O和标准I/O
- 标准I/O和无缓冲I/O
- C标准I/O缓冲区:全缓冲和行缓冲
- C标准I/O缓冲区:全缓冲和行缓冲
- unix 与 windows I/O 模型
- Unix/Linux 磁盘 I/O 性能监控命令iostat
- 手动挡起步要点,注意了
- C语言:内存字节对齐详解
- 第一章 .Net 控件开发(WebForm) 开发简单自定义控件(6) 自定义Style类
- SSH, SCP ConnectionTimeout
- 使用CStdioFile读写文件
- 在UNIX和Windows中关闭磁盘I/O缓冲
- JNI
- linux man section 节
- 一个软件,internal version 和external version, 安装有问题
- 【JavaScript高级程序设计(第2版).pdf】笔记——基础知识【一】
- [Android分享] Android ListPreference的用法
- Oracle 忘记密码 解决办法 三种验证机制 详解
- android NDK的理解
- xp中图片的图标变化了解决方法