我正在尝试学习如何将epoll()用于tcp服务器应用程序,因为我期待很多连接。 我试过检查样本和教程,他们总是建议使用/设置epoll()中添加的套接字作为NON-BLOCKING套接字。为什么呢?
答案 0 :(得分:2)
使用传统的阻塞I / O,每个连接必须由一个或多个专用线程处理。随着连接数量的增加,所需线程的数量也会增加。这个模型在连接数量达到数百或数千的情况下工作得相当好,但它并没有很好地扩展。
多路复用和非阻塞I / O反转模型,允许一个线程为许多不同的连接提供服务。它通过同时监视所有活动连接并仅在套接字准备就绪时执行I / O来实现(例如,数据已到达,这意味着至少可以执行一次读取而不会阻塞)。
这是一个更具可扩展性的解决方案,因为现在你不会有成群的大多数非活动线程坐在他们的拇指周围。相反,你有一个或几个非常活跃的线程在所有套接字之间穿梭。
答案 1 :(得分:0)
对于级别触发的epoll,无阻塞套接字可以帮助最小化epoll_wait()调用,这是一个优化问题。
对于边缘触发的epoll,必须使用非阻塞套接字并调用read()或write(),直到它们返回EWOULDBLOCK。否则,您可能会错过内核通知。
您可以在此处找到详细的答案:https://eklitzke.org/blocking-io-nonblocking-io-and-epoll