Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 套接字编程中的选择_C_Sockets_Client Server - Fatal编程技术网

C 套接字编程中的选择

C 套接字编程中的选择,c,sockets,client-server,C,Sockets,Client Server,使用select()函数有什么用处吗 根据我(小)的经验,我倾向于相信线程就足够了 所以我想知道,select()是否只是一个针对还不了解线程的人的说教工具 考虑以下示例。您有一个中等繁忙的web服务器,大约有100K个连接。您没有使用select或类似的工具,因此每个连接只有一个线程,这意味着100K个线程很快就会成为问题 即使你调整你的系统,直到它允许这样一个怪物,大多数线程将只是等待一个套接字。如果有一种机制在套接字变得有趣时通知您,不是更好吗 换句话说,线程和类似于选择的机制是互补的。您

使用select()函数有什么用处吗

根据我(小)的经验,我倾向于相信线程就足够了


所以我想知道,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现在我知道我可以同时使用它们,我认为这是最好的解决方案。非常感谢。