【问题标题】:multithreading and multitasking on single core processor vs multicore processor单核处理器与多核处理器上的多线程和多任务处理
【发布时间】:2015-12-29 12:41:57
【问题描述】:

定义:
进程(任务):是一个正在执行的程序。例如:记事本
线程:线程是单个指令序列。一个进程由一个或多个线程组成(但一次只能执行一个)。

根据讲座,单核处理器一次只能运行一个进程(任务)。一次只能执行一个线程,但操作系统使用time slicing(线程上下文切换)实现多线程。这种线程切换发生得足够频繁,以至于用户认为线程同时运行(但它们不是并行运行!)并且它发生在一个进程内。
进程上下文切换类似于线程上下文切换它发生在进程之间(例如媒体播放器和记事本之间)而不是线程之间的差异。

我不确定此示例是否有效:采用两个进程,例如:单核处理器上的记事本和 Mediaplayer。尽管两个进程没有并行运行(进程上下文切换或多任务处理),但可以同时播放音乐和在记事本中写作。在一个进程中,例如:Mediaplayer 可以同时听音乐和创建播放列表,尽管两个线程没有并行运行(线程上下文切换或多线程)



第一个问题:我上面的信息是否正确?

第二个问题:多核进程中的线程执行在一个内核中看起来是否相同,但不同之处在于不同进程的线程可以并行运行?。多线程在这里的过程在不同的进程上同时运行多个线程或在一个内核上的线程之间切换的进程?同样的问题也适用于多任务处理。 在这种情况下,进程上下文切换和线程上下文切换将如何发生?

第三个​​问题:教授使用术语单线程处理器。这个词是单核处理器的别称吗?


属于同一进程的多个线程可以同时在多个 CPU 内核上执行。时间切片仍然发生在多核系统上。假设一个进程有 20 个线程在四核上运行 - 操作系统仍然必须安排 21 个线程才能仅在 4 个核心上运行。

单线程进程一次只能在一个内核上运行。但这并不意味着它会在同一个核心上运行,直到它退出。操作系统可能会给他一个时间片,让他现在在 Core 1 上运行,暂停它,稍后再给它在 Core 2 上的时间片

注意:我读了很多书,在我决定在这里问之前我已经用谷歌搜索了很多。

已编辑

【问题讨论】:

  • java标签放错了!

标签: multithreading operating-system multiprocessing multitasking


【解决方案1】:

是的,您似乎对这个主题有很好的理解(但不确定它是否真的很有趣)。但是,您似乎想多了。我建议一种更简单的方式来理解它在现代系统上的工作方式(当你开始回顾时,它真的是狂野的西部,有轻量级进程等的想法,但我不会谈论它)。

进程是一个shell。生活中唯一的目的就是为线程提供环境。只有线程真正被执行,进程本身永远不会被执行。单个进程可以在其中托管多个线程,并且当它仅托管一个线程时,可以说进程已执行-但这只是一种说法。 CPU 只能执行线程,不能执行进程。

你的教授,就像他们经常做的那样,会做出误导性的陈述。没有单线程处理器这样的东西。有单核和多核处理器,这些处理器可以连接在一起以提供多处理器环境。从应用程序开发人员的角度来看,具有 4 个内核的单个 CPU 与 4 个单核 CPU 没有区别。当然存在差异 - 但通常不适用于应用程序开发人员。

多任务处理是一个外行术语。它可以表示任何人想要的意思,最好在非特定上下文中避免。

我希望我确实澄清了你的困惑。

【讨论】:

  • 我认为@alixander 试图了解多处理/多线程是如何“在幕后”工作的,因为他在大学里了解它,所以只接受它作为一种简单有效的抽象是不可行的的问题。请注意,我可能错了,
  • 我很想澄清更多:),我正在等待问题。
  • @SergeyA : 进程 α 的线程(a,b,c,d) 可以在多核进程的多个核心上并行执行吗?
  • @alixander,你说的多核进程是什么意思?
  • @alixander Again Process.... 我认为您的问题如下:属于同一进程的多个线程可以同时在多个 CPU 内核上执行吗?一般的答案是肯定的,他们可以。这通常是期望的结果,也是编写多线程应用程序的全部原因。但是,有一些技术可以防止这种情况发生。
【解决方案2】:

您的问题的答案如下:


Q1:在单核处理器上,两个任务不能以同时执行两条(处理器)指令的形式并行运行,多线程唯一可能的方式是实现时间分片由(操作系统的)任务调度程序,所以在这种情况下,您大约是正确的。我会用一个事实来完成你对这个主题的看法,现在几乎没有一个应用程序是单线程的。我不知道记事本是否使用多个线程,但我很确定,媒体播放器是多线程的,并且任务调度程序在线程而不是进程之间安排时间片。 (有趣的事实:一个单线程 .NET 应用程序已经运行了 4-5 个线程。)

Q2:任何系统上的任务调度程序都会尝试在可用内核之间分配负载,因此时间片很可能会按照您上面显示的方式工作,但如果进程执行额外的线程,它将是在负载最少的核心上执行。多核还意味着,多个(处理器)指令可以并且将同时执行。

Q3:实际上多线程处理器和多核处理器的含义非常相似,但又不一样。例如,您看到 Intel Core i3/i5/i7 CPU 配备了一个内部伪任务调度程序,它通过在同一个内核上调度两个线程的执行来使虚拟内核的数量增加一倍,例如我的 i5 系统是 2核心但 4 线程。

【讨论】:

  • 不同意“几乎没有一个应用程序是单线程的”。有一种非常流行的观点认为,出于各种原因,后端进程最好是单线程的。
  • @SergeyA 好吧,我从事驱动程序开发,现在我正在研究基于 Windows 服务的后端解决方案,我从未见过任何复杂的单线程后端软件。 (请注意,我只在 Windows 架构上工作,它更像是一个多线程而不是多进程操作系统。)你能澄清一下你在说什么学校吗?
  • 不提供太多我的背景,我讨厌这样做,我不能。您可以相信我,过去 3 年我一直在处理非常复杂、性能要求严格的单线程应用程序。
  • “非常”受欢迎当然是主观的。您可以将其替换为“在有限的圈子中流行”
  • @SergeyA 我很想看到一些链接到这背后的原因。除非它们意味着单线程但使用多个进程,否则有两个灌篮理由说明这是一个糟糕的主意。 1) 它使所有代码的性能变得至关重要,即使是几乎从不执行的代码(例如异常错误处理)。 2)如果任何代码以无法避免的方式阻塞,例如由于意外的页面错误,它会导致服务完全丢失。 (如果这么晦涩,连个网页都没有解释,圈子确实有限!)
【解决方案3】:

您的大部分概念似乎都适用于非标准术语。 这是对线程和进程以及多线程的解释

进程正在运行的程序实例是true

当没有线程时,资源只会在进程之间分配。

现在进程具有线程,因此资源被分配给线程,但进程的隔离是相同的,这意味着两个进程仍然需要 IPC 才能相互通信。您可以将多线程称为可由操作系统调度的轻量级进程。 multit-hreadingmulti-tasking的扩展,所以如果有一个核心和两个进程:一个有两个线程,一个有4个线程,访问核心的竞争是在6个线程而不是2个进程之间。 对于thread switchprocess switch,请参阅thread context switch vs process context switch

【讨论】:

  • 从哪句话你觉得我说的是进程可以没有线程
  • 从这个:“当没有线程时,资源只在进程之间分配。”。
  • 哦,我将“is”替换为“was”。真的鹰眼,谢谢
  • 另一个反对票 :( 只是因为现在有一个反对票,这种趋势将占上风 :)