【发布时间】:2011-08-24 21:53:42
【问题描述】:
我有一个用户级程序,它使用标志O_WRONLY|O_SYNC 打开一个文件。该程序创建了 256 个线程,每个线程尝试将 256 个或更多字节的数据写入文件。我希望总共有 1280000 个请求,总共有大约 300 MB 的数据。一旦完成 1280000 个请求,程序就会结束。
我使用pthread_spin_trylock() 来增加一个变量,该变量跟踪已完成的请求数。为了确保每个线程写入一个唯一的偏移量,我使用pwrite() 并根据已经写入的请求数计算偏移量。因此,我在实际写入文件时不使用任何互斥锁(这种方法是否确保数据完整性?)
当我检查 pwrite() 呼叫被阻止的平均时间以及使用 @ 找到的相应数字(即平均 Q2C 时间——这是 BIO 整个生命周期的时间度量)时987654321@,我发现有很大的不同。事实上,给定 BIO 的平均完成时间远大于 pwrite() 调用的平均延迟时间。这种差异背后的原因是什么?这些数字不应该相似吗,因为O_SYNC 确保数据在返回之前实际写入物理介质?
【问题讨论】:
标签: c linux concurrency pthreads block-device