我正在编写一个小应用程序,它以恒定速率在 SD 卡上写入 jpeg 图像。我选择了 EXT3 文件系统,但使用 EXT2 文件系统观察到了相同的行为。
我的写作循环如下所示:
get_image()
fwrite()
fsync()
或者像这样:
get_image()
fopen()
fwrite()
fsync()
fclose()
我还显示了一些计时统计信息,我可以看到我的程序有时被阻塞了几秒钟。平均速率还是不错的,因为如果我将传入的图像保持在一个 fifo 中,那么我会在这样的停顿后的短时间内写入很多图像。你知道这是操作系统的问题还是与SD卡本身有关?我怎样才能更接近实时?我不需要强大的实时性,但是停滞几秒钟是不可接受的。
一些精度:是的,有必要在每个文件之后进行 fsync,因为我希望图像在磁盘上,而不是在某些用户或内核缓冲区中。没有 fsyncing,我的直通输出要好得多,但仍然是不可接受的停顿。我认为这不是缓冲区问题,因为第一次停顿发生在写入 50 MB 之后。根据手册页, fsync 正是为了确保没有缓冲数据。
关于平均写入速率的精度:我正在以我正在使用的卡可持续的速率写入。如果我在等待 fsync 完成时堆积传入的图像,那么在这个停顿之后,写入传输速率会增加,我会很快回到平均速率。平均传输速率约为 1.4 MBytes / s。
systeme 是运行 ubuntu 8.04 和 stock kee (2.6.24.19) 的现代笔记本电脑