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