1,Blocking IO 阻塞IO
通过recvfrom系统调用,检查是否就绪
IO读取分为两个阶段,第一阶段准备数据 ,第二阶段 处理数据包 拷贝到用户空间
IO执行的两个阶段都被Blocking了
2,Non Blocking IO 非阻塞IO
调用recvfrom时候,不会阻塞线程而是直接返回(错误或者准备就绪)
应用需要不断调用recvfrom去检查(polling)
用户需要不断询问IO是否准备就绪。
为了避免CPU空转,引入了代理select,后来又有poll代理
系统空闲时候会将线程阻塞掉,当有一个或者多个流IO时间时候,将会唤起当前线程,于是会轮询所有的IO流。
缺点:需要无差别轮询所有的流,找出能够读写的流。处理的流越多,耗费的无差别轮询时间越长\
epoll可以理解为event poll,会通知我们是那个流发生了怎么样的事件
3,IO 多路复用
通过一种机制,一个进程可以同时等待多个文件描述符,任意一个文件描述进入就绪状态,select函数就会返回。
处理连接数很多的情况下,优势比较明显。
4,信号驱动IO
信号通知,数据包已经准备好被处理,数据报已经准备好被读取
5,异步IO
信号驱动IO告诉我们何时可以启动一个IO操作,异步IO则由内核通知IO操作何时完成,其他都交给内核处理。
同步IO,IO操作将会被阻塞,non-blocking IO在第一阶段不会阻塞IO,但是第二阶段,从内核拷贝到用户内存,进程会被阻塞。所以仍然是同步IO
异步IO,IO操作不会被阻塞
参考:https://www.jianshu.com/p/f00ad612153b
网友评论