根据C10k和this paper,随着越来越多的客户端连接并创建越来越多的线程,每个连接1个线程的服务器的吞吐量会降低。根据这两个来源,这是因为存在的线程越多,与这些线程完成的实际工作相比,上下文切换花费的时间就越多。在连接数很高的情况下,优化服务器似乎没有因性能降低而受到太大影响。
但是,事件服务器也在客户端之间进行上下文切换,它们只是在用户空间中进行。
我最感兴趣的是Linux内核如何处理上下文切换,但也欢迎有关其他操作系统的信息。
答案 0 :(得分:5)
因为CPU不需要切换到内核模式并返回用户模式。
主要是切换到内核模式。 IIRC,Linux中的内核模式和用户模式的页表相同,所以至少没有TLB失效惩罚。
需要进行测量,因机器而异。我想现在一台典型的桌面/服务器机器每秒可以进行几十万个上下文切换,可能只有几百万。
取决于内核调度程序如何处理这个问题。 AFAIK,在Linux中它非常高效,即使有大量的线程数,但更多的线程意味着更多的内存使用意味着更多的缓存压力,因此可能会降低性能。我还期望在处理数千个套接字时涉及一些开销。