文件缓冲内容写到磁盘

原创 2012年03月30日 10:09:04

c语言中的:标准IO

     都有缓存区,这和系统缓冲不同,我们使用fflush()只保证了将IO缓冲写入系统缓冲中,使IO读操作能成功,但系统什么时候写入磁盘,由系统决定,一般是达到一定量时系统他就写入磁盘。当然可以强制系统将系统文件缓冲的内容写入磁盘:linux中可以使用sync命令或sync系统调用<unistd.h>

命令sync(1)也调用sync函数。

值得注意的是sync函数只是将所有修改过的块缓冲区排入写队列,然后它就返回,它并不等待实际写磁盘操作结束,幸运的是,通常成为update的系统守护进程会周期(30s)调用sync函数,这就保证了定期冲洗内核的块缓冲区,所以我们在linux上更新一个文件后,不要着急重启服务器,最好等待实际的磁盘写操作完成,避免数据丢失。

#include <unistd.h>

void sync(void) /int fsync(int fildes)/int fdatasync(int fildes)

sync系统调用,同步数据到磁盘,fdatasync之同步数据,fsync还会同步metadata,这三个函数都不能保证所有改动写会了磁盘,如上说是将改动后的数据插入写队列

注意标准IO对文件的写入,对多线程是安全的,但c++中的流则不是。-------------c++中的流也同上

系统调用中的read/write是将内容直接写到系统的文件缓冲区。

当closeIO时会使用系统尽快将内容写入磁盘同时释放对应的系统缓冲区。所以写完的IO应该尽快关闭。否则一部分系统缓冲区不能及时释放导致可使用内存减少。

不太对:请参看:http://openbrd.5d6d.com/archiver/tid-32.html

********************************************************************************************************

文件描述符如下使用:
linux:
#include <stdio.h>
#include <unistd.h>

FILE* fp = fopen("./test.dat", "w+");
fwrite(buffer, size, 1, fp);  
int fd = ::fileno(fp); //获取文件描述符
::fsync(fd); //强制写硬盘



windows:
#include <stdio.h>
#include <io.h>

FILE* fp = fopen("./test.dat", "w+");
fwrite(buffer, size, 1, fp);  
int fd = _fileno(fp); //获取文件描述符
_commit(fd); //强制写硬盘

***********************************************************************************************************

如果打开IO然后一天才关闭,中间对IO大量的写入,这样会是内存使用飙升,容易耗尽内存,当如果是日志服务器,每秒要写入的东西很多则要考虑。

while(1)

{

usleep(100);

fprintf(fp, "0000000000000\n");

}

然后看见内存使用飘升

Linux下如何释放内存----转

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了。

Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉么?

所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是释放缓存的操作了。

要达到释放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:

0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存

知道了参数后,我们就可以根据我们的需要,使用下面的指令来进行操作。

首先我们需要使用sync指令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

#sync

接下来,我们需要将需要的参数写进/proc/sys/vm/drop_caches文件中,比如我们需要释放所有缓存,就输入下面的命令:

#echo 3 > /proc/sys/vm/drop_caches

此指令输入后会立即生效,可以查询现在的可用内存明显的变多了。

要查询当前缓存释放的参数,可以输入下面的指令:

#cat /proc/sys/vm/drop_caches



fflush不能强制刷新到磁盘

今天遇到一个问题,写入文件后不能立即更新,试过fflush. 搜到一个帖子http://bbs.csdn.net/topics/320229966 文件描述符如下使用: linux: #in...
  • TANG_XIAO_BIN
  • TANG_XIAO_BIN
  • 2016年11月02日 11:21
  • 472

写数据到文件,并同步写到磁盘

参照redis同步写文件源码,理解同步写数据到磁盘的流程
  • cleanfield
  • cleanfield
  • 2014年11月20日 13:16
  • 1990

cache与内存的映射

原文地址:cache与内存的映射作者:无敌宝贝cache cache 高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。存储器的高速缓冲存储器存储了频繁访问的 RAM 位...
  • Snail239
  • Snail239
  • 2014年01月26日 15:59
  • 908

Linux命令之sync - 强制将内存中的文件缓冲内容写到磁盘

用途说明 Linux内核为了达到最佳的磁盘操作效率,会把需要写入到磁盘的数据现在内存中缓存起来,在合适的时候才真正写入到磁盘中,这在绝大多数情况都是没有任何问题的,而且提高了系统的效率,但是如果...
  • boss111
  • boss111
  • 2015年01月04日 14:23
  • 2423

利用fwrite编写的一个测硬盘速度的程序

#include #include #include #define ARSIZE 1024 int main() { char numbers[ARSIZE] = { 0 }; const ch...
  • xingcen
  • xingcen
  • 2017年02月20日 19:43
  • 785

文件操作的不带缓冲和带缓冲的区别是什么!

以 ssize_t write(int filedes, const void *buff, size_t nbytes)和size_t fwrite(const void *ptr, size_t ...
  • hello_world6
  • hello_world6
  • 2016年11月04日 11:46
  • 591

磁盘缓存和内存缓存的区别

内存缓存高速缓存(英语:cache,英语发音:/kæʃ/ kash [1][2][3],简称缓存),其原始意义是指访问速度比一般随机存取存储器(RAM)快的一种RAM,通常它不像系统主存那样使用DRA...
  • as02446418
  • as02446418
  • 2015年08月23日 22:49
  • 8013

文件缓冲内容写到磁盘

c语言中的:标准IO      都有缓存区,这和系统缓冲不同,我们使用fflush()只保证了将IO缓冲写入系统缓冲中,使IO读操作能成功,但系统什么时候写入磁盘,由系统决定,一般是达到一定量时系统...
  • sctq8888
  • sctq8888
  • 2012年03月30日 10:09
  • 2097

磁盘缓存

磁盘缓存,又称磁盘快取,实际上就是将下载到的数据先保存于系统为软件分配的内存空间中(这个内存空间被称之为“内存池”),当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘...
  • xiaofei0859
  • xiaofei0859
  • 2015年12月04日 12:33
  • 374

JSP内置对象之response

 response     response对象用于响应客户请求,向客户端输出信息。它封装了JSP产生的相应,并发送到客户端,以相应客户端的请求。请求的数据可以是各种数据类型,甚至是文件。...
  • YIAMSOCOOL
  • YIAMSOCOOL
  • 2018年01月16日 16:11
  • 28
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:文件缓冲内容写到磁盘
举报原因:
原因补充:

(最多只允许输入30个字)