图解网络IO模型

别再只用GPS了!用Android手机传感器实现室内步行轨迹记录(避坑指南) 本文详细介绍了如何利用Android手机传感器(如加速度计、陀螺仪和磁力计)实现室内步行轨迹记录,克服GPS在室内的局限性。通过传感器数据采集、步态检测、航向估计和轨迹绘制等步骤,结合避坑指南和优化技巧,帮助开发者高效构建室内定位应用。 阅读详情

背景介绍

  • 在互联网的时代下,绝大部分数据都是通过网络来进行获取的。

  • 在服务端的架构中,绝大部分数据也是通过网络来进行交互的。

而且作为服务端的开发工程师来说,都会进行一系列服务设计、开发以及能力开放,而服务能力开放也是需要通过网络来完成的,因此对网络编程以及网络IO模型都不会太陌生。

由于有很多优秀的框架(比如Netty、HSF、Dubbo、Thrift等)已经把底层网络IO给封装了,通过提供的API能力或者配置就能完成想要的服务能力开发,因此大部分工程师对网络IO模型的底层不够了解。

本文系统的讲解了Linux内核的IO模型、Java网络IO模型以及两者之间的关系!

什么是IO

我们都知道在Linux的世界,一切皆文件。

而文件就是一串二进制流,不管Socket、FIFO、管道还是终端,对我们来说,一切都是流。

  • 在信息的交换过程中,我们都是对这些流进行数据收发操作,简称为I/O操作。

  • 往流中读取数据,系统调用Read,写入数据,系统调用Write。

通常用户进程的一个完整的IO分为两个阶段:

磁盘IO:

网络IO:

操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能使用指针传递数据,因为Linux使用的 虚拟内存 机制,必须通过系统调用请求内核来完成IO动作。

IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者!

为什么需要IO模型

如果使用 同步 的方式来通信的话,所有的操作都在一个线程内顺序执行完成,这么做缺点是很明显的:

  • 因为同步的通信操作会阻塞同一个线程的其他任何操作,只有这个操作完成了之后,后续的操作才可以完成,所以出现了 同步阻塞+多线程 (每个Socket都创建一个线程对应),但是系统内线程数量是有限制的,同时线程切换很浪费时间,适合Socket少的情况。

因该需要出现IO模型。

Linux的IO模型

在描述Linux IO模型之前,我们先来了解一下Linux系统数据读取的过程:

以用户请求index.html文件为例子说明

基本概念

用户空间和内核空间

操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。

  • 为了保证内核的安全,用户进程不能直接操作内核,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。

进程切换

为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。

这种行为被称为进程切换。

因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。

进程的阻塞

正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。

可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。

当进程进入阻塞状态,是不占用CPU资源的。

文件描述符

