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

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

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

5215 次点击
所在节点    程序员
31 条回复
raincious
2015-05-06 18:00:50 +08:00
@raincious

补充下
> 进程切换开销大~
> 线程切换开销小~

这个需要看操作系统的进程调度,这样归类是不太准确的。

(这可能是在说比如Windows?)
tabris17
2015-05-06 18:39:14 +08:00
@raincious Windows我可以很确信,没有这种说法。windows下CPU最小任务是就是线程(纤程不算),每个线程一个TEB结构,一个线程切换到同进程的另一个线程和一个线程切换到不同进程的另一个线程的开销是一样的(不考虑上下文切换的CPU缓存)
riaqn
2015-05-06 19:10:03 +08:00
@zhipeng 你说的是CPU里的内存cache么..至少x86的cpu都是以物理地址为索引来cache的, 所以和地址空间是不是同一个关系不大.
但是TLB确实会受这个影响, 同一个地址空间, 意味着线程之间切换不需要刷TLB, 所以理论上会快些.
zhipeng
2015-05-06 19:35:59 +08:00
@riaqn 不同进程的地址空间对应的物理地址不同吧,所以cache效果会比多线程弱一些
yakczh
2015-05-06 19:50:06 +08:00
riaqn
2015-05-06 22:35:10 +08:00
@zhipeng 如果是同一个程序, 则所有.text 以及.rodata之类的段都会映射到同一个物理内存.
semicircle21
2015-05-06 23:47:58 +08:00
@riaqn
@tabris17
1. 线程切换不需要切 TLB, 至少 Linux 是这样, 如果 Windows 不是这样, 那就太颠覆了...
2. 对进程而言, 不同进程的数据段(.data)肯定不在一起, 增加各种 cache invalid 的概率, 甚至到虚拟内存. 线程的数据段肯定是尽量拼在一起的, 会减少这些发生的几率.
3. 两者相同的开销也有很多, 比如都要陷入内核, 保存寄存器状态等. 所以究竟上述开销能不能"忽略不计", 我觉得需要量化评价了, 不同处理器架构肯定不同. 而且, 要面向具体问题, 比如说 内存, CPU Cache 超大, 原超应用所需内存的场景, 在这种极端情况下, TLB 什么的也根本不重要了.

主观上, 我觉得这个两种的区别一般是不能忽略不计的.
xieyudi1990
2015-05-07 06:31:26 +08:00
@riaqn "至少x86的cpu都是以物理地址为索引来cache的"
你有资料说明这点吗? 据我了解 cache 多是 VIPT 的, 至少我印象中 x86 的 Opteron 是 VIPT的 (虽然低12位不参与 TLB 转换, 但如果不是 PIPT 的, 也不能这么说吧)
riaqn
2015-05-07 07:34:27 +08:00
@xieyudi1990 不好意思, 我又查了一下, intel确实基本上是VIPT的.
@semicircle21 至于线程和进程切换的cost比较, 一般都认为前者较小. 主要问题是小多少, 这一个问题我觉得没有测试以及特定的应用,是很难得出结论的.
而你说的.data, 考虑到一般是保存全局变量, 而.data本身不会很大, 而且对其的访问也不会很频繁, 所以我觉得不是很大的影响因素.
tabris17
2015-05-07 09:42:08 +08:00
@semicircle21 进程切换唯一可能带来的大开销是由于切换页表可能会导致的重新映射页表,但是如果内存足够大,是可以避免发生这种情况的
semicircle21
2015-05-08 07:08:02 +08:00
@riaqn 我的基础知识也喂狗了, 不是 .data...我的意思是所有运行时数据, 包括 heap, stack 这些...

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

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

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

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

© 2021 V2EX