深刻了解Netty【四】IO模型


引言

IO模型就是操做数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO复用模型、信号驱动式IO模型、异步IO模型。 由于学习Netty必不可少的要了解IO多路复用模型,本篇是基础。编程

名词概念

  • 阻塞:指向调用方,在调用结果返回以前,调用方线程会挂起,直到结果返回。
  • 非阻塞:指向调用方,在调用结果返回以前,调用方线程会处理其余事情,不会阻塞。
  • 同步:指向被调用方,被调用方获得结果后再返回给调用方。
  • 异步:指向被调用方,被调用方先应答调用方,而后计算结果,最终通知并返回给调用方。
  • recvfrom函数:系统调用,经socket接收数据。

5中IO模型

一、阻塞式IO模型(blocking I/O)

阻塞式IO模型.png 进程调用recvfrom函数,在数据没有返回以前,进程阻塞,直到数据返回后,才会处理数据。网络

二、非阻塞式IO模型(non-blocking I/O)

非阻塞式IO模型.png 进程调用recvfrom函数,若是数据没有准备好就返回错误提示,以后进程循环调用recvfrom函数,直到有数据返回。异步

三、IO复用模型(I/O multiplexing)

IO复用模型.png 进程调用select,若是没有套接字变为可读,则阻塞,直到有可读套接字以后,调用recvfrom函数,返回结果。socket

四、信号驱动式IO模型(signal-driven I/O)

信号驱动式IO模型.png 进程先注册信号驱动,以后进程不阻塞,当数据准备好后,会给进程返回信号提示,这时进程调用ecvfrom函数,返回数据。async

五、异步IO模型(asynchronous I/O)

异步IO模型.png 由POSIX规范定义,应用程序告知内核启动某个操做,并让内核在整个操做(包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。这种模型与信号驱动模型的主要区别在于:信号驱动I/O是由内核通知应用程序什么时候启动一个I/O操做,而异步I/O模型是由内核通知应用程序I/O操做什么时候完成。函数

IO模型对比

5种IO模型比较.png 阻塞越少,理论上性能也越优。性能

  • 阻塞式IO,每一个链接要对应一个线程单独处理,浪费资源。
  • 非阻塞式IO,须要不断的轮询,也耗费CPU资源。
  • 信号驱动式IO,在大量IO操做时会有信号队列溢出,且对于TCP而言,通知条件过多,每个进行判断会消耗资源。
  • 异步IO,理论最优,可是目前Linux支持还不是很完善。

所以在Linux下网络编程都以IO复用模型为主。学习

参考

理解高性能网络模型 IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇).net

tencent.jpg

相关文章
相关标签/搜索