简单理解网络IO

Java网络IO演进之路 你对网络IO了解多少?别被面试官打败到一个被问烂了的知识点上面! 阅读详情

简单理解网络IO

什么是网络IO?

首先用大白话的方式,方便自己理解

  1. 网络IO本质上也是IO的一种,一般的IO就是数据的输入输出,再简单来说,就是从一个地方,到另一个地方
  2. 在计算机中,能够存储数据的,一定是存储介质,而且一般采用的存储结构无非是数组、链表、树。而且我们知道,网络中的数据是以二进制的形式传输的,所以,可以简单认为,数据就是二进制数组中的元素。
  3. 那么,就有一个简单的推论,网络IO其实就是数据从一个数组到另一个数组的过程。接下来,就把这个数组具体化。

稍微提高一点专业性

  1. 网络IO的硬件基础是网卡,数据到达网卡之后,终点是应用程序的内存,但是,应用程序是无法直接访问网卡的,所以需要操作系统做中转。
  2. 所以,上面提到的两个数组,分别是操作系统的IO数组和应用程序内存中的数组
  3. 操作系统的IO数组,就是io buffer,程序的数组,就是我们熟悉的字节数组。

小结

  1. 网络IO的过程,就是操作系统接收到网卡的数据,缓存到一个buffer中,然后应用程序调用操作系统的函数,从对应的buffer中取出数据。
  2. 这么看来,操作系统可以理解为一个较为抽象的消息中间件。

常见的IO模型有哪些?

所谓的IO模型,是操作系统提供的IO函数,和具体的语言无关,不过我个人熟悉的是java,就和java结合来说。

常见的IO模型,分别是BIO、NIO、Select、POLL、EPOLL,后三者又统称为多路复用器。

所有的网络模型解决的核心问题都是以下3个问题:

  1. 有哪些网络连接?
  2. 哪个连接有数据?
  3. 如何读取数据?

下面,按照IO模型的发展顺序,以IO模型存在的问题为主线,简单系统地总结一下IO模型,建立起对IO模型的系统认识。

  1. BIO,无论是获取新的连接还是读取指定连接的数据,调用操作系统的函数都是阻塞的,如果要实现服务多个连接,就必须每个连接建立一个线程异步处理,否则,当建立起一个连接,但是客户端不发送数据,服务端就会被这个客户端占用,无法接受新的连接。
  2. NIO,解决了阻塞的问题,程序调用操作系统的函数,如果没有连接或数据,会立即返回,不会阻塞,避免了资源无效浪费。但是,它的问题在于,如果我有1万个连接,每次我需要挨个询问1万次,这个复杂度是O(n)的。每次询问都是一次系统调用,涉及到CPU的用户态内核态切换,成本很高。
  3. Select,这是最初级的多路复用器,从NIO到多路复用器,其实就是一个从多次到批量的演进,多路复用器支持一次询问多个文件描述符(fd)(linux中,一切皆为文件,连接也是文件,有对应的文件描述符)。从多次到批量,就能节省大量的运行态切换成本。但是select的问题在于,批量有上限,是有限的批量。
  4. POLL,解决了select的上限问题,一次可以询问任意个数的fd,真正做到了批量。但是,即使减少了运行态切换的成本,针对每次传来的fd,操作系统依然需要逐个遍历,复杂度依然是O(n),只是每次操作的损耗降低了。
  5. EPOLL,解决了POLL和Select存在的遍历问题,将复杂度降为O(1),操作系统提前维护好用户程序对应的fd,每次有数据到达,就把对应的fd放到一个数据结构中存起来,当用户程序需要读取数据时,直接把这些有状态的fd返回,用户程序一次性获取fd,逐个读取即可。用户只要调用一次,操作系统也不需要遍历。这是目前大部分场景下,最高效的模型。
