multithreading - 单核上的多线程有什么意义?

标签 multithreading cpu

我最近一直在使用Linux内核,然后回到大学学习OS类(class)的日子。

就像那时一样,我在玩线程之类的东西。一直以来,我一直认为线程可以在多个内核上自动并发运行,但是最近我发现实际上必须显式地编写代码来处理多个内核。

那么,单核上的多线程有什么意义呢?我能想到的唯一例子是在编写客户端/服务器程序时从大学毕业,但这似乎是一个弱点。

最佳答案

All this time I had been assuming that threads were automatically running concurrently on multiple cores but I've recently discovered that you actually have to explicitly code for handling multiple cores.



上面对于任何广泛使用的现代OS是不正确的。例如,所有Linux的调度程序都会自动调度不同内核上的线程,并在必要时甚至自动将线程从一个内核转移到另一个内核,以最大限度地利用内核。有一些API允许您修改调度程序的行为,但是这些API通常用于禁用自动线程到核心调度,而不是启用它。

So what's the point of multi-threading on a single core?



假设您有一个GUI程序,其目的是执行昂贵的计算(例如,渲染3D图像或Mandelbrot集),然后显示结果。假设此计算在此特定CPU上需要30秒才能完成。如果您以明显的方式实现该程序,并且仅使用一个线程,则在执行计算时,用户的GUI控件将在30秒内无响应-用户将无法对您的程序执行任何操作,并且可能无法执行任何操作。完全不用电脑做任何事。由于用户期望GUI控件始终保持响应,因此这将是糟糕的用户体验。

另一方面,如果用两个线程(一个GUI线程和一个渲染线程)实现该程序,则即使在计算时,用户也可以单击按钮,调整窗口大小,退出程序,选择菜单项等。正在执行,因为操作系统能够唤醒GUI线程并在必要时允许它处理鼠标/键盘事件。

当然,可以通过编写单个线程来执行仅几毫秒的计算,然后用一个线程编写该程序并使其GUI保持响应,然后检查是否有可处理的GUI事件进行处理。 ,然后返回进行更多的计算,等等。但是,如果以这种方式编写应用程序代码,则实际上您还是在应用程序内编写了自己的(非常原始的)线程调度程序,那么为什么要重新发明轮子呢?

MacOS的第一个版本旨在运行在单个内核上,但没有真正的多线程概念。这迫使每个应用程序开发人员正确实现一些手动线程管理-即使他们的应用程序没有任何扩展计算,他们也必须明确指出何时使用CPU完成操作,例如通过调用WaitNextEvent。这种多线程的缺乏使MacOS的早期版本(MacOS-X之前的版本)在多任务处理方面不可靠,因为只有一个编写不当的应用程序可能会使整个计算机陷入停顿。

关于multithreading - 单核上的多线程有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37226594/

相关文章:

python - 多线程数据工作的推荐语言

multithreading - 64位机器,int64和int16的性能

python - 了解 python 中的 Queue 模块(如何运行它)

java - Java中的happens-before机制

assembly - 机器如何确定屏幕上显示的内容(具体为 6502)?

tensorflow - TensorFlow 中的显式 CPU 放置

c# - 为什么我的线程似乎占用不到 1MB 的内存?

c - sched_getcpu() 等同于 OS X?

optimization - 多核系统中的节能 cpu 使用

MySQL 查询问题 - 计数查询使用大量 CPU