linux c++ socket 网络编程(2) select 异步非阻塞

1.3. 多路复用

上面的方法可以完成单个线程处理多个socket读写的。但这样的轮询方式,一定无法应付大量的请求,因为效率太低了,仅处理网络IO就要消耗掉大量的CPU资源,这是十分不可取的。

那所谓的多路复用,就是要解决低效的问题。个人理解复用,就是将多个低速率的流,合成一个高速率的流,来达到提高利用率的目的。放在网络编程模型里的多路复用,就是将多个低速的网络IO流,合成一个高速的网络IO流,然后再由CPU处理。因为CPU的速度实在比网络IO要快太多了。

 

图表 1 select多路复用

如上图所示,一个采用select/poll/epoll进行多路复用的大致过程是,通过select/poll/epoll调用,从所有的socket中获得可读/可写的socket集合,然后对这些可读/可写的socket直接进行读取/写入操作。

与阻塞模型不同的是,阻塞模型在读写socket时,是不能得知该socket的状态的,所以在recv/send时,可能被阻塞。

而经过selectsocket集合,其状态是确定的,对其进行recv/send时,几乎可以立即执行并返回,而不会阻塞线程,从而达到将多个socket在一个线程中合并处理的效果,达到多路复用的目的。

(未完待续)

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

linux c++ socket 网络编程(2) select 异步非阻塞

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