内核上下文切换与用户空间上下文切换相比,成本如何?

10
根据C10k这篇论文,随着越来越多的客户端连接并且创建了越来越多的线程,1个线程/连接的服务器的吞吐量会降低。根据这两个来源,这是因为存在越多的线程,就会花费更多时间在上下文切换上,而不是实际工作。事件驱动的服务器似乎在高连接数下不会遭受太多性能退化的影响。
然而,事件驱动的服务器也会在客户端之间进行上下文切换,只是它们在用户空间内完成。
  • 为什么这些用户空间的上下文切换比内核线程上下文切换更快?
  • 内核上下文切换究竟做了什么,使得其成本更高?
  • 内核上下文切换的成本是多少?需要多长时间?
  • 内核上下文切换的时间与线程数量有关吗?
我主要对Linux内核如何处理上下文切换感兴趣,但也欢迎了解其他操作系统的信息。
1个回答

5
  • 为什么这些用户空间上下文切换比内核线程上下文切换快?

因为CPU不需要在内核模式和用户模式之间切换。

  • 内核上下文切换到底做了什么,使其如此昂贵?

主要是切换到内核模式。我记得,在Linux中,内核模式和用户模式的页面表是相同的,所以至少没有TLB失效的惩罚。

  • 内核上下文切换到底有多昂贵?需要多长时间?

需要测量,并且可能因机器而异。我猜现今的典型桌面/服务器机器可以每秒执行数十万次上下文切换,可能是几百万次。

  • 内核上下文切换的时间是否取决于线程数?

这取决于内核调度程序的处理方式。据我所知,在Linux中,即使有大量线程,它也非常高效,但更多的线程意味着更多的内存使用,进而可能导致缓存压力增加,从而降低性能。我还预计涉及处理数千个套接字的一些开销。


切换到内核模式需要多少代价? - Hongli
2
从 Reddit 上作为将来的参考:http://www.reddit.com/r/programming/comments/joy9z/why_events_are_a_bad_idea_for_highconcurrency/c2e9a5a - Hongli
1
另一篇不错的 Reddit 帖子:http://www.reddit.com/r/programming/comments/l1hnb/straight_talk_on_event_loops/c2p0sig - Hongli
关于上下文切换,为什么“用户模式”和“内核模式”上下文切换会有差异?据我所知,任何上下文切换都会将控制权转移到内核。实际上,运行在内核模式下的调度程序选择要驱逐的进程,然后开始替换页表并使TLB和缓存失效。那么,“用户模式”上下文切换到底是什么,它为什么更快? - AjB
用户模式的上下文切换不涉及内核,正如其名称所示。Windows拥有纤程(fibers),Unix(至今)仍然使用makecontext/swapcontext。 - Ringding
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接