Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 同时写入还是顺序写入--这对速度有影响吗?_Multithreading_Multicore_Disk Access - Fatal编程技术网

Multithreading 同时写入还是顺序写入--这对速度有影响吗?

Multithreading 同时写入还是顺序写入--这对速度有影响吗?,multithreading,multicore,disk-access,Multithreading,Multicore,Disk Access,同时写操作还是顺序写操作——这对速度有影响吗 对于多核处理器,使用多线程并行所有文件写入操作是否有意义,只是为了提高速度?当然,所有这些写操作都是独立的 这取决于磁盘及其控制器。他们有TCQ/NCQ吗?是袭击吗? 如果是这样的话,这也许有点道理。对于一个普通的SATA磁盘(不带NCQ),它不会这样做。首先编写最简单的代码,然后看看它在目标环境中的性能是否足够好。(不同的磁盘、操作系统版本、CPU、驱动程序等可能会显著影响结果。) 如果最简单正确的代码不够快,那么尝试找出执行IO的更快方法是有意义

同时写操作还是顺序写操作——这对速度有影响吗


对于多核处理器,使用多线程并行所有文件写入操作是否有意义,只是为了提高速度?当然,所有这些写操作都是独立的

这取决于磁盘及其控制器。他们有TCQ/NCQ吗?是袭击吗?
如果是这样的话,这也许有点道理。对于一个普通的SATA磁盘(不带NCQ),它不会这样做。

首先编写最简单的代码,然后看看它在目标环境中的性能是否足够好。(不同的磁盘、操作系统版本、CPU、驱动程序等可能会显著影响结果。)

如果最简单正确的代码不够快,那么尝试找出执行IO的更快方法是有意义的。据猜测,如果您正在向不同的磁盘写入数据,那么并行化写入操作可能是有意义的,但在其他情况下可能不会。不过这只是一个完全的猜测

纯属巧合,我计划很快对相关情况进行基准测试。我有一个描述我打算执行的测试的列表,当我得到一些结果时,我会用一个指向结果的链接来更新条目。它和你描述的不太一样,但是很近,可能会引起人们的兴趣。

一般来说,不会

到目前为止,对磁盘的物理写入在数量级上是一个瓶颈,而且在大多数情况下都是按顺序进行的。并行写操作很有可能导致查找,从而使性能恶化。在大多数情况下,顺序读写的性能将大大优于交错读写

每磁盘并行化(TCQ和NCQ)主要通过减少不同客户机同时从磁盘的不同部分请求数据时自然需要的寻道来工作。如果你能从一开始就避免这些追求,你会过得更好

在某些情况下(RAID 1、JBOD或不同的数据流到达相当慢的情况下),正确的调度可以提高吞吐量,但这需要熟悉手头的硬件,以及其他不会破坏乐趣的流程



充其量,您可以将此作为最终用户的决定(例如,提供关闭选项),并提供性能度量来指导他。(你甚至可能会证明我错了;)

如果你说的是写入一个文件,答案是否定的。你不能并行写入一个文件,因为每个进程或线程都必须从操作系统获取文件锁才能进行写入


否则,这取决于硬件控制器和存储类型、操作系统内核和文件系统实现。

从技术上讲,您可以映射文件并让多个线程写入,但磁盘可能仍然会造成瓶颈


如果您需要最大限度地提高I/O吞吐量,那么首先应该研究您的环境支持的异步I/O。

这是一个简单的问题,但答案可能非常复杂。Les尝试通过一些假设来缩小场景范围:操作系统是Windows,您有相对大量的写操作是真正独立的

  • 只需异步发出写操作,就可以跳过多线程
  • 一次发出所有命令-让操作系统安排写操作
  • 写入到同一个文件还是不同的文件并不重要。注意,只有当上述关于写操作独立的假设成立时,这才是正确的
  • 最糟糕的情况是,这将不会比并行ATA控制器上的一个普通的每日旧磁盘慢:它会很慢

    最好的情况是,操作系统可以非常高效地安排写操作。如果存储系统有很多主轴,或者有支持NCQ的磁盘,则会出现这种情况

    这里要记住的关键是磁盘I/O(通常)不受CPU的限制,所以特意使用多核对您没有帮助;这只会让生活变得复杂


    请注意,如果您对写入进行排序,使其在文件中(整体)连续,或在磁盘上按范围排序,则可以提供帮助。

    这都是事实,但我看不出与问题的相关性。也许OP已经知道最简单的代码优先咒语,但他想从代码的角度收集一些关于计算机架构的一般知识。问题是使用复杂的技术是否有意义。我认为我的回答基本上是“如果你的应用程序已经表现得足够好,那就没有意义了”,这是非常相关的。OP当然没有指出他确实存在性能问题。我没有投票反对你,但你当然可以将写入操作并行化到单个文件。您只需要让不同的线程写入file.Mmm的不同部分。如果磁盘具有命令队列和重新排序功能,那么实际中的磁头将基本上从左端摆动到右端,在运行时收集数据。这种情况下的并行写入大大提高了吞吐量,因为没有实际的寻道开销。只有在应用程序需要大量时间准备数据时才可以。通常,对磁盘的物理写入是瓶颈的10倍或更多,旋转磁头不会使其更快。