文件描述符(File Descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一个非负整数,实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。

  • 当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

缓存IO

大多数文件系统的默认 IO 操作都是缓存 IO。

其读写过程如下:

  • 读操作:操作系统检查内核的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回;否则从磁盘、网卡等中读取,然后缓存在操作系统的缓存中;

  • 写操作:将数据从用户空间复制到内核空间的缓存中。这时对用户程序来说写操作就已经完成,至于什么时候再写到磁盘、网卡等中由操作系统决定,除非显示地调用了 sync 同步命令。

假设内核空间缓存无需要的数据,用户进程从磁盘或网络读数据分两个阶段:

  • 阶段一:内核程序从磁盘、网卡等读取数据到内核空间缓存区;

  • 阶段二:用户程序从内核空间缓存拷贝数据到用户空间。

缓存 IO 的缺点:

数据在传输过程中需要在应用程序地址空间和内核空间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU以及内存开销非常大。

同步阻塞

用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞,什么也不干,直到数据准备好,并且将数据从内核复制到用户进程,最后进程再处理数据,在等待数据到处理数据的两个阶段,整个进程都被阻塞,不能处理别的网络IO。

  • 调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。

这也是最简单的IO模型,在通常FD较少、就绪很快的情况下使用是没有问题的。

同步非阻塞

非阻塞的系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。

  • 进程在返回之后,可以干点别的事情,然后再发起系统调用。

  • 重复上面的过程,循环往复的进行系统调用。这个过程通常被称之为轮询。

  • 轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。

  • 需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。

  • 这种方式在编程中对Socket设置 O_NONBLOCK 即可。

IO多路复用

IO多路复用,这是一种进程预先告知内核的能力,让内核发现进程指定的一个或多个IO条件就绪了,就通知进程。

使得一个进程能在一连串的事件上等待。

IO复用的实现方式目前主要有Select、Poll和Epoll。

伪代码描述IO多路复用:

while(status == OK) { // 不断轮询
 ready_fd_list = io_wait(fd_list); //内核缓冲区是否有准备好的数据
 for(fd in ready_fd_list) {
  data = read(fd) // 有准备好的数据读取到用户缓冲区
  process(data)
 }
}

信号驱动

首先我们允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。

当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

流程如下:

  • 开启套接字信号驱动IO功能

  • 系统调用Sigaction执行信号处理函数(非阻塞,立刻返回)

  • 数据就绪,生成Sigio信号,通过信号回调通知应用来读取数据

此种IO方式存在的一个很大的问题:Linux中信号队列是有限制的,如果超过这个数字问题就无法读取数据

异步非阻塞

异步IO流程如下所示:

  • 当用户线程调用了 aio_read 系统调用,立刻就可以开始去做其它的事,用户线程不阻塞

  • 内核就开始了IO的第一个阶段:准备数据。当内核一直等到数据准备好了,它就会将数据从内核内核缓冲区,拷贝到用户缓冲区

  • 内核会给用户线程发送一个信号,或者回调用户线程注册的回调接口,告诉用户线程Read操作完成了

  • 用户线程读取用户缓冲区的数据,完成后续的业务操作

相对于同步IO,异步IO不是顺序执行。

用户进程进行 aio_read 系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。

等到数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。

对比信号驱动IO,异步IO的主要区别在于:

  • 信号驱动由内核告诉我们何时可以开始一个IO操作(数据在内核缓冲区中),而异步IO则由内核通知IO操作何时已经完成(数据已经在用户空间中)。

异步IO又叫做事件驱动IO,在Unix中,为异步方式访问文件定义了一套库函数,定义了AIO的一系列接口。

  • aio_read
    aio_write
    aio_error
    

目前Linux中AIO的内核实现只对文件IO有效,如果要实现真正的AIO,需要用户自己来实现。

目前有很多开源的异步IO库,例如libevent、libev、libuv。

Java网络IO模型

BIO

BIO是一个典型的网络编程模型,是通常我们实现一个服务端程序的方法,对应Linux内核的同步阻塞IO模型,发送数据和接收数据的过程如下所示:

步骤如下:

  • 主线程accept请求

  • 请求到达,创建新的线程来处理这个套接字,完成对客户端的响应

  • 主线程继续accept下一个请求

服务端处理伪代码如下所示:

这是经典的一个连接对应一个线程的模型,之所以使用多线程,主要原因在于 socket.accept()、socket.read()、socket.write() 三个主要函数都是同步阻塞的。

当一个连接在处理I/O的时候,系统是阻塞的,如果是单线程的话必然就阻塞,但CPU是被释放出来的,开启多线程,就可以让CPU去处理更多的事情。

其实这也是所有使用多线程的本质:

利用多核,当I/O阻塞时,但CPU空闲的时候,可以利用多线程使用CPU资源。

当面对十万甚至百万级连接的时候,传统的BIO模型是无能为力的。

随着移动端应用的兴起和各种网络游戏的盛行,百万级长连接日趋普遍,此时,必然需要一种更高效的I/O处理模型。

NIO

JDK1.4开始引入了NIO类库,主要是使用Selector多路复用器来实现。

Selector在Linux等主流操作系统上是通过IO复用Epoll实现的。

NIO的实现流程,类似于Select:

  • 创建ServerSocketChannel监听客户端连接并绑定监听端口,设置为非阻塞模式

  • 创建Reactor线程,创建多路复用器(Selector)并启动线程

  • 将ServerSocketChannel注册到Reactor线程的Selector上,监听Accept事件

  • Selector在线程run方法中无线循环轮询准备就绪的Key

  • Selector监听到新的客户端接入,处理新的请求,完成TCP三次握手,建立物理连接

  • 将新的客户端连接注册到Selector上,监听读操作,读取客户端发送的网络消息

  • 客户端发送的数据就绪则读取客户端请求,进行处理

简单处理模型是用一个单线程死循环选择就绪的事件,会执行系统调用(Linux 2.6之前是Select、Poll,2.6之后是Epoll,Windows是IOCP),还会阻塞的等待新事件的到来。

新事件到来的时候,会在Selector上注册标记位,标示可读、可写或者有连接到来,简单处理模型的伪代码如下所示:

NIO由原来的阻塞读写(占用线程)变成了单线程轮询事件,找到可以进行读写的网络描述符进行读写。

除了事件的轮询是阻塞的(没有可干的事情必须要阻塞),剩余的I/O操作都是纯CPU操作,没有必要开启多线程。

并且由于线程的节约,连接数大的时候因为线程切换带来的问题也随之解决,进而为处理海量连接提供了可能。

AIO

JDK1.7引入NIO2.0,提供了异步文件通道和异步套接字通道的实现。

  • 其底层在Windows上是通过IOCP实现,在Linux上是通过IO复用Epoll来模拟实现的。

在JAVA NIO框架中,Selector它负责代替应用查询中所有已注册的通道到操作系统中进行IO事件轮询、管理当前注册的通道集合,定位发生事件的通道等操作。

但是在JAVA AIO框架中,由于应用程序不是 轮询 方式,而是订阅-通知方式,所以不再需要Selector(选择器)了,改由Channel通道直接到操作系统注册监听 。

JAVA AIO框架中,只实现了两种网络IO通道:

  • AsynchronousServerSocketChannel(服务器监听通道)

  • AsynchronousSocketChannel(Socket套接字通道)。

具体过程如下所示:

  • 创建AsynchronousServerSocketChannel,绑定监听端口

  • 调用AsynchronousServerSocketChannel的accpet方法,传入自己实现的CompletionHandler,包括上一步,都是非阻塞的

  • 连接传入,回调CompletionHandler的completed方法,在里面,调用AsynchronousSocketChannel的read方法,传入负责处理数据的CompletionHandler

  • 数据就绪,触发负责处理数据的CompletionHandler的completed方法,继续做下一步处理即可

  • 写入操作类似,也需要传入CompletionHandler

 

支持UE4.27、UE5.0、UE5.1、UE5.2、UE5.3、UE5.4、UE5.5的VS2022一键安装方法 本文提供了两种安装VS2022以支持UE5开发的方案。方案一通过百度网盘提供一键安装包,下载解压后以管理员身份运行批处理文件即可完成安装。方案二需从微软官网下载安装程序,通过创建包含特定参数的批处理文件来自定义安装组件。两种方案都需保持联网环境,建议先卸载旧版VS。安装完成后可测试打包UEC++项目Windows包。 阅读详情

相关推荐

RAD Studio 12安装全攻略:从下载到破解InterBase的完整流程(附KeyPatch使用技巧)

本文提供RAD Studio 12的完整安装指南,包括系统要求、安装步骤及InterBase数据库的高效配置方法。详细介绍了如何使用KeyPatch工具进行许可证处理,并分享了IDE优化和开发技巧,帮助开发者快速上手这一强大的跨平台开发工具。

q6r7s8t9的博客 950

深入理解Linux网络学习总结

深入理解Linux网络,修炼底层内功,掌握高性能原理。

追求幸福,探索未知的博客 3424

在线机器学习(OML-AD)应对时序数据概念漂移的异常检测实战

时序数据异常检测是监控系统健康、识别业务风险的核心技术。其基本原理是通过预测模型学习数据的正常模式,并将预测误差作为异常判定的依据。然而,当数据背后的统计规律随时间发生变化,即发生概念漂移时,传统的静态模型会失效,导致误报和漏报激增。在线机器学习技术通过增量学习,使模型能够随每个新数据点实时微调,为预测式异常检测提供了动态适应能力,从而在数据流持续演化的场景下保持检测的鲁棒性。这种将预测与检测无缝衔接的OML-AD框架,尤其适用于工业监控、金融风控等对实时性与资源效率要求高的领域,有效解决了概念漂移这一核心

weixin_29889665的博客 532

aio_read 函数这么好用,还用什么read干嘛?(两者区别)

函数确实提供了异步读取文件的能力,这在某些情况下是非常有用的,尤其是当应用程序需要同时处理多个I/O操作时。异步I/O操作可以在不阻塞主线程的情况下进行,从而提高了应用程序的响应性和效率。函数取决于你的具体需求和场景。如果你需要高性能的异步I/O操作,并且你的应用程序可以处理异步操作的复杂性和潜在的风险,那么。可能是一个不错的选择。然而,如果你只是需要简单地读取数据并且不需要复杂的异步操作,那么。函数可能是更合适的选择。

symsyq的博客 978

Megatron单机多卡Qwen2.5:pre-train+sft

英伟达:https://github.com/NVIDIA/Megatron-LM/releases/tag/core_r0.8.0阿里:https://github.com/alibaba/Pai-Megatron-Patch/releases/tag/v0.10.2。

weixin_46873015的博客 2179

Response Instance 详解:在 ABAP OData Client Proxy 中读懂每一次响应

ABAP OData Client Proxy中的Response Instance是关键信息载体,封装了业务数据及调用上下文(如分页、delta link等)。响应实例在执行请求后自动生成,根据请求类型返回特定接口(如READ返回/IWBEP/IF_CP_RESPONSE_READ)。响应抽象与OData版本解耦,支持统一处理V2/V4服务。常见响应类型包括单实体读取、列表读取(支持分页和增量同步)、创建/更新/删除响应等。开发时可通过响应对象的安全类型方法获取数据,如get_business_data获

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 137

如何用AIO技术提高程序性能

AIO 可以帮助你构建更有效地使用可用 CPU 资源的应用程序。 虽然这种 I/O 模型与大多数 Linux 应用程序中的传统阻塞模式不同,但异步通知模型在概念上很简单,还可以简化你的设计。

lucasma的博客 1451

图神经网络学习笔记-点云数据处理(专题七)

本教程解释了如何利用图神经网络(Graph Neural Networks,GNNs)来处理和训练点云数据。尽管点云默认情况下不具有图结构,但我们可以利用 PyG 的转换工具,将其转化为适合 PyG 所提供的全套 GNN 模型的形式。关键思想是从点云数据中创建一个,通过 GNN 的消息传递机制,从中学习有意义的局部几何结构。这些点的表示可以被用于例如点云分类或分割等任务。

351

为大家献上《深入理解Linux网络》全书知识图谱!

大家好,我是飞哥!咱们的《深入理解Linux网络》上市短短一个月,就收获了非常多的好数据。为了能让这么多读者更好地吸收和掌握书中的知识,我做了个全书的知识图谱,今天送给大家!我把书中的每一个章节都重新过了一遍,然后把其中的核心知识点提取了出来。最后汇总成了一张知识图谱。整本书的内容精华就全在这里了。请长按图片下载,如果不够清晰的话,在咱们公众号后台回复「思维导图」获取图片...

zhangyanfei01的专栏 4912

Java语音革命:用代码打造永不疲倦的AI客服,让客户支持效率飙升300%!

客户支持领域常面临“薛定谔困境”,即无法预知客户来电的意图是投诉还是表扬。通过Java技术,尤其是语音识别和自然语言处理(NLP),可以有效解决这一问题。文章展示了如何利用Java代码构建“声纹量子引擎”,实现客户支持的自动化。核心技术包括录音与预处理、语音识别和语义理解。通过百度AI API和Stanford NLP,系统能够快速、准确地识别客户语音并理解其意图。数据表明,优化后的AI处理时间从15分钟缩短至18秒,语音识别准确率提升至98.5%,并发处理能力达到单实例1000+请求。这些技术显著提升了客

墨夶的博客 1035

uniapp(全端兼容) - 最新详细实现瀑布流列表及布局设计,uni-app全平台兼容的瀑布流示例,view容器自适应瀑布流布局,图片瀑布流布局、图像+文字卡片式瀑布流,类似小红书(详细示例代码)

uni-app,瀑布流,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,瀑布流布局,如何实现图片瀑布流,怎么做文字+图像瀑布流,uniapp仿小红书笔记瀑布流效果,uniAPP仿快手抖音布局列表,瀑布流列表详细教程,编译所有平台都能用的瀑布流列表,商品瀑布流列表,图文列表,小程序瀑布流,页面触底懒加载,瀑布流插件,详细示例代码教程,uni-app H5实现瀑布流效果,uniapp小程序做瀑布流,纯css瀑布流,用uniapp写瀑布流商品列表,

✅ 精选推荐文章 1万+

aio_read()的例程详解

man手册 AIO(7) Linux Programmer's Manual AIO(7) NAME aio - POSIX asynchronous I/O overview DESCRIPTION The POSIX asynchronous I/O (AIO) interface allows applications to ini‐ tiate one or more I/O

cwdben的博客 2042

C#操作MySQL从入门到精通(1)——安装MySQL数据库

我们使用C#操作MySQL数据库第一步要做的就是安装MySQL数据库,本文就是详细讲解如何安装MySQL数据库。

qq_34059233的博客 963

硬核图解网络IO模型

前言文章会同步到个人网站,方便阅读:https://xiaoflyfish.cn/网站最近丰富了很多内容,都是满满的干货!微信搜索:月伴飞鱼,交个朋友,进面试交流群!公众号后台回复666,可以获得免费电子书籍!觉得不错,希望点赞,在看,转发支持一下,谢谢背景介绍在互联网的时代下,绝大部分数据都是通过网络来进行获取的。在服务端的架构中,绝大部分数据也是通过网络来进行交互的。而且作为服务端的开发工程师来说,都会进行一系列服务设计、开发以及能力开放,而服务能力开放也是需要通过网络来完成的,因此对网络编程以及网络I

小七 1265

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux五大网络IO模型图解

对于一个应用程序即一个操作系统进程来说,它既有内核空间(与其他进程共享),也有用户空间(进程私有),它们都是处于虚拟地址空间中。用户进程是无法访问内核空间的,它只能访问用户空间,通过用户空间去内核空间复制数据,然后进行处理。 阻塞io(同步io):   发起请求就一直等待,直到数据返回。好比你去商场试衣间,里面有人,那你就一直在门外等着。(全程阻塞)    非阻塞io(同步io):   ...

SYP35的专栏 454

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

图解网络IO模型:从阻塞到异步的完整指南

网络IO模型是高性能服务器开发的核心基础,理解不同IO模型的工作原理对构建高并发系统至关重要。从最基础的阻塞IO开始,到非阻塞IO的轮询机制,再到IO多路复用的select/poll/epoll实现,最终到异步IO的终极解决方案,每种模型都有其适用场景和性能特点。在实际工程中,epoll因其O(1)事件检测复杂度成为Linux下高并发的首选方案,而Windows的IOCP则提供了真正的异步IO支持。合理选择IO模型能显著提升系统吞吐量,例如某电商系统通过epoll优化将单机连接数从5k提升到80k。掌握这些

weixin_30086969的博客 233

VB摄像头监控

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

13张图 | 硬核图解网络 IO 模型

我们都知道在Linux的世界,一切皆文件。而文件就是一串二进制流,不管Socket、FIFO、管道还是终端,对我们来说,一切都是流。在信息的交换过程中,我们都是对这些流进行数据收发操作,简称为I/O操作。往流中读取数据,系统调用Read,写入数据,系统调用Write。磁盘IO:网络IO:操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能使用指针传递数据,因为Linux使用的虚拟内存机制,必须通过系统调用请求内核来完成IO动作。

IT_1024的博客 161

android socket io和服务器_5种网络IO模型(有图,很清楚)

复制粘贴自5种网络IO模型(有图,很清楚) - findumars - 博客园同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因...

weixin_32340879的博客 246

BIO、NIO、AIO、多路复用 IO 的区别

作者:扛麻袋的少年 blog.youkuaiyun.com/lzb348110175/article/details/98941378 学习之前,我们先来了解一下IO模型: ①同步阻塞IO(Blocking IO):即传统的IO模型。 ②同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。 ③多路复用IO(IO Multiplexing):即经典的Reactor设计模

qq_24692021的博客 145

四张图,读懂 BIO、NIO、AIO、多路复用 IO 的区别

点击上方☝码猿技术专栏轻松关注,设为星标!及时获取有趣有料的技术作者:扛麻袋的少年blog.youkuaiyun.com/lzb348110175/article/details/98941378学...

码猿技术专栏 286

Yolov5网络架构分析以及训练图解

Yolov5网络架构分析以及训练图解

w15136756855的博客 2136

四图,读懂 BIO、NIO、AIO、多路复用 IO 的区别

点击上方 "编程技术圈"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文Tough people aren't born that way, the...

程序员小乐 507

Java核心概念图解:从入门到精通

你是否曾经被Java的众多概念和术语搞得头晕脑胀?JDK、JRE、JVM、面向对象、多态、集合框架、多线程...这些术语就像一张复杂的网,让初学者望而生畏。本文将通过清晰的概念解释+ 生动比喻 + 实例代码的方式,为你梳理Java的核心概念,帮助你构建一个清晰的Java知识体系。无论你是初学者还是想查漏补缺的老手,这篇文章都能让你有所收获。通过本文,我们对Java的核心概念有了一个全景式的了解。打好基础:掌握Java语法、面向对象编程、异常处理深入核心API:集合框架、IO流、多线程编程探索高级特性。

m0_65382359的博客 1032

图解网络/系统/MySQL/Redis,这份开源学习路线帮你搞定面试八股文

本文提供了一份面向开发者的计算机基础知识高效学习路线,涵盖网络协议、操作系统、MySQL和Redis等核心模块。通过图解和实战案例,帮助开发者系统掌握面试必备的八股文知识,提升技术深度与实战能力,适合准备技术面试的求职者。

weixin_30920513的博客 289

3、四种IO模型

对IO模型进行了描述

AZhi 141

图解5种IO模型

5种IO 模型 同步阻塞、同步非阻塞、同步多路复用、异步阻塞(没有此情况)、异步非阻塞 当调用一次 channel.read 或 stream.read 后,会切换至操作系统内核态来完成真正数据读取,而读取又分为两个阶段,分别为: 等待数据阶段 复制数据阶段 阻塞 IO 当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的 第一个阶段:准备数据(对于网络IO来说,很多时候数据在一开始还没有到达。比如,还没有收到一个完整的UDP包。这个时候kernel就要等待足够的数据到

琦彦 8029
上一篇: 微服务体系架构浅谈
下一篇: Java后端开发&微服务面试题,有爱分享,祝顺利秋招
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值