【发布时间】:2020-01-17 10:23:08
【问题描述】:
我想知道在运行具有 10 个不同线程的单个程序 (exe) 或使用单个线程并行运行该程序 10 次(从 .bat 文件启动它)假设工作完成时,性能是否有任何差异是一样的,只是程序产生的线程数改变了吗?
我正在开发一个客户端/服务器通信程序,并想测试它的吞吐量。我目前正在学习并行编程和线程,因为不确定 Windows 将如何处理上述情况。调度程序在这两种情况下的工作方式是否相同?会有性能差异吗?
运行程序的机器有 4 个线程。
【问题讨论】:
-
不幸的是,程序通常不能并行化,以便所有工作负载可以均匀地分布在线程之间。考虑 i/o,如果程序需要来自文件的输入,则需要读取此输入 4 次(使用 4 个单线程)或以某种方式在线程之间共享输入
-
运行程序 10 次意味着你得到了 10 个进程。运行一个具有 10 个线程的程序意味着您将获得 1 个具有 10 个线程的进程。线程已被引入为“轻量级进程”,以降低并发执行的操作系统开销/负载。因此,理论上一个具有 10 个线程的进程可能会更快,但这当然取决于程序的实现方式以及线程是否可以在没有任何其他同步的情况下真正并发运行,而不是使用一个线程启动 10 个进程...
-
恐怕答案实际上取决于您的操作系统和处理器。在抽象层面上,我猜想线程共享相同的内存空间,因此您的处理器在上下文切换时不必重新映射它,但实际影响是任何人的猜测。
-
不仅仅是操作系统和处理器。还有运行时和程序本身。例如,垃圾收集器对十个进程的工作可能比单个进程更好。或者它可能是相反的。除了“线程被设计比进程更轻量级;有时这有助于提高性能,有时它会扼杀它”之外,还有太多的变量不能说。
-
@foreknownas_463035818 在大多数情况下,我会将相同的问题应用于多线程和进程。如果我找不到额外的 N 个线程可以有效地做的事情,那么额外的 N 个进程意味着什么?
标签: c++ windows multithreading