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

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

前言


依稀记得当年大学上课的时候,老师说IO这块考试不考,感兴趣的同学可以自行了解。。。一直被蒙在鼓里,直到校招的时候被面试官一套连招问麻了。。。


现如今鄙人已成为一名练习时长两年半的Java练习生,怎么能不了解网络IO背后的细节呢。本篇揭开一波网络IO的神秘面纱


什么是IO


字面意思,input/output输入输出,linux世界中一切皆文件,而文件就是一串二进制流,不管Socket、FIFO、管道还是终端,对我们来说,一切都是二进制流。

  • 在信息的交换过程中只是对这些流进行数据做接收转发,简称为I/O操作。
  • 往流中读取数据,系统调用Read,写入数据,系统调用Write。
  • 通常一个完整的IO包含两个步骤,磁盘IO网络IO


磁盘IO

image.png

网络IO

image.png

  • 完整的IO流程为
  • 磁盘IO负责把磁盘的数据从磁盘经过内核空间加载到用户空间
  • 网络IO负责数据经过用户空间调用内核空间的api发送到网卡


用户空间与内核空间

  1. 操作系统为了支持多个应用同时运行,需要保证不同进程之间相对独立(一个进程的崩溃不会影响其他的进程,恶意进程不能直接读取和修改其他进程运行时的代码和数据)。用户程序不能影响系统调度因此操作系统内核需要拥有高于普通进程的权限, 以此来调度和管理用户的应用程序。
  2. 于是内存空间被划分为两部分,内核空间存储的代码和数据具有更高级别的权限。内存访问的相关硬件在程序执行期间会进行访问控制,使得用户空间的程序不能直接读写内核空间的内存。


IO的阶段

  1. 硬件接口加载数据到内核空间
  2. 内核空间拷贝数据到用户空间
  3. 用户空间无法直接操作底层api,对数据进行加载、拷贝至网卡的操作需要切换成内核空间调用对应api完成


零拷贝

一切流行的组件为了追求速度都做了一些零拷贝的优化,先说一下传统拷贝


传统拷贝

  • 传统的文件传输方式会经历4次数据拷贝
  • 硬件DMA拷贝到内核空间的内核缓冲区
  • 内核空间的内缓冲区CPU拷贝到用户空间的用户缓冲区
  • 数据经过处理后从用户空间的用户缓冲区CPU拷贝到内核空间的内核缓冲区
  • 内核缓冲区DMA拷贝到网卡设备


image.png

mmp + write 零拷贝

  • mmp使用虚拟内存,把内核空间和用户空间的虚拟地址映射在同一个物理地址从而减少数据拷贝次数
  • mmap是将读缓冲区的地址和用户缓冲区的地址进行映射,内核缓冲区和应用缓冲区共享,所以节省了一次CPU拷贝,并且用户进程内存是虚拟的,只是映射到内核的读缓冲区,可以节省一半的内存空

image.png


sendfile 零拷贝

  • sendfile表示在两个文件描述符之间传输数据,它是在操作系统内核中操作的,避免了数据从内核缓冲区和用户缓冲区之间的拷贝操作,因此可以使用它来实现零拷贝。

image.png


相关文章
|
5月前
|
C++
基于Reactor模型的高性能网络库之地址篇
这段代码定义了一个 InetAddress 类,是 C++ 网络编程中用于封装 IPv4 地址和端口的常见做法。该类的主要作用是方便地表示和操作一个网络地址(IP + 端口)
316 58
|
5月前
|
网络协议 算法 Java
基于Reactor模型的高性能网络库之Tcpserver组件-上层调度器
TcpServer 是一个用于管理 TCP 连接的类,包含成员变量如事件循环(EventLoop)、连接池(ConnectionMap)和回调函数等。其主要功能包括监听新连接、设置线程池、启动服务器及处理连接事件。通过 Acceptor 接收新连接,并使用轮询算法将连接分配给子事件循环(subloop)进行读写操作。调用链从 start() 开始,经由线程池启动和 Acceptor 监听,最终由 TcpConnection 管理具体连接的事件处理。
220 2
|
5月前
|
Java Linux API
IO模型
BIO、NIO、AIO是Java中处理网络I/O的三种模型。BIO为阻塞式,每个连接需单独线程,高并发下性能受限;NIO通过非阻塞与多路复用提升并发能力,少量线程可处理大量请求;AIO进一步实现异步非阻塞,数据复制时线程可释放,由回调机制处理后续操作。三者适用于不同场景,BIO易用但低效,NIO高效但复杂,AIO理论性能更优但目前在Linux上仍依赖多路复用实现。Java 21引入虚拟线程后,BIO也可兼具高性能与易编写特性。
183 2
|
5月前
基于Reactor模型的高性能网络库之Tcpconnection组件
TcpConnection 由 subLoop 管理 connfd,负责处理具体连接。它封装了连接套接字,通过 Channel 监听可读、可写、关闭、错误等
172 1
|
5月前
|
JSON 监控 网络协议
干货分享“对接的 API 总是不稳定,网络分层模型” 看电商 API 故障的本质
本文从 OSI 七层网络模型出发,深入剖析电商 API 不稳定的根本原因,涵盖物理层到应用层的典型故障与解决方案,结合阿里、京东等大厂架构,详解如何构建高稳定性的电商 API 通信体系。
|
7月前
|
域名解析 网络协议 安全
计算机网络TCP/IP四层模型
本文介绍了TCP/IP模型的四层结构及其与OSI模型的对比。网络接口层负责物理网络接口,处理MAC地址和帧传输;网络层管理IP地址和路由选择,确保数据包准确送达;传输层提供端到端通信,支持可靠(TCP)或不可靠(UDP)传输;应用层直接面向用户,提供如HTTP、FTP等服务。此外,还详细描述了数据封装与解封装过程,以及两模型在层次划分上的差异。
1358 13
|
7月前
|
网络协议 中间件 网络安全
计算机网络OSI七层模型
OSI模型分为七层,各层功能明确:物理层传输比特流,数据链路层负责帧传输,网络层处理数据包路由,传输层确保端到端可靠传输,会话层管理会话,表示层负责数据格式转换与加密,应用层提供网络服务。数据在传输中经过封装与解封装过程。OSI模型优点包括标准化、模块化和互操作性,但也存在复杂性高、效率较低及实用性不足的问题,在实际中TCP/IP模型更常用。
990 10
|
2月前
|
机器学习/深度学习 数据采集 人工智能
深度学习实战指南:从神经网络基础到模型优化的完整攻略
🌟 蒋星熠Jaxonic,AI探索者。深耕深度学习,从神经网络到Transformer,用代码践行智能革命。分享实战经验,助你构建CV、NLP模型,共赴二进制星辰大海。
|
3月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
236 2
|
3月前
|
机器学习/深度学习 并行计算 算法
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)
【CPOBP-NSWOA】基于豪冠猪优化BP神经网络模型的多目标鲸鱼寻优算法研究(Matlab代码实现)