【网络IO】细说网络IO模型【二】

简介: 面试官:我们来简单聊一下网络IO模型相关东西吧,嗯?不了解是吧,没关系,那今天面试就先到这了。。。

网络IO相关文章



前言

线程模型也是后端面试中的重中之重,通常在铺垫完IO概念后就开始对IO模型进行疯狂轰炸,这波整理一下IO模型相关的东西。


IO读写原理

  • 用户进程层面的IO对应到底层可以简单区分成两块。
  • read系统调用指的是将数据从内核缓冲区复制到进程缓冲区
  • write系统调用指的是把数据从进程缓冲区复制到内核缓冲区


阻塞与非阻塞、异步与同步

  • 阻塞:用户线程一直等待内核IO准备好数据,这期间什么都不干。
  • 非阻塞:用户线程拿到内核返回的状态就直接返回自己的空间,内核IO准备好了就干,没准备好可以被调度去干别的事情。
  • 同步IO:用户线程和内核线程的交互,用户空间线程是主动发起IO请求的一方,内核空间是被动接收的一方
  • 异步IO:与上面刚好相反,内核空间是主动发起IO请求的一方,用户空间的线程是被动接受IO状态方。


阻塞IO模型


阻塞IO,按字面意思顾名思义,当用户发生系统调用读取数据,线程从用户态转换为内核态,如果当前线程发现内核数据并没有准备好,会一直阻塞到数据准备好,直到内核空间将数据拷贝到用户进程空间。

整个内核操作分成两个阶段。第一阶段从磁盘硬件中读取数据,第二阶段从内核把数据拷贝到用户空间里。阻塞IO会在两个阶段里都阻塞住。


  • 特点
  • 使用阻塞 IO 时,因为线程会阻塞在准备内核准备数据阶段,需要配置多线程来使用,最常见的模型是阻塞 IO+多线程(线程池),每个连接一个单独的线程进行处理。疯狂创建线程会导致一个应用程序可以处理的客户端请求受限。面对连接数多的情况,是无法处理



非阻塞IO模型

  • 按照上述对阻塞、非阻塞的描述,非阻塞IO模型核心即用户线程拿到内核返回的状态就直接返回自己的空间。
  • 也就是用户空间调用系统调用到内核态时,不需要阻塞到准备好数据而是直接返回用户空间,通过不断轮询判断数据是否准备好,是否需要进入复制数据到用户空间的阶段。


  • 特点
  • 非阻塞 IO 解决了阻塞 IO每个连接一个线程处理的问题,所以其最大的优点就是 一个线程可以处理多个连接,这也是其非阻塞决定的。
  • 但这种模式,也有一个问题,就是需要用户多次发起系统调用。频繁的系统调用是比较消耗系统资源的。


多路复用IO模型


  • IO多路复用,用户线程放弃直接进行readwrite系统调用,而是通过select、epoll等内核函数,不断轮询内核返回的文件描述符。 整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,accept/recv是不会阻塞
  • 简单来说,我目前有 10 个连接,我可以通过一次系统调用将这 10 个连接都丢给内核,让内核告诉我,哪些连接上面数据准备好了,然后我再去读取每个就绪的连接上的数据。
  • 因此,IO 多路复用,复用的是系统调用。通过有限次系统调用判断海量连接是否数据准备好了



  • 特点
  • IO多路复用模型涉及两种系统调用,一种是就绪查询(select/epoll),一种是IO操作。
  • 多路复用IO也需要轮询。负责就绪状态查询系统调用的线程,需要不断的进行select/epoll轮询,查找出达到IO操作就绪的socket连接。


异步IO

异步IO模型,其基本流程为:用户线程通过系统调用,向内核注册某个IO操作。内核在整个IO操作(包括数据准备、数据复制)完成后,通知用户程序,执行后续的业务操作。


在异步IO模型中,整个内核的数据处理过程中,包括内核将数据从网络物理设备(网卡)读取到内核缓存区、将内核缓冲区的数据复制到用户缓冲区,用户程序都不需要阻塞。

image.png

特点:

  • 在内核等待数据和复制数据的两个阶段,用户线程都不是阻塞的。当内核的IO操作(等待数据和复制数据)全部完成后,内核以通知的形式告诉应用程序读数据。




相关文章
|
24天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于BP神经网络的苦瓜生长含水量预测模型matlab仿真
本项目展示了基于BP神经网络的苦瓜生长含水量预测模型,通过温度(T)、风速(v)、模型厚度(h)等输入特征,预测苦瓜的含水量。采用Matlab2022a开发,核心代码附带中文注释及操作视频。模型利用BP神经网络的非线性映射能力,对试验数据进行训练,实现对未知样本含水量变化规律的预测,为干燥过程的理论研究提供支持。
|
23天前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
23天前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
61 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
3天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
5天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
20 1
|
5天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
96 1
|
9天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
26 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
18天前
|
机器学习/深度学习 算法 数据挖掘
【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet
【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet
24 2
|
25天前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
4天前
|
网络协议 调度 开发者
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第27天】本文介绍了Python网络编程中的Twisted框架,重点讲解了其异步IO处理机制。通过反应器模式,Twisted能够在单线程中高效处理多个网络连接。文章提供了两个实战示例:一个简单的Echo服务器和一个HTTP服务器,展示了Twisted的强大功能和灵活性。
13 0