Skip to main content
 首页 » 编程设计

c++之使用多线程的硬盘争用

2024年02月13日9shihaiming

我还没有对此进行任何配置文件测试,但是对于使用多线程与单线程从硬盘加载资源的优点/缺点有何普遍共识?笔记。我不是在谈论主线程。

我本以为使用多个“其他”线程来进行加载是毫无意义的,因为 HD 无法同时执行两件事,因此肯定只会导致磁盘争用。

不确定在架构上走哪条路,感谢任何建议。

编辑:抱歉,我的意思是 SSD 驱动器而不是磁驱动器。对我来说,两者都是 HD,但我对具有单个 SSD 驱动器的系统更感兴趣。

正如评论中所指出的,使用多个线程的一个优点是大文件加载不会延迟向线程加载器的接收者呈现较小的文件。就我而言,这是一个很大的优势,因此即使这样做会花费一点性能,拥有多个线程也是可取的。

我知道没有简单的答案,但我要问的真正问题是,与仅允许 1 个资源加载器相比,使并行磁盘写入顺序(在操作系统层)会产生什么样的性能百分比损失线?插入这一趋势的因素是什么?我的意思不是平台、制造商等。我的意思是从技术上来说,操作系统/高清交互的哪些方面会影响这种惩罚? (理论上)。

进一步编辑: 我的确切用例是纹理加载线程,它只存在于从 HD 加载,然后将它们“传递”到 opengl,因此线程中的“计算量最少(可能是一些类型转换等)。在这种情况下,线程将花费大部分时间都在等待 HD(我认为),因此了解如何管理操作系统与 HD 的交互非常重要。我的操作系统是 Windows 10。

请您参考如下方法:

Note. I am not talking about the main thread.

主线程与非主线程对读盘速度的影响为零。

I would have thought that using more than one "other" thread to do the loading to be pointless because the HD cannot do 2 things at once, and therefore would surely only cause disk contention.

确实如此。尝试的并行读取不仅被迫相互等待(因此实际上不是并行的),而且还会使磁盘的访问模式变得随机而不是顺序,由于磁盘头寻道时间,顺序访问要慢得多。

当然,如果您要处理多个硬盘,那么专用于每个驱动器的一个线程可能是最佳选择。

<小时 />

现在,如果您使用的是固态驱动器而不是硬盘驱动器,那么情况就不那么明显了。多个线程可能更快、更慢或相当。可能涉及许多因素,例如固件、文件系统、操作系统、驱动器相对于其他瓶颈的速度等。

<小时 />

无论哪种情况,RAID 都可能使此处所做的假设无效。