线程和进程在运行性能上是不是一样?

2015-05-06 10:43:49 +08:00
 yakczh

除了内存占用不说, 比如同一个任务,一个用多线程方式,一个用多进程方式处理,最后运行时间有差别吗?

5215 次点击
所在节点    程序员
31 条回复
moonpie
2015-05-06 10:46:00 +08:00
非程序员路过
zerh925
2015-05-06 10:49:09 +08:00
ehhh, it depends.
信息不足,如果能给出具体案例更方便讨论。
ipconfiger
2015-05-06 10:50:03 +08:00
posix 的调度单位是线程,进程只是容器而已,所以在调度上不存在效率上的差别,只是5个线程在1个进程里和5个线程在5个进程里消耗的内存要多一些
Andiry
2015-05-06 10:54:19 +08:00
进程间切换比线程切换开销大
cfan8
2015-05-06 10:54:37 +08:00
如果考虑到线程/进程通信的话,必然线程快

如果考虑到Robustness的话,线程一个挂了就炸了,进程的话比较好恢复,总时间可能更少
zhipeng
2015-05-06 11:00:57 +08:00
Windows里的进程线程模型是,进程是线程的容器,程序执行都是以线程为单位的。
Linux中只有进程,线程只是没有独立虚拟内存空间的进程。
从运行时间上来看我感觉不会有太大差别。但考虑到创建进程的代价大于创建进程,并且线程间通信比进程容易(同一个进程中的线程有公共的地址空间,公共的地址空间也可以使得CPU的cache能更好发挥作用),如果这类操作十分多,最终可能导致多线程处理快一点。
yakczh
2015-05-06 11:02:10 +08:00
@cfan8  不涉及通信,就是任务处理和切换调度
wy315700
2015-05-06 11:04:31 +08:00
补充一句。

Python还是不要用多线程了。
endrollex
2015-05-06 11:06:11 +08:00
不算管理开销,运行时间没差别
neoblackcap
2015-05-06 11:10:18 +08:00
同@zhipeng 所说的一样,linux下面的进程跟线程差别很少,他们底层实现的代码有90%是相同的,创建成本差异几乎忽略.不过这个放在windows就很不一样了,windows的进程很重量级,需要消耗比线程更多的资源才行
zzxworld
2015-05-06 11:27:52 +08:00
要了解他们之间是否存在性能上的差别,那首先需要对这两个名称有个大概的概念。就拿工厂和工人来比喻好了。工厂是进程,工人是线程。那么把楼主的问题转换过来,就是有这样两队人,要进行生产大比武:

豪豪队,有 5 个工厂,每个工厂配 1 个工人
穷穷队,有 1 个工厂,工厂配 5 个工人

貌似不相上下,反正单位时间类的工作处理量都是 5。这时候就是看作务的时候了。

如果咱们再加上一些任务条件:

比如:每队做 5 个盒子。这个应该两队不相上下。

又比如:两队的工厂都一样大,面积 5 平方,然后每队都要做 1000 个纸盒子。这时候,穷穷队从哪方面都不占优呀。

不知道有没有解决题主的疑惑,就这样吧。话说,用 python 的我一看到进程就会有种莫明的忧伤。
aphay
2015-05-06 15:03:53 +08:00
那人们还发明线程干嘛?
ipconfiger
2015-05-06 15:17:08 +08:00
线程是操作系统的调度单位,进程是资源的持有单位,不要混为一谈好不好,不懂的去看posix 标准先
wind3110991
2015-05-06 15:58:47 +08:00
@aphay 也不能这样说,我的理解是:linux的内核态就是用守护进程(内核线程)去周期性维护页面置换,高速缓存,网络连接等操作的,而一般的进程要通过系统调用去创建,用进程切换去维护这些东西显然开销太大了
tabris17
2015-05-06 16:03:10 +08:00
线程和进程的最主要区别是前者共享同一进程的内存,后者不同进程内存隔离
kaizixyz
2015-05-06 16:11:19 +08:00
进程切换开销大~
线程切换开销小~

所以线程给用户带来最直观的体验就是响应速度快~

延引@zzxworld的例子

假定:
你是老板~
你准备生产产品A~
产品A需要a1,a2,a3。。。an等零件组成~

plan1:开n个工厂~只招1种技工~
plan2:开1个工厂~招n个不同的技能的工人~

哪个划算~
yakczh
2015-05-06 16:50:10 +08:00
@kaizixyz 问的不是划算,是两个plan里面的工人干起活来速度有没有区别
cpp255
2015-05-06 17:45:54 +08:00
进程间的通信比线程要麻烦。
tabris17
2015-05-06 17:52:48 +08:00
进程切换开销大~
线程切换开销小~

================

没这种说法
raincious
2015-05-06 17:58:11 +08:00
@tabris17

嗯。这个跟操作系统(进程如何Fork)有关,还和具体需要做的事情有关(比如加个锁)。

还有就是 @cpp255 进程间通讯,是用共享的内存区还是其他方案。
http://en.wikipedia.org/wiki/Inter-process_communication

另外,除了性能,多进程的程序不太需要担心一个子进程挂了(程序员需要担心),而多线程的一个挂了基本上整个进程就危险了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX