社区
网络编程
帖子详情
请问accept+多线程跟用select的区别?
becgiggs
2009-06-01 01:01:02
主服务线程accept,每监听到一个新的连接,就为他创建一个子服务线程,在子服务线程里recv()、send该连接有关的数据。
或者只有一个select线程,同时查看多个fd。有连接就recv/send
这两种做法有啥区别啊?
...全文
975
25
打赏
收藏
请问accept+多线程跟用select的区别?
主服务线程accept,每监听到一个新的连接,就为他创建一个子服务线程,在子服务线程里recv()、send该连接有关的数据。 或者只有一个select线程,同时查看多个fd。有连接就recv/send 这两种做法有啥区别啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wz19870212
2009-08-04
打赏
举报
回复
补充两者我在单核.一次查询数据库一万条数据时做的测试..select 需要15秒左右返回 ...多线程在11秒左右返回.测试n次..改进多线程为缓冲队列.4秒返回..
wz19870212
2009-08-04
打赏
举报
回复
select 模型适合处理事务级别的或是数据量不大的..如果数据量大的话效率速度明显不如多线程的
多线程对数据量的大的比较适合...
这样够通俗了把
cadhy
2009-08-04
打赏
举报
回复
mark
hdqqq
2009-06-08
打赏
举报
回复
第一种适合小客户量的情况,第二种用一个线程处理收发, 但是select的socket数量是有限的.理想的情况是 iocp + 线程池.
huliang66
2009-06-08
打赏
举报
回复
学习
tianyou8
2009-06-08
打赏
举报
回复
第一种方式,是一种per-client-per-Thread方式,实现简单,结构清晰,但是客户端多了后,系统开销大,故只适合很小规模的系统\
第二种方式,采用的集合的方式来管理socket,可以同时等待几个连接,效率比较高,并且允许的客户端数量也较多,个人觉得实现起来并不复杂,网上,书上资料较多,也是不错的一种选择
yangangs
2009-06-02
打赏
举报
回复
楼上正解
mfc168
2009-06-02
打赏
举报
回复
如果只有10个连接,二者的效率区别几乎可以忽略
最大的区别是实现方式不同
第一种方式相当于accept后,由专门的线程来处理,思路清晰,容易控制,如果对于10个连接的处理方式相同,建议采用这种处理,只写一个客户工作线程,启动多次而已,如果不同的用户,处理方式不同,不要采用这种方法
第二种方式 是先fd_set,将多个fd同时select 当有消息时,需要判断每个fd, FD_ISSET返回TRUE,然后进行accept,recv等操作,不同的fd处理方式不同,应该采用此方式
recv没有太大区别,只是在服务器send的时候,派发需要较好的控制
个人认为第一种方式思路更清晰更好控制
becgiggs
2009-06-01
打赏
举报
回复
我当然知道一个cpu同时,只能处理一个线程,但我的意思说是,当线程a在处理 i/o这种不浪费cpu资源的操作时,线程b可以利用一下cpu。这样岂不比一个select线程死等recv高。
楼上有人说的“这个时候socket是异步的,不需要等recv完成,这个等待可能是由你的网络层去完成,而不是你的CPU ”,比如,recv的数据到一个数组里,然后,要处理这个数组。recv不完成,我咋知道这个数组里面的数据能不能用?
另外,我一开始就说了,线程比较少,因此,不要老揪着iocp不放,我也知道线程切换浪费时间
newborn2012
2009-06-01
打赏
举报
回复
注意:select也有fd个数的限制的,可不是无限的。
windbger
2009-06-01
打赏
举报
回复
更准确点,是一个processor在一个时刻只能执行一个线程,多核的计算机当时可以同时执行多个线程。
select模型可以一个线程处理多个socket,效果比每个socket对应一个线程要高。
线程太多时,光在这些线程进行切换就耗费很多CPU时间片,所以IOCP效率高,使用线程池的缘故。
Conry
2009-06-01
打赏
举报
回复
[Quote=引用 11 楼 yhlovehx 的回复:]
首先你要明白这个问题。
你的机器 同时能够处理的也就一个线程
你开再多的线程 同一时刻也就一个线程在运行。。。
你对多线程编程的认识有误区
[/Quote]
多核或者多cpu就不是你说的这样了
yhlovehx
2009-06-01
打赏
举报
回复
首先你要明白这个问题。
你的机器 同时能够处理的也就一个线程
你开再多的线程 同一时刻也就一个线程在运行。。。
你对多线程编程的认识有误区
YaYiYaO
2009-06-01
打赏
举报
回复
[Quote=引用 7 楼 becgiggs 的回复:]
不明白为啥select的效率高了?因为select中多个socket的处理在一个线程里,第二个的处理,还要等第一个recv完之后才行。
而为每个连接创建一个线程,这个在recv等待i/o的时候,另一个线程就可以开始自己用cpu了。
当然,我指得是线程数量少的情况下
[/Quote]
这个时候socket是异步的,不需要等recv完成,这个等待可能是由你的网络层去完成,而不是你的CPU
具体可能要去查看select模式的实现了
dch4890164
2009-06-01
打赏
举报
回复
第二种比较强大,除了你说的select还可以处理很多事情,比如你说的i/o问题,有些时候像发送文件,还非这样用不可
具体的可以看一下 unix网络编程关于select的描述,楼主就会明白了
或者反汇编一下飞鸽传书成win32 asm,基本上你就明白为什么不得不用了
wzw200
2009-06-01
打赏
举报
回复
是不是 进程和线程的区别
becgiggs
2009-06-01
打赏
举报
回复
不明白为啥select的效率高了?因为select中多个socket的处理在一个线程里,第二个的处理,还要等第一个recv完之后才行。
而为每个连接创建一个线程,这个在recv等待i/o的时候,另一个线程就可以开始自己用cpu了。
当然,我指得是线程数量少的情况下
YaYiYaO
2009-06-01
打赏
举报
回复
看你客户端的量,如果只有几个或者10几个链接数的话,当然可以用第一种方法,因为这个简单
但是如果有几百甚至几千的链接数的话,你不可能开几千个线程啊,这样不现实也严重影响性能
所以处理大并发量的话,选择用select或者用iocp
becgiggs
2009-06-01
打赏
举报
回复
有人给回答一下吗上面那个问题吗?
becgiggs
2009-06-01
打赏
举报
回复
我需要处理的连接数很少,小于10个。是不是可以理解为,连接数多的时候select效率高。连接数少的时候,为每个连接分别创建一个子服务线程效率高。因为线程的维护也要考虑效率。但其实,recv/send相当于I/O的,所以,能并发尽量并发?只是因为windows线程的限制吗?
加载更多回复(3)
Linux内核(六)并发式TCP
本文探讨了
多线程
服务器如何通过线程而非进程提高资源效率,以及线程与进程的
区别
。深入分析了线程共享全局内存带来的同步问题,并介绍了
accept
与recv函数在并发连接中的作用。同时,对比了多进程、
多线程
、
select
+
多线程
及epoll等方式的优劣。
传输层:套接字Socket
本文深入解析Socket编程原理,涵盖TCP和UDP协议的
区别
,详细讲解基于TCP的Socket编程流程,包括bind、listen、
accept
等关键函数的使用。同时,探讨了多进程、
多线程
和IO多路复用技术在处理大量并发连接时的应用,如
select
和epoll,以应对C10K问题。
Linux下多任务编程(网络编程2)
本文介绍解决
accept
和recv相互阻塞问题的方法,除
多线程
并发外,还可采用epoll I/O多路复用。阐述了I/O多路复用原理,对比了
select
、poll、epoll的
区别
,讲解了epoll工作原理及相关函数,最后还提及了UDP广播和组播。
tcp/ip网络编程 - 笔记
本文探讨了TCP/IP网络编程中的三种服务器实现模型:多进程、多路复用和
多线程
。详细解释了多进程服务器如何在Linux上通过
accept
函数创建子进程提供服务;多路复用服务器,尤其是使用
select
和epoll的方式,如何在单进程中统一管理I/O对象,避免阻塞;
多线程
服务器则讲解了线程如何共享数据区和堆,以及线程的创建和执行流程。同时,文章还对比了
select
、poll和epoll的
区别
和使用场景。
IO 线程图解 & Netty框架
本文详细解析了Java NIO中的
Select
or和多路复用器,包括epoll的边缘触发与水平触发问题。通过对比Java代码,阐述了
select
和epoll在系统调用层面的
区别
,并讨论了
多线程
环境下如何避免水平触发,提出了使用多个
Select
or分散处理请求的策略,以及将
Accept
、Read操作分别由不同线程处理的优化方案。同时,文章提到了Netty的NioEventLoop在解决这些问题上的应用。
网络编程
18,357
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章