
1.什么是IO理解高效IO接下来聊 高效IO--也就是5种IO模型就是围绕着 该如何 减少 单位时间内 “等“ 的比重2.5种IO模型钓鱼等钓高效的钓鱼减少等的时间张三非常专注鱼漂不动张三不动w阻塞钓鱼李四一边看书一边钓鱼按时抬头检查鱼漂有鱼上钩李四钓鱼。不会因为鱼没有上钩而死死卡在检测鱼漂上非阻塞钓鱼王五鱼竿上挂铃铛有鱼了反向通知王五钓鱼信号驱动钓鱼赵六村长带了一卡车的鱼竿钓鱼来回检测是否有鱼咬钩多路转接钓鱼田七发起钓鱼小王钓鱼钓鱼期间田七干他的事异步钓鱼同步IO vs异步IO凡是参与 IO等或者拷贝任意一个阶段就是同步IO否则只是发起IO或者IO和你的工作流无关就是异步IO阻塞 vs 非阻塞拷贝完全相同只是 等 的方式不同阻塞是条件不就绪卡住非阻塞是条件不就绪直接以出错的形式返回错误码是 EWOULDBLOCK3.详谈a.阻塞IO在内核将数据准备好之前系统调用会一直等待所有的套接字默认都是阻塞方式比如accept-没有客户端连接一直等待recv-缓冲区无数据一直等待send-发送缓冲区满一直等待b.非阻塞IO内核数据如果没准备好系统调用会直接返回前提文件描述符设置为非阻塞并设置错误码为EWOULDBLOCK往往需要我们手动设置循环尝试读取文件描述符这称之为非阻塞轮询c.信号驱动IO内核准备好数据使用SIGIO信号通知进程进行IO操作我们提前自定义信号处理动作一旦捕捉就进行IO操作当有数据来临OS发起SIGIO信号应用程序捕捉回调然后进行IO读取多个信号位图可能只记录一次出现信号丢失有短板d.多路转接IO多个通路一个同通路就是一个文件描述符一个系统调用可以等待多个fd一旦有文件描述符 就绪“等”就可以调用read等来读“拷贝”之前的read、write、recvfrom、sendto 等做了两件事等拷贝这回我们分开来做e.异步IO内核在数据拷贝完成时 通知应用程序发起IO不关心IO细节完事之后直接从缓冲区拿数据没参与 等 、 拷贝异步IO4.非阻塞IO接下来的select、poll、epoll都围绕这个展开~一个文件描述符默认都是阻塞的一旦设置为非阻塞后续的系统调用 比如read、write等都是非阻塞的它们完全跟着 fd 走fd不就绪 就直接 EWOULDBLOCK 出错返回文件描述符就这样设置非阻塞阻塞IO一般做法插入一个小话题read的错误码非阻塞轮询一般做法完。