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

原创 2013年12月02日 23:08:07

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 网络编程(1)同步阻塞、非阻塞模型

1.网络编程基本模型介绍 linux的网络编程有很多种写法,最简单的是阻塞式(Blocking)的网络程序,其次有非阻塞(Non-Blocking),多路复用(Multiplexing),异步(Asy...

Linux C 网络编程——6. IO阻塞、非阻塞、复用、信号驱动、异步驱动

在Linux中进程空间和内核空间是分开的,系统调用是在Kernel中,IO 数据会先复制到进程空间,这样进程才能访问。 所以Linux I/O分为2个步骤:等待数据和复制数据 1. 阻塞I/O(Bl...

C/C++网络编程在windows和linux中将socket设置为阻塞和非阻塞

在 socket编程中,对于socket的读写默认都是阻塞的,但有的情况我们需要将其设置为非阻塞,比如做多路复用,或者通过select实现连接超时等功能,将socket设置为非阻塞,在windows和...

UNIX网络编程--socket中的同步/异步 阻塞/非阻塞

1. 概念理解      在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:       所谓同步,就是在发出一...

网络编程之 Socket的模式(一) --- “阻塞/非阻塞” 与 “同步/异步”

1.  阻塞/非阻塞         对于网络编程而言,Socket模式是开发者必须明确的一个问题。对于Socket的操作,可以分为阻塞模式和非阻塞模式两种。在两种不同模式下,同一个Socket函数...

socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别

   【转】 socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别2011-02-21 11:53转载自 fannu最终编辑 fannu在进行网络编程时,我们常常见到同步、异步、阻塞和...
  • junecau
  • junecau
  • 2011年03月19日 16:34
  • 811

Linux socket网络编程之聊天室(三):select异步通讯实现

1.服务器端 /*select_server.c 2011.9.2 by yyg*/ #include #include #include #include #include #inclu...

linux 网络编程【三】 非阻塞通信select

函数声明 select函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct ti...

linux 网络编程【三】 非阻塞通信select

函数声明 select函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct ti...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux c++ socket 网络编程(2) select 异步非阻塞
举报原因:
原因补充:

(最多只允许输入30个字)