看完这篇,IO模型你还不了解吗
🚀什么是IO
IO 全称 (Input/OutPut), 从字面理解是 输入和输出。
从计算机知识理解: 计算机的核心(CPU\内存)与其他设备的数据转移的过程即为一次IO。例如从磁盘读取数据到内存或者从内存写人数据到磁盘都是IO。
从编程角度理解: IO会涉及到两个系统对象:一个是调用这个IO的进程对象(用户进程),另一个是系统内核。也就是说,当一个read操作发生时,将会经历这些阶段:
◇ 通过read系统调用,向内核发送读请求;
◇ 内核向硬件发送读指令,并等待读就绪;
◇ DMA把将要读取的数据复制到指定的内核缓存区中;
◇ 内核将数据从内核缓存区拷贝到用户进程空间中。
🚀IO模型
◇ 阻塞I/O模型
流程:
1、应用进程向内核发起recfrom读取数据。
2、准备数据报(应用进程阻塞)。
3、将数据从内核负责到应用空间。
4、复制完成后,返回成功提示。
◇非阻塞IO模型
流程
1、应用进程向内核发起recvfrom读取数据。
2、没有数据报准备好,即刻返回EWOULDBLOCK错误码。
3、应用进程向内核发起recvfrom读取数据。
4、已有数据包准备好就进行一下 步骤,否则还是返回错误码。
5、将数据从内核拷贝到用户空间。
6、完成后,返回成功提示。
◇IO复用模型
IO复用模型解释: 系统提供函数同时监控多个fd的操作,这个函数就是我们常说到的select、poll、epoll函数,应用线程通过调用select函数就可以同时监控多个fd,select函数监控的fd中只要有任何一个数据状态准备就绪了,select函数就会返回可读状态,这时询问线程再去通知处理数据的线程,对应线程此时再发起recvfrom请求去读取数据
◇信号驱动式IO模型
IO复用模型里面的select可以实现监控的作用,但是无脑轮询肯定会造成性能浪费,
信号驱动IO模型通过这种建立信号关联的方式,发出请求后只需等待数据就绪的通知即可,显得很高级~ 但是实际应用中比较少
◇ 异步IO模型
基于上面的四种模型,其实还是分为两步走:
第一步 发送请求select 询问数据是否准备完成;
第二步 再去发送recevform请求读取数据那为什么不能我只管发请求 后面的流程你自己走就好了–
于是 异步IO模型来了 它来了它来了~信号模型是通知我们需求去执行下一步IO操作,而 异步IO模型是告知你IO已经完成,你可以做后续的事情
🚀总结
◇selcet poll empoll 的区别
◇BIO NIO AIO
字面理解: 阻塞IO就是 BIO 非阻塞IO就是 NIO 异步IO就是 AIO
阻塞与非阻塞: 阻塞就是发起数据请求时,如果数据准备未完成, 请求继续等待就是 阻塞 ,如果立即返回 错误信息,就是非阻塞
同步和异步: 如果请求从发起到最后完成都需要自己参与那就是同步请求,反之如果只管发送请求,只需等待请求完成那就是异步请求