我有一个问题。我在理论上知道线程和进程之间的差异。但我仍然不明白何时应该使用第一个和后者。例如,我们有一项艰巨的任务需要进行分组。但是以哪种方式?哪个更快,更有效,在什么情况下?我们应该将我们的任务分成几个进程还是几个线程?你能举几个例子吗?我知道我的问题可能看起来很愚蠢,但我是并行计算主题的新手。我希望你理解我的问题。先感谢您。
答案 0 :(得分:1)
通常,进程和线程之间只有一个主要区别:给定进程的所有线程共享相同的虚拟地址空间。而每个进程都有自己的虚拟地址空间。
当处理需要并发访问同一组数据的问题时,使用线程更容易,因为它们都可以直接访问相同的内存。
答案 1 :(得分:1)
线程共享内存。流程没有。
这意味着启动流程的成本会更高一些。这也意味着线程可以通过共享内存方便地进行通信,而进程则不能。
但是,从编码的角度来看,这也意味着线程更难以正确编程。线程很容易以非预期的方式踩到彼此的内存。流程更安全。
欢迎来到并发世界!
答案 2 :(得分:0)
线程和流程之间没有理论上的区别,这些理论差异是可行的。实现线程有许多不同的方法,包括几乎与进程的方式相反的方式(例如Linux线程)。然后是轻量级线程,它涉及自己管理线程的过程;但是那里有更多的变化,因为你可以有合作或半先发制人的线程模型。
例如,我们描述了Haskell的线程模型和Python的。
Haskell提供轻量级线程,几乎不会引入运行时开销;有一些明确定义的点,线程可以在这些点上产生控制权,但这在很大程度上是对用户隐藏的,从而提供了先发制人的多任务处理。共享状态保存在特殊类型的变量中,这些变量由语言专门处理。因此,多线程,甚至并发程序可以以大部分单线程方式编写,然后从主进程分叉。因此,线程和抽象机制,甚至可能在单(OS)线程过程中对程序建模有益;但是,它可以很好地扩展到N线程,其中N可以动态选择。 (并且N个Haskell线程动态映射到OS线程。)
Python允许线程化,但有一个巨大的瓶颈:Global Interpreter锁。因此,要获得严重的性能优势,必须在实践中使用流程。没有可行的,高性能的线程模型可以说。