IO模型相关知识

1、同步、异步;阻塞、非阻塞

同步、异步

  • 同步和异步关注的是消息通信机制

  • 同步就是调用者进行调用后,在没有得到结果之前,该调用一直不会返回,但是一旦调用返回,就得到了返回值,同步就是指调用者主动等待调用结果

  • 而异步则相反,执行调用之后直接返回,所以可能没有返回值,等到有返回值时,由被调用者通过状态,通知来通知调用者(回调)。异步就是指被调用者来通知调用者调用结果就绪

  • 对于同步通信来说,都是由调用者主动等待这个调用的结果,无论是“干等”,还是轮询式的等,还是信号通知式的等,还是一次等多个的形式,都是需要主动去等的,对于异步通信来说,这个调用就直接返回了,所以没有返回结果,不需要调用者主动的等待。

阻塞、非阻塞

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

  • 阻塞调用是指在调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会继续执行。

  • 非阻塞调用是指在不能立刻得到结果之前,调用线程不会被挂起,还是可以执行其他事情。包括信号驱动也属于非阻塞,但是在用户从内核拷贝到用户空间时也是阻塞的。

两组概念相互组合就有四种情况,分别是同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。我们来举个例子来分别类比上诉四种情况:

1、同步阻塞

 2、同步非阻塞

3、异步阻塞 异步IO是什么? - 知乎

4、异步非阻塞

 2、五种IO模型

1、阻塞式IO:

在内核将数据准备好之前,系统调用会一直等待。所有的套接字,默认都是阻塞方式,阻塞式是最常见的IO模型,阻塞式IO属于同步IO模型

2、非阻塞式IO:

如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码,非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询。这对CPU来说是较大的浪费,一般只有特定场景下才使用,非阻塞式IO也属于同步IO模型

3、信号驱动IO:

内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作,信号驱动IO也属于同步IO,信号驱动是不是有点异步的感觉? 但是在将数据从内核复制到用户空间这段时间内用户态进程是阻塞的,所以也属于同步IO

4、多路复用IO:

虽然从流程图上看起来和阻塞IO类似,实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态,IO多路复用也属于同步IO

5、异步IO:

由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)。

阻塞程度:阻塞IO>非阻塞IO>多路转接IO>信号驱动IO>异步IO,效率是由低到高

参考:一、Netty简介与IO模型 - 知乎

猜你喜欢

转载自blog.csdn.net/ChenxiLiylnf/article/details/130035072