static const int MAX_BUFFER_LEN = 1024*12; //in byets char *bff = new char[MAX_BUFFER_LEN]; int fileflag = O_CREAT | O_WRONLY | O_NONBLOCK; fl = open(filename,fileflag,0666); if(fl < 0) { printf("can not open file! n"); return -1; } do { ///begin one loop struct timeval bef; struct timeval aft; gettimeofday(&bef,NULL); write(fl,bff,MAX_BUFFER_LEN); gettimeofday(&aft,NULL); if(aft.tv_usec - bef.tv_usec > 20000) //ignore second condition { printf(" cost too long:%d n",aft.tv_usec - bef.tv_usec); } //end one loop //sleep usleep(30*1000); //sleep 30ms }while(1);
当我在Linux ubuntu 2.6.32-24-generic上运行程序时,发现COST TOO LONG打印在一分钟内显示1〜2次。 我试了两个USB硬盘和硬盘。我也试过这个程序在arm平台上,这种情况也发生了。 我认为3.2Mbps对于低速IO设备来说太高了。 所以我降低到了0.4Mbps,大大降低了打印频率。 是否有解决scheme来控制时间成本? write()只是将数据复制到kenal缓冲区并立即返回或等待fo磁盘IO完成? 是否有可能肯尼尔IO缓冲区已满,必须等待冲洗,但为什么只有几次花费这么久?
创build一个附加到控制台的进程,但带有redirect的标准IO句柄
在Windows平台上的.NET互斥:我完成后会发生什么?
旋转宇宙飞船模型的空间模拟器/游戏
Windows 10上的蓝牙LE在第二次连接尝试时抛出exception0x80070572
pthread窗口事件等效的问题
你不能加速磁盘,但你可以在磁盘工作的时候做其他的事情。 你不需要等待它完成。
但是,这在C中非常重要。您将需要非阻塞I / O,多线程或多处理。 尝试使用Google搜索这些关键字,以及如何使用不同的技术(您已经在那里使用非阻塞的fd)。
磁盘I / O性能受到每个写入周围的代码的负面影响,以测量时间(在这种粒度下测量时间会随着计算机做其他事情而偶尔出现尖峰)。