一、常见IO模型:
(1)同步阻塞IO:服务端阻塞等待客户端发送请求
(2)同步非阻塞IO:服务端采用轮询的方式处理客户端请求
(3)多路复用IO:Reator设计模式(Java中的selector和epoll)
(4)异步IO:Proactor设计模式
二、同步和异步的区别(用户线程和CPU交互方式):
(1)同步(
调用者主动等待调用结果):用户发起IO请求后要等待或轮询CPU的IO操作完成才能继续执行
(2)异步(被调用者主动通知调用者):
用户发起IO请求后不需要等待,继续干自己的事情,CPU的IO操作完成后告诉用户已经完成(或者调用用户的回调函数)
三、阻塞和非阻塞(用户线程等待IO调用结果时的状态,和同不同步不是一回事):
(1)阻塞:在用户调用IO的结果返回之前,用户线程会被挂起,在得到结果后才会返回
(2)非阻塞:先
用户调用IO等结果的过程中,不会挂起阻塞线程,而是轮询的方式等待结果
四、4中IO的详细介绍
(1)同步阻塞IO:
(2)同步非阻塞IO:
(3)多路复用IO:
用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。
从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket。
这种IO被Redis所运用,Redis采用的就是单线程的多路IO复用实现高效的缓存IO操作。
因此这种模型适合单线程处理多个IO请求。
(4)异步IO: