并发,多处理,并行,多线程之间的混淆如何相互关联

问题描述 投票:2回答:1

如果我的解释和问题出错了,请纠正我,我正在努力弄清楚如何正确地说出这一切。

1)多线程可以并行吗?

我读到并行性是同时运行的,而不是在它们之间切换,但如果你有一个可以从进程中获取多个进程和线程的cpu,并在多个cpus / cores上运行它们,那么多线程也可以是并行性的吗?

2)从上面跟进,如果我们假设答案是否定的,这是否意味着多线程总是和并发相同?

3)程序只有在支持多线程的情况下才能并发吗?让我们拿PHP,我读它不支持多线程,那么如果PHP执行无法启动其他线程,那么PHP执行是否还能支持并发?我希望这个问题有意义......基本上,一个不能支持线程的程序如何在自己的执行中运行并发?

4)多处理总是被视为并行吗?

抱歉一堆乱七八糟的问题,不确定如何正确地说出来。

php multithreading concurrency parallel-processing multiprocessing
1个回答
0
投票

并发可以定义为独立执行任务的组合和交错。

并行性是独立任务的同时执行。

如果独立任务同时运行,并发模型可以是并行的。换句话说,并行性是并发的一个子集。

当您在厨房做饭时,您正在使用并行模型。即使你可以一次专注于一项任务,你仍然可以在几个任务之间交错(打开烤箱,切一些蔬菜,将食物放入烤箱中一次趁热,照顾酱汁)。所有这些操作都是相互独立的,但它们的执行顺序很重要(你不能把食物放在烤箱里变热之前)。最佳的并发策略可以改变烹饪餐点所需的时间。

添加第二个人来帮助您是一个并行工作模型。它可能使事情更快或可能不会。这取决于许多因素,如配方,可用工具的数量和厨房的大小。这肯定会让事情变得更难,因为现在你需要在确定操作顺序正确之前协调两个人。

希望并发/并行的定义是明确的,我们需要对自己诚实并认识到上述模型是指导原则,它们的实现取决于硬件,操作系统和语言平台等几个因素。

线程通常由现代操作系统实现,作为执行单元,由专用堆栈和一组CPU注册表组成。这允许OS在它们之间快速切换而无需释放整个进程存储空间。如果有多个CPU内核可用,大多数现代操作系统都可以并行运行线程,但情况并非总是如此。例如,直到2011年,Linux不允许通过其BKL同时执行属于同一进程的线程。

此外,即使操作系统支持并行执行属于同一进程的线程,并非所有语言平台都允许这样做。例如,主要的Python解释器仍然拒绝通过其GIL并行执行线程。

作为一般准则,在大多数情况下,线程可以被视为并发。根据平台,它们可能是并行的。

同样的问题适用于流程。智能手机操作系统的第一个版本提供了非常有限的并发支持,几乎没有并行性。物联网设备操作系统可能仍会受到类似问题的影响。

通常在提供多个CPU内核的硬件上,多处理允许在大多数情况下进行并行处理。

还有其他方法可以实现并发甚至并行性,而无需依赖特定于操作系统的工具。

例如,Erlang / Elixr可以并行运行多个processes。 Erlang进程既不是OS进程也不是线程。它们在自己的实现中抽象并发。

Go介绍了goroutine作为轻量级执行单元。

Python asyncio模块允许开发人员有效地交错操作,从而实现代码的并发执行。

© www.soinside.com 2019 - 2024. All rights reserved.