深入理解RPC—网络IO 网络通信和RPC 首先我们知道RPC 是解决进程间通信的一种方式。一次 RPC 调用,本质就是服务消费者与服务提供者间的一次网络信息交换的过程。服务调用者通过网络 IO 发送一条请求消息,服务提供者接收并解析,处理完相关的业务逻辑之后,再发送一条响应消息给服务调用者,服务调用者接收并解析响应消息,处理完相关的响应逻辑,一次 RPC 调用便结束了。可以说,网络通信是整个 RPC 调用流程的基础。 常见的网络 IO 模型 那说到网络通信,就不得不提一下网络 IO 模型。为什么要讲网络 IO 模型呢?因为所谓的两 阅读详情

相关推荐

07|Java IO流与网络编程入门教程:通俗易懂,实例丰富

想象一下水管流水,水从一端流入流出的过程就像是数据在程序中的传输。在Java世界里,IO流就是这样一个抽象概念,它是数据在不同存储介质或网络之间传输的一种方式。简单来说,如果你把数据看作水流,那么IO流就是承载这个水流的管道,它可以用来读取文件、网络数据,也可以用来写出数据到文件、网络中去。// 创建一个字节流来读取文件int len;= -1) {// 处理读取到的字节流// 创建一个字节流来写出数据到文件网络编程是指利用网络协议(如TCP/IP)在不同的计算机间建立连接并交换数据。

qq_33449977的博客 586

网络IO概述

现在计算机的发展离不开网络,特别是分布式应用(本质上就是计算机+网络),本文重点关注常见的网络IO模型以及经典的IO多路复用几种实现方式(select、poll、epoll)的比较,方便后续网络 IO 编程。

云原生Java Web领域技术博客 2392

UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核

