Multithreading 线程中的并行性

Multithreading 线程中的并行性,multithreading,operating-system,cpu,cpu-architecture,Multithreading,Operating System,Cpu,Cpu Architecture,线程中的并行性是否也能使单CPU系统中的进程受益?我知道它们可以在其他系统中有所帮助,但我不知道它们是否真的能让单CPU系统受益 您可以使用线程作为异步I/O的机制,例如保持多个磁盘和网络负载处于运行状态,这甚至可以在单处理器系统上工作 大多数操作系统都有异步或非阻塞IO API,允许您在单线程进程中执行相同的操作,但这对某些应用程序来说可能不太方便 有关一些讨论,请参阅:例如,基于事件的非阻塞I/O通常比“数十亿个阻塞线程”要好得多,在“数十亿个阻塞线程”中,每个I/O操作都有一个单独的线程,

线程中的并行性是否也能使单CPU系统中的进程受益?我知道它们可以在其他系统中有所帮助,但我不知道它们是否真的能让单CPU系统受益

您可以使用线程作为异步I/O的机制,例如保持多个磁盘和网络负载处于运行状态,这甚至可以在单处理器系统上工作

大多数操作系统都有异步或非阻塞IO API,允许您在单线程进程中执行相同的操作,但这对某些应用程序来说可能不太方便

有关一些讨论,请参阅:例如,基于事件的非阻塞I/O通常比“数十亿个阻塞线程”要好得多,在“数十亿个阻塞线程”中,每个I/O操作都有一个单独的线程,同时等待

因此,无论如何,是的,您可以在单核(无超线程或其他)系统上有效地使用线程,用于数字处理吞吐量以外的其他用途。(但获得I/O并发性或并行性的其他方法或任何你想称之为并行性的方法通常更好。)


还有其他用例,比如一个线程运行GUI,另一个线程运行模拟的游戏。让操作系统安排它们可能比插入“现在是时候更新GUI了”检查或在模拟线程中更简单


(或者任何有GUI+计算的东西,因为您不想从计时器的信号处理程序运行GUI。)

如果不使用线程,您会遇到一些痛苦的问题。假设你正在做的事情可能会阻碍,但可能不会。您可以找到一些异步的方法来实现它,但这会使编程变得更加复杂,而且如果它很少阻塞,那么回报也不会很大。但是如果你同步进行,那么在极少数情况下它会阻塞,你的整个过程就不会向前推进


页面错误就是一个很好的例子。考虑服务器是否遇到错误并必须运行代码来记录该错误。此代码可能不在内存中,可能需要磁盘操作才能读取该代码。在磁盘操作完成之前,是否希望整个服务器不向前推进?

您可以在下面的帖子中找到更好的答案:


你的问题太宽泛了,我想这取决于操作系统和其他因素。即使在今天,单个CPU也有多个核心。这意味着什么呢?有很多不同的并发/异步/并行编程范例。此外,什么是单CPU?大多数CPU都是多核的,支持超线程。顺便说一句,由于操作系统是多线程的,所以您的计算机在键入时不会阻塞。应用程序在执行繁重的处理时不会阻塞,因为它们是在后台线程上执行的(这就是并发性)。或者他们可能正在使用一个单独的线程来读/写文件。或者他们甚至可能不使用线程来读取文件,他们使用异步IO让操作系统处理它,并在它完成时回调。这是异步IO处理。与web浏览器一样,它在等待网站响应时不会冻结(ok,不总是)。它使用异步IO和后台线程来处理多个请求。异步IO的可能重复与并行不同。事实上,异步IO意味着您不需要使用线程来等待阻塞operation@PanagiotisKanavos:我在回答我认为OP想要问的问题,即“线程对UP系统上的任何东西有用吗?”。我在回答中避免使用“并行性”一词:如果使用异步IO,则不需要线程。您需要线程等待同步(即阻塞IO)。并不是说你不能使用不同的线程来处理结果。@PanagiotisKanavos:谢谢,我的上一段话听起来好像线程在异步IO中仍然有用。修复,并添加了另一个用例。呵呵,我刚才就这个问题展开了评论,我看到你在计算+GUI方面也提出了同样的观点。