如果我的解释和问题有误,请纠正我,我试图弄清楚如何正确表达所有措辞。
1)多线程=并行性可以吗?
我读到并行性是同时运行事物,而不是在它们之间进行切换,但是如果您有一个cpu可以从多个进程中获取多个进程和线程,并在多个cpus / core上运行它们,那么多线程也可以并行性?
2)从上面继续,如果我们认为答案是否定的,那是否意味着多线程始终与并发相同?
3)如果程序支持多线程,那么程序只能是并发的吗?让我们以PHP为例,我读到它不支持多线程,因此,如果PHP执行无法启动其他程序,它本身仍可以支持并发性。线程?我希望这个问题有道理...基本上,不支持线程的程序如何在自己的执行中运行并发?
4)是否始终将多处理视为并行性?
很抱歉出现一堆问题,不确定如何正确表达它们。
答案 0 :(得分:0)
并发可以定义为独立执行任务的组成和交织。
并行是同时执行独立任务。
如果同时运行独立任务,则并行模型可以是并行的。换句话说,并行是并发的一个子集。
在厨房做饭时,您正在应用并行模型。即使您一次只能专注于一项任务,您仍会在多个任务之间保持交错(打开烤箱,切一些蔬菜,趁热将餐点放进烤箱,照顾酱汁)。所有这些操作都是相互独立的,但是它们的执行顺序很重要(您不能在餐点变热之前将其放入烤箱)。最佳的并发策略可以使烹饪食物所需的时间有所不同。
添加第二个人来帮助您是一个并行的工作模型。它可能使事情变得更快,也可能没有。它取决于许多因素,例如配方,可用工具的数量以及厨房的大小。当然,这使事情变得更加困难,因为在确保操作顺序正确之前,您还需要协调两个人。
希望对并发/并行性的定义要明确一点,我们需要对自己诚实,并意识到上述模型是指导原则,其实现取决于硬件,操作系统和语言平台等多个因素。
线程通常由现代操作系统实现为由专用堆栈和一组CPU注册表组成的执行单元。这使OS可以在它们之间快速切换,而无需释放整个过程存储空间。如果有多个CPU内核可用,大多数现代OS可以并行运行线程,但并非总是如此。例如,直到2011年,Linux才不允许通过其BKL同时执行属于同一进程的线程。
此外,即使操作系统支持并行执行属于同一进程的线程,也并非所有语言平台都允许这样做。例如,主要的Python解释器仍通过其GIL拒绝线程的并行执行。
作为一般准则,在大多数情况下,线程可以被认为是并发的。它们可能是平行的,也可能不是平行的。
同一问题适用于流程。智能手机操作系统的第一个版本提供了非常有限的并发支持,并且几乎没有并行性。 IoT设备操作系统可能仍会受到类似问题的影响。
通常在提供多个CPU内核的硬件上,多处理在大多数情况下允许并行化。
还有其他方法可以实现并发甚至并行性,而无需依赖于操作系统特定的功能。
例如,Erlang / Elixr可以并行运行多个processes。 Erlang进程既不是OS进程也不是线程。他们在自己的实现中抽象并发。
Go引入了goroutine作为执行的轻量级单位。
Python asyncio模块允许开发人员有效地交错操作以启用并发执行代码。