我在网上搜索了一下,找到的答案都是不确定的。也就是说,人们认为这是会发生的情况,但并不确定。
假设采取了适当的预防措施来同步和防止冲突,来自同一进程的线程是否可以在多核系统上同时运行?
我之所以问这个问题,是因为我正在设计一种语言来实现自动线程化。也就是说,让计算机决定何时何地进行线程化。但是,如果一个进程中的所有线程只能按时间分片,而不能同时运行,那么自动线程化就不会提高速度。
答案1
是的,可以。在我所知道的大多数操作系统中,当然在 Windows 和 Linux 下,没有任何规定说一个进程的线程一次只能运行一个。事实上,Windows 调度程序在做出决定时很少关注“线程来自哪个进程?”。在具有n核心,n线程可以同时运行。无论它们来自同一个进程,还是来自四个不同的进程,或者是任意组合。
对于 Windows,您可以使用“cpustres”应用程序轻松演示这一点。您可以在“Windows Internals 书籍工具”中找到它,这是 Mark Russinovich 在 sysinternals 工具站点上分发的一个软件包。让您的系统尽可能安静,然后使用 cpustres 创建两个线程并将其“活动级别”设置为最大。然后在任务管理器中检查您的 CPU 时间图表。或者使用 Process Explorer 查看两个线程的 CPU 时间。
这Windows 内部原理本书包含有关调度程序(不是“任务调度程序”,而是线程调度程序)如何工作的完整信息。这本书很长,但值得一读。该书的最新版本涵盖了 Windows 7,但自那时以来,该领域没有任何重大变化。
答案2
是的,多个 CPU 或 CPU 核心的全部意义在于它们都可以同时做不同的事情;否则,如果所有其他核心都必须等待第一个核心完成其切片,为什么还要有人制作多核系统呢?
这也是为什么诸如自旋锁、互斥锁、屏障等同步原语存在并且首先是必要的,这已通过在实际软件(内核和常规多线程程序)中发现的数百个错误得到证明,这些错误是由于多个线程在忘记“锁定”相同的数据结构后同时访问它们而引起的。
答案3
我也在寻找这个答案,特别是针对英特尔处理器。就英特尔而言,超线程技术概述非常清楚地说明了这一点:
英特尔® 超线程技术(英特尔® HT 技术)可更高效地利用处理器资源,使每个内核能够运行多个线程
是的!单个进程中的线程将分布在多个核心上并并行运行。