多个连接公用一个等待机制,本模型会阻塞进场,但是进程是阻塞在select 或者poll 这两个系统调用上,而不是阻塞在真正的IO操作上
用户首先将需要进行IO操作添加到select中,继续执行做其他的工作(异步),同时等待select 系统调用返回。当数据到达时,IO被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。
从流程上来看,使用select函数继续IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视IO,以及调用select函数的额外操作,效率更差。并且阻塞两次,但是第一次阻塞在select上时,select可以监控多个IO上是否已有IO操作准备就绪,即可达到在同一个线程内同时处理多个IO请求的目的。而不像阻塞IO那种,一次只能监控一个IO
虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select 函数上阻塞),平均时间甚至比同步阻塞IO模型更长。如果用户线程只是注册自己需要的IO请求,然后去做自己的事情,等到暑假来时在进行处理,则可以提高CPU的利用率
IO多路复用是最常用的IO模型,但是其异步程度还不够‘彻底’,因它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO模型,而非真正的异步IO.
IO多路复用是指内核一旦发现进场指定的一个或者多个IO条件准备就绪,就通知该进程
IO多路复用适用如下场合:
当客户端处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用
当一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到IO 复用
当一个服务器既要处理TCP,又要处理UDP,一般使用···
当一个服务器要处理多个服务或多个协议