阻塞/非阻塞、同步/异步、五种IO模型
阻塞、非阻塞、同步、异步
网络IO阶段:
- 数据就绪
- 阻塞
调用IO方法的线程进入阻塞状态
- 非阻塞
不会改变线程的状态,通过返回值判断
int size = recv(sockfd, buf, 1024, 0);
如果size = -1, 在阻塞的情况下可能是出错;
在非阻塞的情况下还需要判断errno != EAGAIN && errno != EWOULDBLOCK
- 阻塞
- 数据读写
- 同步
当数据准备好后,应用程序主动读取数据,在读取数据时程序不能往下运行
- 异步
和非阻塞搭配使用
将sockfd、 buf、通知方式(sig)等信息交给操作系统,应用程序就可以做自己的事了,
当数据准备好后, 操作系统会自动将数据搬到buf,然后使用约定好的通知方式通知应用程序
- 同步
!!在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是异步IO
linux异步IO接口:aio_read()/aio_write()
select、poll、epoll都是同步IO
五种IO模型
阻塞 blocking
不停的去检查这个函数有没有返回,必须等函数返回才能进行下一步操作
非阻塞 non-blocking(NIO)
事件未发生返回-1,此时根据errno区分是事件未发生还是出错
IO复用(IO multiplexing)
一次检测多个文件描述符的事件是否发生
信号驱动 signal-driven
linux用套接口进行信号驱动IO,安装一个信号处理函数,进程继续运行不阻塞,当IO事件就绪,进程收到SIGIO信号,再处理IO事件
异步 asynchronous
内核自动将数据拷贝到缓冲区,再通知应用程序