【问题标题】:Threads ordering in C++/LinuxC++/Linux 中的线程排序
【发布时间】:2011-04-24 00:12:36
【问题描述】:
我目前正在用 C++ 模拟硬盘驱动器 IO,并且我正在使用 pthread 线程和互斥锁来读取磁盘。
但是,我试图通过对线程进行排序来优化阅读时间。问题是我的磁盘当前正在读取一个扇区,并且一堆读取请求到达,其中任何一个都会被执行。我想要的是对它们进行排序,以便接下来执行具有最近扇区的请求。
这样,虚拟硬盘的磁头就不会过度移动。
我的问题是:使用 Linux 进程优先系统是确保最接近的读取请求将在其他请求之前执行的好方法吗?如果没有,我可以依靠什么来做到这一点?
PS:对不起我的英语。
感谢您的帮助。
【问题讨论】:
标签:
c++
multithreading
algorithm
pthreads
【解决方案1】:
依赖进程优先级方案的确切行为很少是一个好主意,尤其是在像 Linux 这样的通用操作系统上,因为它们并不能真正保证您有任何特定的行为。如果它引用内存中的某个地址或某些 I/O 调用导致它暂时停止,那么将其设为最高优先级将无济于事 - 操作系统将运行一些优先级较低的进程,你会感到不愉快惊讶。
如果您想确定磁盘 I/O 请求完成的顺序,或者为了模拟这一点,您可以创建一个线程来保存待处理 I/O 列表并要求执行请求一次,按照它控制的顺序。
【解决方案2】:
Linux 内核中的 I/O 调度程序可以重新排序和合并读取(以及在某种程度上写入),以便它们的排序对磁盘更有利,就像您所描述的那样。这会影响进程调度程序(它也处理线程),因为等待 I/O 的线程也会被“重新排序”——它们的读取或写入请求按照磁盘为它们提供服务的顺序完成,而不是按照顺序完成他们在其中提出了要求。 (这是对实际情况的非常简化的视图。)
但是,如果您正在模拟磁盘 I/O,即,如果您实际上并未进行真正的 I/O,则根本不涉及 I/O 调度程序。只有进程调度程序。并且进程调度程序不知道您正在“模拟”硬盘 - 它没有关于进程正在做什么的信息,只是关于它们是否需要 CPU 资源的信息。 (同样,这是对事物运作方式的简化视图)。
因此,进程调度程序不会帮助您重新排序或合并读取请求的模拟。您需要在代码中实现该逻辑。 (阅读 I/O 调度程序是个好主意。)
如果您确实提交了真正的 I/O,那么在某些情况下自己进行重新排序可能会提高性能,实际上 I/O 调度程序用于优化吞吐量或延迟的算法会影响您的线程的调度方式(用于阻塞无论如何都是 I/O - 异步 I/O 让它变得更加复杂)。