常州在线制作网站,手机网站 微信支付,关于手机的网站有哪些内容,电商平台运营。新到来一个 TCP 连接#xff0c;就需要分配一个进程或者线程#xff0c;那么如果要达到 C10K#xff0c;意味着要一台机器维护 1 万个连接#xff0c;相当于要维护 1 万个进程/线程#xff0c;操作系统就算死扛也是扛不住的。 一个进程虽然任一时刻只能处理一个请求就需要分配一个进程或者线程那么如果要达到 C10K意味着要一台机器维护 1 万个连接相当于要维护 1 万个进程/线程操作系统就算死扛也是扛不住的。 一个进程虽然任一时刻只能处理一个请求但是处理每个请求的事件时耗时控制在 1 毫秒以内这样 1 秒内就可以处理上千个请求把时间拉长来看多个请求复用了一个进程这就是多路复用这种思想很类似一个 CPU 并发多个进程所以也叫做时分多路复用。
我们熟悉的 select/poll/epoll 内核提供给用户态的多路复用系统调用进程可以通过一个系统调用函数从内核中获取多个事件。
select/poll/epoll 是如何获取网络事件的呢在获取事件时先把所有连接文件描述符传给内核再由内核返回产生了事件的连接然后在用户态中再处理这些连接对应的请求即可。 poll 和 select 并没有太大的本质区别都是使用「线性结构」存储进程关注的 Socket 集合因此都需要遍历文件描述符集合来找到可读或可写的 Socket时间复杂度为 O(n)而且也需要在用户态与内核态之间拷贝文件描述符集合这种方式随着并发数上来性能的损耗会呈指数级增长 epoll 是解决 C10K 问题的利器通过两个方面解决了 select/poll 的问题。
epoll 在内核里使用「红黑树」来关注进程所有待检测的 Socket红黑树是个高效的数据结构增删改一般时间复杂度是 O(logn)通过对这棵黑红树的管理不需要像 select/poll 在每次操作时都传入整个 Socket 集合减少了内核和用户空间大量的数据拷贝和内存分配。epoll 使用事件驱动的机制内核里维护了一个「链表」来记录就绪事件只将有事件发生的 Socket 集合传递给应用程序不需要像 select/poll 那样轮询扫描整个集合包含有和无事件的 Socket 大大提高了检测的效率。
而且epoll 支持边缘触发和水平触发的方式而 select/poll 只支持水平触发一般而言边缘触发的方式会比水平触发的效率高。