系统缓存与无缓存

时间:2011-04-14 04:28:41

标签: c++ multithreading readfile

如果我要在一个大文件中读取,同时运行多个线程将在没有缓冲区的情况下运行,传输速度更快,或者运行OS缓冲区会更好吗?

2 个答案:

答案 0 :(得分:2)

你不应该有多个线程同时读取同一个文件,用一个线程读取然后以某种方式将数据发送给其他线程。也就是说,使用缓冲区读取会更快,但标准已经使用缓冲区(如果你使用fread或ifstream读取,如果直接使用funcion读取,则不会有缓冲区。)

请注意,标准中的缓冲区将知道磁盘扇区大小,这意味着如果您使用read direcly,它将减少磁盘访问。

答案 1 :(得分:0)

这在很大程度上取决于访问模式。首先考虑一个带有声音和视频线程的视频播放器。它们都需要在大致相同的位置顺序访问文件。但是,一旦读取,就不再需要数据了。因此,您需要一个提前读取的缓存,但不保留旧数据。

作为第二个示例,请考虑使用基于文件的表的数据库应用程序。多个线程可以执行独立查询。不同表和索引之间的引用位置不同。

显然,这些例子有很大不同。对某些人来说,这表明应用程序应该管理缓存。并不是的;最好的方法是告诉操作系统你要做什么。做出权衡处于更好的位置。它可以查看到磁盘的所有流量,并计算出全局RAM压力。

出于这个原因,内存映射文件可以是一种以随机访问方式读取具有多个线程的大文件的高性能方法。它为操作系统提供了平衡I / O和内存的好机会。