【ubuntu】嵌入式设备断电数据丢失问题

        最近使用opencv保存图像,出现了imwrite保存图像后,看到是0kb的问题。一开始以为是imwrite的问题或者是U盘的问题,直到接了显示器才发现,保存后当时能够看到图像,但是断电后在重启图像丢失了,只有一个图像文件,打开后没有数据,大小为0kb。

       这里找到一段linux系统的文件同步机制。大概就是数据存储要经过几个位置:程序读写----》缓冲区-----》内核------》磁盘

  传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行。当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写(delayed write)(Bach [1986]第3章详细讨论了缓冲区高速缓存)。

  延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,UNIX系统提供了sync、fsync和fdatasync三个函数。

sync函数或者命令:只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。linux默认情况下几乎所有应用场合都是不会将文件立马保存入磁盘的,在嵌入式上也是同样的表现,如果mount时候加上sync选项就可以保证数据立马写入,但是这种会造成系统较多的写入磁盘,磁盘的寿命就不会太长了,如果是需要保存数据,可以显式调用命令sync来写入所有文件,或者fsync来保存某个文件。unix系统运行经验表明,为确保可靠起见,应执行两遍sync命令,这是因为sync命令完成时,并不保证信息实际写到了磁盘上,虽然已经执行了一遍这个命令,cp 完之后要执行 sync 命令将缓冲区的内容写到磁盘中。

 引用来自https://www.cnblogs.com/cslunatic/p/3787984.html

你可能感兴趣的:(linux)