阻塞/非阻塞、同步/异步、五种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

内核自动将数据拷贝到缓冲区,再通知应用程序

你可能感兴趣的:(网络编程/webserver,开发语言,c++)