C 套接字编程中的选择
使用select()函数有什么用处吗 根据我(小)的经验,我倾向于相信线程就足够了C 套接字编程中的选择,c,sockets,client-server,C,Sockets,Client Server,使用select()函数有什么用处吗 根据我(小)的经验,我倾向于相信线程就足够了 所以我想知道,select()是否只是一个针对还不了解线程的人的说教工具 考虑以下示例。您有一个中等繁忙的web服务器,大约有100K个连接。您没有使用select或类似的工具,因此每个连接只有一个线程,这意味着100K个线程很快就会成为问题 即使你调整你的系统,直到它允许这样一个怪物,大多数线程将只是等待一个套接字。如果有一种机制在套接字变得有趣时通知您,不是更好吗 换句话说,线程和类似于选择的机制是互补的。您
所以我想知道,select()是否只是一个针对还不了解线程的人的说教工具 考虑以下示例。您有一个中等繁忙的web服务器,大约有100K个连接。您没有使用
select
或类似的工具,因此每个连接只有一个线程,这意味着100K个线程很快就会成为问题
即使你调整你的系统,直到它允许这样一个怪物,大多数线程将只是等待一个套接字。如果有一种机制在套接字变得有趣时通知您,不是更好吗
换句话说,线程和类似于
选择的机制是互补的。您不能使用线程
来代替选择
所做的简单事情:监视文件描述符。考虑以下示例。您有一个中等繁忙的web服务器,大约有100K个连接。您没有使用select
或类似的工具,因此每个连接只有一个线程,这意味着100K个线程很快就会成为问题
即使你调整你的系统,直到它允许这样一个怪物,大多数线程将只是等待一个套接字。如果有一种机制在套接字变得有趣时通知您,不是更好吗
换句话说,线程和类似于选择的机制是互补的。您不能使用线程
来代替选择
所做的简单事情:监视文件描述符。单线程轮询的使用、实现和(最重要的)理解都要简单得多。并发编程为您的项目增加了巨大的智力成本:同步数据非常棘手且容易出错,锁定会带来许多错误,无锁数据结构会导致性能下降,程序流在思想上变得难以可视化(或者“序列化”)
相比之下,单线程轮询(可能使用epoll
/kqueue
,而不是select
)通常可以提供非常好的性能(当然,这取决于您响应数据的具体操作),同时保持简单
特别是在Linux中,您可以将timerfd、eventfd、signalfds和inotify fds以及嵌套的epoll fds放在轮询集中,这为您提供了处理各种“异步”事件的非常统一的方法。如果最终需要更高的性能,可以通过同时运行多个轮询器来实现单点并行,并且大部分数据同步由内核完成,这保证只有一个线程在准备就绪时接收到成功的轮询。单线程轮询的使用要简单得多,实施和(最重要的)理解。并发编程为您的项目增加了巨大的智力成本:同步数据非常棘手且容易出错,锁定会带来许多错误,无锁数据结构会导致性能下降,程序流在思想上变得难以可视化(或者“序列化”)
相比之下,单线程轮询(可能使用epoll
/kqueue
,而不是select
)通常可以提供非常好的性能(当然,这取决于您响应数据的具体操作),同时保持简单
特别是在Linux中,您可以将timerfd、eventfd、signalfds和inotify fds以及嵌套的epoll fds放在轮询集中,这为您提供了处理各种“异步”事件的非常统一的方法。如果最终需要更高的性能,可以通过并发运行多个轮询器来实现单点并行,并且大部分数据同步都是由内核完成的,这保证只有一个线程在准备就绪时接收到成功的轮询。Ok。我明白你的意思。您能否提供使用线程和选择客户机-服务器体系结构的最佳实践?@coredump这取决于您真正在做什么。这是一个文件传输项目。服务器承载有关客户端的数据。实际传输是客户端之间的点对点传输。服务器仅保存主机的哪些文件和其他数据。客户端可以接受多个连接,并且我想传输文件的一部分,然后转到另一个连接,传输文件的一部分等等。@ CordEMP考虑使用的描述符的数量,时间线程将等待阻塞。甚至可以使用混合方案,当select
循环将任务推送到线程池中时。@cnicutarys现在我知道我可以同时使用它们,我认为这是最好的解决方案。谢谢,好的。我明白你的意思。您能否提供使用线程和选择客户机-服务器体系结构的最佳实践?@coredump这取决于您真正在做什么。这是一个文件传输项目。服务器承载有关客户端的数据。实际传输是客户端之间的点对点传输。服务器仅保存主机的哪些文件和其他数据。客户端可以接受多个连接,并且我想传输文件的一部分,然后转到另一个连接,传输文件的一部分等等。@ CordEMP考虑使用的描述符的数量,时间线程将等待阻塞。甚至可以使用混合方案,当select
循环将任务推送到线程池中时。@cnicutarys现在我知道我可以同时使用它们,我认为这是最好的解决方案。非常感谢。