nginx的五种io模型(阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型、异步IO模型阻塞IO模型)

1.IO概念

IO(Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作
通常用户进程中的一个完整的IO分为两个阶段:用户进程空间–>内核空间、内核空间–>设备空间(磁盘、网络等)
IO有内存IO、网络IO和磁盘IO三种,通常说IO指的是后两种
在这里插入图片描述

  • Linux中进程无法直接操作I/O设备,必须通过系统调用请求kernel来协助完成I/O动作,内核会为I/O设备维护一个缓冲区
  • 对于一个输入来说,进程IO系统调用后,内核会先看缓冲区中有没有响应的缓存数据,没有的话再到设备中读取
  • 因为设备IO一般速度较慢,需要等待;内核缓冲区有数据则直接复制到进程空间
  • 对于一个网络输入操作通常包括两个不同阶段:
    1>等待网络数据到达网卡–>读取到内核缓冲区,数据准备好
    2>从制数据到进程空间2.IO模型的分类

5种IO模型

阻塞IO模型——一直在等待且需要自行拷贝
在这里插入图片描述
进程发起IO系统调用后,进程被阻塞,转到内核空间处理,整个IO处理完毕后返回进程,操作成功则进程获取到数据
非阻塞IO模型——过一会询问且需要自行拷贝(返回错误,非阻塞)
在这里插入图片描述

  • 进程发起IO系统调用后,如果内核缓冲区没有数据,需要到IO设备中读取,进程返回一个错误而不会被阻塞
  • 进程发起IO系统调用后,如果内核缓冲区有数据,内核会把数据返回进程
  • 对于阻塞IO模型来说,内核数据没有准备好需要进程阻塞的时候,就返回一个错误,以使得进程不被阻塞

IO复用模型——有一个调度器且自行拷贝
在这里插入图片描述

  • 多个进程的IO可以注册到一个复用器(select)上,然后用一个进程调用该select,select会监听所有注册进来的IO
  • 如果select没有监听的IO在内核缓冲区都没有该数据,select调用进程会被阻塞
  • 而当任一IO在内核缓冲区中有数据时,select调用就会返回
    而后select调用进程可以自己或通知另外的进程(注册进程)来再次发起读取IO,读取内核中准备好的数据
    典型应用:select、poll、epoll三种方案,nginx都可以选择使用
elect、poll、epoll:
select:注册IO、阻塞扫描,监听的IO最大连接数不能多与FD_SIZE(1024)
poll:原理和select相似,没有数量限制,但IO数量大扫描线性性能下降
epoll:事件驱动不阻塞,mmap实现内核与用户空间的消息传递,数量很大,linux2.6后内核支持

信号驱动IO模型——留电话,然后你回去,有消息电话通知
在这里插入图片描述

当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞
当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据

异步IO模型——邮递到家
在这里插入图片描述
当进程发起一个IO操作,进程返回(不阻塞),但也不能返回结果
内核会把整个IO处理完后,会通知进程结果
如果IO操作成功则进程直接获取到数据

在这里插入图片描述

发布了111 篇原创文章 · 获赞 0 · 访问量 2521

猜你喜欢

转载自blog.csdn.net/qq_42024433/article/details/105011170