Php 并发性、多处理、并行性、多线程之间的关系混乱

Php 并发性、多处理、并行性、多线程之间的关系混乱,php,multithreading,concurrency,parallel-processing,multiprocessing,Php,Multithreading,Concurrency,Parallel Processing,Multiprocessing,请纠正我,如果我的解释和我的问题是错误的,我正在试图找出如何正确地表达它 1) 多线程=并行吗 我读到并行性是同时运行的,而不是在它们之间切换,但如果您有一个cpu,可以从进程中获取多个进程和线程,并在多个cpu/内核上运行它们,那么多线程也可以是并行性吗 2) 从上面继续,如果我们假设答案是否定的,这是否意味着多线程始终与并发相同 3) 程序只有在支持多线程的情况下才能并发吗?让我们以PHP为例,我读到它不支持多线程,因此,如果不能启动其他线程,PHP执行本身还能支持并发吗?我希望这个问题有意

请纠正我,如果我的解释和我的问题是错误的,我正在试图找出如何正确地表达它

1) 多线程=并行吗

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

2) 从上面继续,如果我们假设答案是否定的,这是否意味着多线程始终与并发相同

3) 程序只有在支持多线程的情况下才能并发吗?让我们以PHP为例,我读到它不支持多线程,因此,如果不能启动其他线程,PHP执行本身还能支持并发吗?我希望这个问题有意义。。。基本上,一个不支持线程的程序如何在自己的执行过程中运行并发性呢

4) 多处理总是被认为是并行的吗


对不起,问题太多了,我不知道如何正确表达

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

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

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

当你在厨房做饭时,你正在应用一个并发模型。即使你一次只专注于一项任务,你也会在几项任务之间穿插(打开烤箱,切一些蔬菜,一旦热了就把饭放进烤箱,小心酱汁)。所有这些操作都是相互独立的,但它们的执行顺序很重要(不能在饭菜变热之前将其放入烤箱)。一个最佳的并发策略可以使烹饪所需的时间有所不同

添加第二个人来帮助您是一种并行工作模式。它可能会让事情变得更快,也可能不会。这取决于许多因素,如食谱、可用工具的数量和厨房的大小。这当然会让事情变得更难,因为现在你还需要协调两个人,而之前你只是确保操作顺序是正确的

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

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

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

一般来说,在大多数情况下线程都可以被认为是并发的。根据平台的不同,它们可能平行或不平行

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

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

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

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

Go引入了轻量级执行单元


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

让我更迷惑您,“并发”意味着您的程序同时有多个独立的活动在进行中。线程是作为实现并发的一种手段而发明的,但线程并不是并发的唯一模型。(例如,阅读相关文章。)“并行性”指同时处理同一问题的多个硬件资源(多于通常从单个CPU获得的资源)。如果硬件有多个CPU来运行线程,则多线程可以是实现并行性的一种方法。我不是100%确定,但如果你有一台N处理器的机器,每个处理器运行不同的单线程程序,有些人可能会称之为“多处理”,但我不认为有人会称之为“并行计算”。此外,还有专门的系统(例如,和)使用不同于多线程的其他计算模型实现并行。(例如,分别为和。)