其中 Transmit Engine 从 AXI-Stream TX 接口接收数据,并添加前导码 Preamble、帧起始界定符 SFD、帧校验序列 FSC 等,并在必要时(长度小于最小 MAC 帧长度)填充数据,因此在使用 TEMAC 时,MAC 帧的这几个部分就不需要我们自己添加了(不过其他的 MAC 帧部分,可选的帧过滤器 Frame Filter 用于过滤与一组可配置过滤器匹配的帧,一般用于过滤掉目的 MAC 地址与本设备不一致的帧,TEMAC 默认开启帧过滤器。默认值为使用64位宽的计数器。

lzr232的博客 1767

五大网络IO模型

nput/utput),即,通常指在(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(例如)与外部世界(可能是人类或另一信息处理系统)之间的通信。。该术语也可以用作行动的一部分;到“执行I/O”是执行输入或输出的操作。输入/出设备是硬件中由人(或其他系统)使用与电脑进行通信的部件。例如,键盘或鼠标是电脑的输入设备,而监控器和打印机是输出设备。电脑之间的通信设备(如电信调制解调器和网卡)通常执行输入和输出操作。将设备指定为输入或输出取决于视角。

qq13321123的博客 2935

团子杂记:SAP收入确认工具RAR(Revenue Recognition&Reporting)在新收入准则下的应用

SAP收入确认工具RAR知识分享

Lucas1211的博客 4282

Armbian 国内源一键配置:告别卡顿,加速软件更新

本文详细介绍了如何为Armbian系统配置国内软件源,以解决默认国外源导致的更新缓慢、连接超时等问题。通过手动修改配置文件或使用高效的一键换源脚本,可将源切换至清华大学、阿里云等国内镜像站,实现apt更新与软件安装速度的质的飞跃,让Armbian开发体验更加流畅高效。

weixin_29215815的博客 243

3.一文读懂网络 IO 模型

本篇文章主要讲解网络 IO 模型的发展和演变过程,以及在 linux 下网络 IO 模型的实现原理。

克里斯丁的博客 2590

端侧部署与优化:让 AI 真正走进现实生活的关键技术

AI 的开发流程分为 “训练” 与 “推理” 两大阶段。在训练阶段,科研人员依托云端海量数据和高性能 GPU 算力,构建出精度优异的 AI 模型 —— 比如能识别 1000 种物体的图像分类模型、能理解人类语言的自然语言处理模型。但这些在云端 “战绩斐然” 的模型,若直接应用到现实场景中,却会面临三大 “落地困境”。从云端到端侧,从模型压缩到硬件适配,端侧部署与优化技术解决了 AI 落地的核心难题,让 AI 不再是实验室里的 “高精尖技术”,而是融入日常生活的 “实用工具”。

m0_63477749的博客 1049

网络 IO 阻塞的原因你真的了解了吗?

引言:在网络通信中,当发送方和接收方的数据传输速度不均衡、网络出现拥塞、采用阻塞式 I/O 操作、处理方式低效或者网络延迟时,都可能导致网络 I/O 阻塞的发生。这些原因使得程序在进行网络通信时无法及时地发送或接收数据,导致程序性能下降和响应延迟。大多数鱼友对计算机网络这方面的知识会比较薄弱,因为本文将进行网络 IO 阻塞的分析。

2401_84419325的博客 2680

2d游戏地图编辑器_[U3D]基于MarchingCubes实现的War3Editor 地表/悬崖编辑器

花了几天时间研究清楚Marching cubes后,发现这个方法是一个非常适用于地图编辑,网格编辑,procedural 生成的工具。最大的优点有着较好的边缘,表面处理。然后我用U3D写了一个悬崖/地表的编辑器。其中使用到了Marching Cubes的2.5D,2D两种降维的方法。talk is cheap,让我看效果!DemoEditor展示https://www.zhihu.com/vide...

weixin_42504649的博客 1178

主流双目相机技术参数横向评测:从ZED到INDEMIND的深度解析

本文对主流双目相机进行了深度横向评测,涵盖ZED、Bumblebee、Leap Motion、DUO 3D及INDEMIND等国内外产品。文章详细解析了分辨率、帧率、视场角、基线等核心参数,并结合科研、机器人导航、无人机、工业检测等典型应用场景,提供了实战选型指南,帮助读者根据具体需求挑选最合适的双目视觉解决方案。

weixin_29212867的博客 640

linux网络向学习总结(5大io模型与阻塞io)

本文是我c++向的linux网络学习小结,感兴趣的话可以观看,内容是5种io模型,本文并没有代码和图文,全都是我个人见解,如有需要,可以使用大模型,他的解答比我更细腻,而且可以多次提问。

yushi525的博客 936

CANoe-vTESTstudio之Test Diagram编辑器

总之,CANoe-vTESTstudio的Test Diagram编辑器提供了一个直观且强大的工具,用于创建和管理测试用例。通过图形化的界面和丰富的功能,测试工程师可以更轻松地编写复杂的测试脚本,并有效地进行测试开发。在上面的示例中,我们创建了一个名为"MyTestCase"的测试用例,并定义了两个测试步骤"Step1"和"Step2"。在上面的示例中,我们在执行"Step1"之后使用条件语句来确定是否执行"Step2"。在每次迭代中,我们创建一个新的测试步骤,并根据迭代次数动态生成相应的日志和验证消息。

TcData的博客 248

网络编程:什么是阻塞IO

阻塞IO适用于简单的网络应用,但在高并发场景下效率较低,因为每个连接会占用一个线程,可能导致线程资源耗尽。为了解决高并发问题,可以使用非阻塞IO(如NIO)或异步IO技术。

2301_78976656的博客 344

基于 Simulink 的单相 PWM 整流器(四象限变流器)在高铁辅助电源系统中的建模与仿真实战教程

这是一份基于 Simulink 的实战教程。在高铁牵引供电与辅助电源系统中,单相 PWM 整流器(又称四象限变流器,4QC)是极其核心的“绿色电源”枢纽。传统的二极管整流器虽然结构简单,但会导致严重的输入电流畸变和低功率因数,对电网造成极大的谐波污染。而 PWM 整流器通过高频主动控制,不仅能将单相交流电转换为平稳的直流电,还能实现输入电流正弦化、单位功率因数(PF=1)运行,并支持能量双向流动(如列车再生制动时的能量回馈)。本教程将带你从数学模型出发,搭建一套高性能的电压电流双闭环控制系统。

amy_mhd的博客 47

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

基于协程io_uring 异步网络库系列 VI: io_uring v.s. epoll | proactor v.s. reactor | io_uring Proactor 模型

本文讲解 io_uring 如果编写 proactor 编程模型,同时对比 Reactor 模型。主要涉及的是模型中的 IO 部分,比如 short read。

锐龙处理器 769

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Python零基础入门篇 · 35】:协程和IO操作的简单理解

协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。通俗的理解: 在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。适用场景:如果一个线程里面IO操作(网络等待、文件操作)比较多,协程就比较适用,适用于高并发处理。协程,又称微线程,纤程。

Oh_Python的博客 369

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

select之多路IO复用

举一个简单地网络服务器的例子,如果你的服务器需要和多个客户端保持连接,处理客户端的请求,属于多进程的并发问题,如果创建很多个进程来处理这些IO流,会导致CPU占有率很高。所以人们提出了I/O多路复用模型:一个线程,通过记录I/O流的状态来同时管理多个I/O,需要的线程数大大减少,减少了内存开销和上下文切换的CPU开销。

m0_60529319的博客 296

cast提前!最简单有效的神经网络优化方法,没有之一!

cast提前!最简单有效的神经网络优化方法,没有之一!

通俗易懂的 AI 技术 614

什么是io?程序员该怎么理解io

什么是io

tonny的博客 3万+

五种网络IO模型

  本文重点在于介绍五种网络IO模型  网络IO,会涉及到两个系统对象,一个是用户空间调用IO的进程或线程,另一个是内核空间的内核系统,比如发生IO操作read时,它会经历两个阶段。  因为在以上两个阶段上各有不同的情况,所以出现了多种网络 IO 模型。  本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接 C/C++后台高级服务器课程介绍 详细查看课程的服务。  .........

清风 6354

简单理解几种Java IO模型

很多朋友在学习NIO的时候感觉比较吃力,对里面一些概念不是很明朗,本文杜撰了一个大嘴开饭店的故事,来类比Java IO模型的演变,帮助理解几种模型的功能和特点,IO分为磁盘IO和网络IO,本文讨论的都是网络IO。 爪哇村的大嘴做得一手好菜,原本是和平饭店的厨子,对吃的东西悟性很高,工作之余喜欢研究各种创新菜,最近自创一道麻辣小龙虾,顾客们吃后反响强烈,于是,大嘴想自立门户,专门开店经营小龙虾。 ......

格子的博客 1万+

网络IO的理解

Unix/Linux系统下IO主要分为磁盘IO,网络IO,我今天主要说一下对网络IO的理解,网络IO主要是socket套接字的读(read)、写(write),socket在Linux系统被抽象为流(stream)。 网络IO模型 在Unix/Linux系统下,IO分为两个不同阶段: 等待数据准备好 从内核向进程复制数据 阻塞式I/O 阻塞式I/O(blocking I/O)是最简单的一种,默认情况下,socket 套接字的系统调用都是阻塞的,我以recv/recvfrom 理解一下网络IO的模型

JineD的博客 7266

linux查看磁盘IO,网络IO 总结

linux查看磁盘IO,网络 IO可用的命令 1. top 监控整体服务器,cpu,内存,磁盘,网络等 2. dstat -d 查看当前磁盘每秒的读取,写入量,单位K 3. dstat -r 查看当前磁盘随机的读IOPS,写IOPS 4. dstat -n 查看网卡每秒接收,发送量,单位K

papaya的博客 2万+

理解网络IO模型

网络IO模型 什么是IO 即Input/Output,我们通过电脑访问硬盘资源本身的操作就是一种IO操作。 什么是网络IO 网络上的数据是通过协议流动的,两端在通信时是通过各自的套接字Scoket进行操作。所谓的网络IO就是对Socket套接字进行读取操作 深入理解Socket套接字原理_Princesk的博客-优快云博客 网络上使用tcp协议通讯时两端都会先将数据包放到socket划分缓存区,网络IO操作的就是这个缓存区或者叫缓冲区。 网络IO操作Socket的操作流程 等待网络上通过协议传输的数据

Princesk的博客 3381
上一篇: ByteArrayOutputStream或ByteArrayInputStream是可以不关闭的
下一篇: http 长连接和短连接介绍
ArtisticProgramming
博客等级 码龄8年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值