如果我的解释和问题错了,请纠正我,我正在试着找出如何正确地表达出来。
1)多线程可以=并行性吗?
我读到并行是在同一时间运行,而不是在它们之间切换,但如果你有一个cpu,可以从进程中获取多个进程和线程,并在多个cpu/核心上运行它们,那么多线程也可以是并行吗?
2)从上面跟进,如果我们假设答案是否定的,这是否意味着多线程总是与并发相同?
3)程序只能在支持多线程的情况下才是并发的吗?以PHP为例,我读到它不支持多线程,那么如果PHP执行不能启动其他线程,那么它还能在自己内部支持并发吗?我希望这个问题有意义..。基本上,一个不能支持线程的程序怎么能在自己的执行中运行并发呢?
4)多处理总是被认为是并行的吗?
很抱歉,问题太乱了,我不知道该如何正确表达。
发布于 2019-04-10 17:03:09
并发性可以定义为独立执行的任务的组合和交错。
并行性是独立任务的同时执行。
如果独立的任务同时运行,则并发模型可以是并行的。换句话说,并行性是并发性的一个子集。
当您在厨房做饭时,您正在应用并发模型。即使你可以一次只专注于一项任务,你也要在几项任务中保持交错(打开烤箱,切一些蔬菜,把饭放到热的烤箱里,注意酱汁)。所有这些操作都是相互独立的,但它们的执行顺序很重要(您不能在食物变热之前将其放入烤箱中)。最优的并发策略可以减少做饭所需的时间。
添加第二个人来帮助你是一种并行工作模式。它可能会让事情变得更快,也可能不会。这取决于许多因素,如食谱,可用的工具数量和厨房的大小。这肯定会让事情变得更加困难,因为现在你还需要协调两个人,而以前你只是确保操作的顺序是正确的。
希望并发/并行的定义变得清晰,我们需要诚实地对待自己,并认识到上述模型是指导方针,它们的实现取决于硬件、操作系统和语言平台等多个因素。
线程通常由现代操作系统实现为执行单元,由一个专用堆栈和一组CPU注册表组成。这允许操作系统在它们之间快速切换,而不需要释放整个进程的存储空间。如果有多个OSes核心可用,大多数现代的CPU都可以在parallels中运行线程,但情况并不总是如此。例如,直到2011年,Linux还不允许通过其BKL同时执行属于同一进程的线程。
此外,即使OS支持属于同一进程的线程的并行执行,也不是所有的语言平台都允许这样做。例如,主Python解释器仍然通过其GIL拒绝线程的并行执行。
作为一般的指导原则,线程在大多数情况下可以被认为是并发的。根据平台的不同,它们可能是并行的,也可能不是。
同样的问题也适用于进程。smartphone OSes的第一个版本提供了非常有限的并发支持,几乎没有并行性。IoT device OSes可能仍会受到类似问题的影响。
通常,在提供多个CPU核心的硬件上,多处理在大多数情况下允许并行。
还有其他方法可以实现并发甚至并行,而不需要依赖于特定于操作系统的工具。
例如,Erlang/Elixr可以并行运行多个processes。Erlang进程既不是操作系统进程,也不是线程。它们在自己的实现中抽象出并发性。
Go引入了goroutine作为轻量级执行单元。
Python asyncio模块允许开发人员交错操作,有效地实现代码的并发执行。
https://stackoverflow.com/questions/55599500
复制相似问题