Netty 00 | 原理概念——阻塞非阻塞、异步同步、Reactor

一文带你由浅入深Netty异步非阻塞世界 网络编程概念 两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个socket Socket是一个语言无标准,可以实现网络编程语言都有Socket 通过·IP+Port通信 BIO、NIO、AIO适用场景 BIO:连接数少且固定的框架 NIO: 连接数多且连接时间短 AIO(NIO.2): 连接数多且连接时间长 Java IO流程图 Socket连接步骤 服务器监听 客户端请求 连接确定 Tips:连接的时候三次握手,断开连接四次挥手 同步和异步(O 阅读详情

“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。

阻塞与非阻塞

阻塞和非阻塞关注的是
程序在等待调用结果(消息,返回值)时的状态。是否会阻塞当前线程。

  • 阻塞:
    调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
    eg : 应用程序在获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,知道传输完毕为止。
    int a = 1 +1;//此代码是阻塞的。

  • 非阻塞 :
    在不能立刻得到结果之前,该调用不会阻塞当前线程。

eg:
你打电话问书店老板有没有《分布式系统》这本书,
你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,
如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

链接:https://www.zhihu.com/question/19732473/answer/20851256

同步与异步:

第一种讲法:

同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)

所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。

而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

举个通俗的例子:你打电话问书店老板有没有《分布式系统》这本书,
如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。
而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

第二种讲法:

同步:
应用程序(代码)会直接参与IO读写操作,并且我们的应用程序会直接阻塞到某一个方法上,直到数据准备就绪;或者采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据。

异步:
则所有的IO读写操作交给操作系统处理,与我们的应用程序没有直接关系,我们的程序不需要关系IO读写,当操作系统完成IO读写操作时,会给我们应用程序发送通知,我们的应用程序直接拿走数据即可。

简而言之:
同步像同步方法,此方法直接返回结果。
异步像异步方法回调,等待异步 callback。

同步说的是server服务器的执行方式;
阻塞说的是具体的技术,接受数据方式、状态(IO、NIO)

同步 /异步描述的是执行IO操作的主体是谁,
同步是由用户进程自己去执行最终的IO操作。异步是用户进程自己不关系实际IO操作的过程,只需要由内核在IO完成后通知它既可,由内核进程来执行最终的IO操作。

第三种举例:

举例:
老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。

所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。——来源网络,作者不明。

同步异步、阻塞非阻塞

1.同步阻塞IO

最简单的IO模型,用户线程在读写时被阻塞

数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区

在这里插入图片描述
伪代码如下

{
    // read阻塞
    read(socket, buffer);
    // 处理buffer          
    process(buffer);
}

用户线程在IO过程中被阻塞,不能做任何事情,对CPU的资源利用率不高。

2. 同步非阻塞

用户线程不断发起IO请求. 数据未到达时系统返回一状态值; 数据到达后才真正读取数据

在这里插入图片描述

伪代码如下

{
    // read非阻塞   
    while(read(socket, buffer) != SUCCESS);
    process(buffer);
}

用户线程每次请求IO都可以立即返回,但是为了拿到数据,需不断轮询,无谓地消耗了大量的CPU
一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

3. IO多路复用

IO多路复用建立在内核提供的阻塞函数select上

用户先将需要进行IO操作的socket添加到select中,然后等待阻塞函数select返回。当数据到达后,socket被激活,select返回,用户线程就能接着发起read请求
在这里插入图片描述
伪代码如下:

复制代码

{
    // 注册
    select(socket);
    // 轮询
    while(true) {
        // 阻塞
        sockets = select();
        // 数据到达, 解除阻塞
        for(socket in sockets) {
            if(can_read(socket)) {
            // 数据已到达, 那么socket阻不阻塞无所谓
       read(socket, buffer);
            process(buffer);
            }
        }
    }
}

看起来和加了循环的同步阻塞IO差不多?

实际上, 我们可以给select注册多个socket, 然后不断调用select读取被激活的socket,实现在同一线程内同时处理多个IO请求的效果.

至此, 同步阻塞(阻塞在select) / 同步非阻塞(IO没有阻塞) {不知道该怎么称呼}完成

4.异步方式

更进一步, 我们把select轮询抽出来放在一个线程里, 用户线程向其注册相关socket或IO请求,等到数据到达时通知用户线程,则可以提高用户线程的CPU利用率.

这样, 便实现了异步方式

在这里插入图片描述

这其实是 Reactor 设计模式, 如下图, Reactor 详解

在这里插入图片描述

EventHandler抽象类表示IO事件处理器
get_handle方法获得文件句柄Handle
handle_event方法实现对Handle的操作
可继承EventHandler对事件处理器的行为进行定制

Reactor类管理EventHandler的注册、删除. handle_events方法实现了事件循环, 其不断调用阻塞函数select, 只要某个文件句柄被激活(可读/写等),select就从阻塞中返回, handle_events接着调用与文件句柄关联的事件处理器的handle_event进行相关操作。handler_events的伪代码如下

Reactor::handle_events() {
    while(true) {
        sockets = select();
        for(socket in sockets) {
            get_event_handler(socket).handle_event();
        }
    }
}

作为功能调用者需要实现的伪代码如下

// 继承EventHandler并重写handle_event()方法
void UserEventHandler::handle_event() {
    if(can_read(socket)) {
    // 数据已到达, 那么socket阻不阻塞无所谓
    read(socket, buffer);
    process(buffer);
    }
}
// 注册实现的EventHandler子类
{
    Reactor.register(new UserEventHandler(socket));
}

IO多路复用是最常使用的IO模型,因其轮询select的线程会被阻塞, 异步程度还不够“彻底”, 所以常被称为异步阻塞IO

5.异步IO

真正的异步IO需要操作系统更强的支持。
IO多路复用模型中,数据到达内核后通知用户线程,用户线程负责从内核空间拷贝数据;
而在异步IO模型中,当用户线程收到通知时,数据已经被操作系统从内核拷贝到用户指定的缓冲区内,用户线程直接使用即可。
在这里插入图片描述
异步IO模型使用了Proactor设计模式实现了这一机制。
在这里插入图片描述
Reactor模式中,用户线程向Reactor对象注册事件对应的事件处理器,然后事件触发时Reactor调用事件处理函数。
Proactor模式中,用户线程将AsynchronousOperation(读/写等)、Proactor以及操作完成时的CompletionHandler注册到AsynchronousOperationProcessor。
AsynchronousOperationProcessor使用Facade模式提供了一组异步API(读/写等)供用户调用. 当用户线程调用异步API后,便继续执行下一步代码. 而此时AsynchronousOperationProcessor会开启独立的内核线程执行异步操作。
当read请求的数据到达时,由内核负责读取socket中的数据,并写入用户指定的缓冲区中。
异步IO完成时,AsynchronousOperationProcessor将Proactor和CompletionHandler取出,并将IO操作结果和CompletionHandler分发给Proactor,Proactor通知用户线程(即回调先前注册的事件完成处理类的函数handle_event)。
Proactor一般被实现为单例,以便于集中分发操作完成事件。

伪代码如下

// 继承CompletionHandler, buffer为用户线程指定的缓冲区
void UserCompletionHandler::handle_event(buffer) {
    process(buffer);
}

// 调用异步的read函数
{
    aio_read(socket, new UserCompletionHandler);
}

相比于IO多路复用,异步IO并不常用,因为目前操作系统对异步IO的支持并不完善,IO多路复用也基本够用. 有很多做法是用IO多路复用模型模拟异步IO(IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)。
JDK7已经支持了AIO, netty采用过又放弃了, 据说是性能提升有限相比多路复用。


非阻塞 同步IO
指的是用户调用读写方法是不阻塞的,立刻返回的,而且需要用户线程来检查IO状态。需要注意的是,如果发现有可以操作的IO,那么实际用户进程还是会阻塞等待内核复制数据到用户进程,它与同步阻塞IO的区别是后者全程等待。
非阻塞 异步IO
的是用户调用读写方法是不阻塞的,立刻返回,而且用户不需要关注读写,只需要提供回调操作,内核线程在完成读写后回调用户提供的callback。

这两个概念的不同造成了编程模型的不同。

非阻塞同步IO

非阻塞:无需等待。
同步 IO:自己是操作 IO 的主体,立即返回结果。
由于读写方法非阻塞,并且需要用户自己来进行读写,所以每次调用读写方法实际读写的字节数是不确定的,所以需要一个Buffer来保存每次读写的字节状态。更重要的是用户不知道什么时候完成了读写,一般需要用while循环判断Buffer的状态来跟踪读写。

非阻塞异步IO

非阻塞:无需等待 。
异步:等待 callback
由于是内核线程进行读写,并且在IO完成后会回调用户提供的callback,编程模型就比较简单,用户只需要调用读写,提供回调就可以了,比如 read(filename, callback)

select / poll / epoll 从本质上说都是非阻塞同步IO,select会收到IO就绪的状态,然后通知用户去处理IO,实际的IO操作还需要用户等待内核复制操作。

要理解IO就绪和完成的区别。就绪指的是还需要用户自己去处理,完成指的是内核帮助完成了,用户不用关心IO过程,只需要提供回调函数。

理解了非阻塞同步IO和非阻塞异步IO的区别之后,就不难理解Java NIO的设计了。NIO是围绕ByteBuffer来进行读写的,ByteBuffer是一个缓冲区,用来记录读写的状态,通过多次检查ByteBuffer的状态来确定IO是否完成。

IO为同步阻塞形式,
NIO为同步非阻塞形式、NIO并没有实现异步,
在JDK1.7之后,升级了NIO库包,支持异步阻塞通信模型即NIO2.0(AIO),编程模型大大简化了。用户只需要关注回调函数即可。


缓冲区 Buffer

在NIO 中,所有的数据都是用缓冲区处理的。

缓冲区实质是数组。通常为字节数组 (ByteBuffer)。
在这里插入图片描述
在这里插入图片描述

通道 Channel

  • Channel 是一个通道。
    网络数据通过 Channel 读取和写入。
    流只能单向,读写eg: InputStream or OutputStream,
    但是 Channel 可以用于读、写或者二者同时进行。
    Channel 是全双工的,所以更好映射底层系统的 API
    UNIX 网络编程模型中,底层操作系统的通道都是全双工的。同时读写。
    在这里插入图片描述

多路复用器 Selector

多路复用器提供选择已经就绪的任务的能力。
简单讲:
Selector 会不断轮询注册在其上的 Channel ,如果某个 Channel 上面发生读写时间,这个 Channel 就处于就绪状态,会被 Selector 轮询出来,然后通过 SelectionKey 可以获取就绪的 Channel 的集合,进行后续的 I/O 操作。
一个 Selector 可以同时轮序多个 Channel ,
JDK 使用 epoll() 代替传统的 selector 实现,所以没有最大连接句柄 1024/2048 限制。

NIO 服务端序列图

在这里插入图片描述

NIO 客户端序列图

在这里插入图片描述

NIO 优点:

  1. 客户端发起的连接操作是异步的。
    可以通过在多路复用器注册 OP_Connect 等待后续结果,不需要要像之前的客户端那样同步阻塞。
  2. SocketChannel 的读写操作都是异步的,
    如果没有可读写的数据它不会同步等待,直接返回。
    这样 I/O 通信线程就可以处理其他的链路,而不需要同步等待这个链路可用。
  3. 线程模型的优化
    JDK Selector 通过 epoll 实现,没有了链接句柄数的限制。

AIO

NIO 2.0 引入了新的异步通道概念,并提供了异步文件通道和异步套接字通道的实现。
在异步 I/O 操作的时候可以传递信号变量,当操作完成之后会回调相关的方法。

I/O 模型对比

按业务需求,设计。
在这里插入图片描述

参考内容:

  1. 《Netty 2》 李林峰著作
  2. https://blog.youkuaiyun.com/z15732621582/article/details/78939122?foxhandler=RssReadRenderProcessHandler
  3. https://www.cnblogs.com/myJavaEE/p/6721127.html
  4. https://www.zhihu.com/question/19732473?sort=created
  5. https://www.cnblogs.com/doit8791/p/7461479.html

遗留问题:

Proactor 与 Facade模式

武汉理工大学 python实验三 请编一个程序,用户在同一行内输入两个整数,代表头和脚的数量,编程计算笼中各有多少只鸡和兔(假设鸡和兔都正常,无残疾),如无解则输出`“Data Error!题目为:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?年前,《孙子算经》中记载一个有趣的问题:今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?有一座八层宝塔,每一层都有一些琉璃灯,每一层的灯数都是上一层的二倍,已知共有。编写一个宝塔上的琉璃灯的小程序,计算并输出每层各有多少盏琉璃灯。,如果有多个解,则分行输出,每行一个解; 阅读详情

相关推荐

类银河恶魔城学习记录1-1 Player状态机的搭建 P28

什么是状态机?一篇文章就够了 - 知乎说实话,目前并不能深入理解状态机的奇妙之处(当然,我觉得状态机作为教程的重要组成部分是不得不理解的,所以以下我会对游戏教程内的状态机做一些我认为的解释,如有错误,请多包涵)

Homura_的博客 2338

Netty之网络编程阻塞篇

Netty网络编程阻塞如何解决

DrLai的博客 1562

[LVGL] 刷新率优化

实验硬件:STM32F407ZGT6;2.4寸TFT-LCD模块(ILI9341驱动芯片、XTP2046触摸芯片)本文目标:lvgl的刷新率优化,解决拉帘子问题注意:本文在LVGL显示触摸代码移植完成的基础上进行,第一次使用lvgl可根据前文一步步移植,点击下方传送门查看相关文章传送门:STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(一)STM32F4驱动ILI9341的TFT-LCD触摸屏(HAL库)(二)[LVGL] 显示代码移植 基于STM32F4。

2301_77117901的博客 2784

这可能是目前最透彻的Netty原理架构解析

“本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。JDK 原生 NIO 程序的问题JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下:NIO 的类库和 API 繁杂,使用麻烦。你...

weixin_34319111的博客 2415

基于STM32设计的指针式电子钟与万年历(升级版)

这是基于STM32设计的一个指针式电子钟+万年历小项目,采用3.5寸的LCD屏显示时钟,日历、温度、天气,支持触摸屏调整设置时间,设置闹钟,查看日历等等。整体项目主要是技术点就是LCD屏的图形绘制。比如: 时钟的时针绘制、分针、秒针、表盘、日历绘制等等。

1万+

026:vue+threeJS 设置地面铺砖的效果

BoxGeometry 是 Three.js 中用于创建立方体或长方体的几何体类。它允许你指定立方体的宽度、高度、深度以及这三个方向上的分段数,从而控制立方体的细分程度。width: 立方体的宽度(沿 x 轴方向)。height: 立方体的高度(沿 y 轴方向)。depth: 立方体的深度(沿 z 轴方向)。widthSegments: 可选参数,指定立方体在 x 轴方向上的分段数,默认值为 1。heightSegments: 可选参数,指定立方体在 y 轴方向上的分段数,默认值为 1。

大剑师兰特的GIS世界 645

Netty阻塞模式和非阻塞模式介绍、应用场景

netty 是一个高性能的网络编程框架,支持阻塞和非阻塞模式,具体取决于它所使用的 I/O 模型。

a_beiyo的博客 831

HyperLynx中层叠设计实例

这两种方式有点区别,前一种方式只是增加层,需要自行修改层的类型,后一种方式可以选定为某一种类型,如果是增加信号层,软件会默认同时增加一层介质层。层叠已经有8层,按照示例的层叠有4个信号层、3个地平面层和1个电源平面层,对照进行层名称(LayerName)、介质类型(Type)及用途(Usage)设置。在这列中,有的是白色,有的是淡蓝色。白色的说明可以修改,如第一行是介质,通常在最外层的介质有两个用途,阻焊层和介质,单击该行会出现一个下拉菜单,选择SolderMask,即为阻焊层。...

小幽余生不加糖 5874

Netty入门(五) Netty原理之Reactor模式

Reactor模式又称为反应器模式,是一种处理同步IO通信的设计模式,应用于同步IO场景,基于事件驱动。传统的IO操作会为每一个连接或请求建立一个单独的线程然后执行IO操作阻塞在那里,这样非常的浪费资源和效率。Reactor设计模式能够避免为每个消息,请求,连接创建一个线程的问题,它采用事件驱动,将业务处理器感兴趣的事件注册到分发器上,只有当相应事件发生时,分发器才会通知相应的处理器处理发生的事务--“Wewlill call you”

这里是阿安的博客 1196

【入坑存内计算一键指南】存内计算运算原理:算法优化、存储介质探究

本文探讨了存内计算及其面向的架构优化,尤其侧重于图算法优化和存内计算存储介质。文章介绍了存内计算的概念和意义,着重强调了存内计算解决了内存墙问题,提高了计算效率。针对图算法的优化,提出了基于位运算的创新方法,重塑了单源最短路径算法,并介绍了基于局部重叠度的链路预测算法优化设计。接着,文章详细讨论了存内计算存储介质,特别是非易失性存储器,比较了不同类型存储器的性能,并重点介绍了基于ReRAM的存内计算技术,包括其物理模型和交叉阵列结构。

一键难忘的博客 7065

自顶向下与自底向上编程思想的对比

一、核心定义与本质差异自顶向下编程思想如同绘制一幅完整的地图,从整体轮廓逐步细化到局部细节。其本质是从系统的整体目标出发,通过逐层分解将复杂问题简化为可实现的子问题,强调先定义 “做什么”,再考虑 “如何做”。自底向上编程思想则类似于搭建积木,从基础组件开始逐步构建复杂系统。其本质是从现有资源和基础功能出发,通过组合和扩展简单组件来实现复杂功能,强调先解决 “如何做” 的细节,再整合为 “做什么” 的整体。二、设计起点与逻辑流程对比设计起点:以系统的整体目标和业务需求为起点。例如设计一个电商平台,首先明确

二进制君 830

【网络编程】Netty采用的NIO为什么是同步非阻塞的?

参考链接:https://www.leahy.club/archives/netty-nio-sync-nonblocking 这个问题可以分为两部分:NIO为什么是同步非阻塞的?Netty是如何实现NIO的? 那么首先需要回答是什么是同步/异步,什么是阻塞/非阻塞? 同步/异步和阻塞/非阻塞描述的都是IO操作。 同步和异步: 从操作系统角度来说,网络IO的数据拷贝主要分为两个阶段,一是数据准备阶段,二是数据从内核拷贝到用户中。 同步IO指的是数据从内核拷贝到用户时。发起该请求的线程会自己来拷贝数据(表现为

weixin_41954254的博客 5101

SXU—软件测试方法和技术-朱少民-第四部分 软件测试流程和规范-附考点

软件测试方法和技术-朱少民-第四章 软件测试流程和规范—这本书最后一部分的考点整理,考点分析

weixin_63597914的博客 1752

BIO/NIO/AIO是什么?同步非阻塞如何理解?多路复用到底是个啥?

哈吉米:“多路复用到底是啥?南北绿豆:“用老王钓鱼来理解!

比较是偷走幸福的小偷 4138

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Netty异步非阻塞事件驱动及原理详解

本文基于 Netty 4.1 展开介绍相关理论模型、使用场景、基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。 Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 一、JDK 原生 NIO 程序的问题 JDK 原生也有一套网络应用程序 API,但是存在一系列问题,主要如下: ...

一个有情怀的程序猿博客 3312

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【基础】Netty 的基础概念及使用

整理总结了 Netty 框架的基本原理以及基本的使用

情绪瓜皮皮丶的学习之路 1663

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

异步、同步、阻塞和非阻塞的一些概念

1、IO IO就是指输入和输出,最常见的一些IO有网络IO(也就是socket IO),文件读写和键盘输入、屏幕输出,IO就涉及到操作系统用户态和内核态的切换。 简单来说就是CPU的权限变了,当CPU在用户态,应用程序对硬盘的文件等没有读写权限,当CPU在内核态,CPU就有了这些权限,所以说,应用程序中的读写文件操作是由操作系统在内核态下调用系统函数完成的,操作系统读写成功之后就会把结果返回给应用程序,这又涉及到用户态内存空间数据和内核态内存空间数据拷贝的问题。 内核态用户态可以看下面这篇文章: http

giveyoualetter的博客 324

Netty知识储备:BIO、NIO、Reactor模型

首先阐述了阻塞/非阻塞、同步/异步的区别,以及Java BIO与NIO的对比:BIO采用同步阻塞模式,线程在I/O操作时会完全阻塞;NIO则通过Channel、Buffer和Selector实现非阻塞I/O。重点分析了两种通信模型:BIO的Acceptor线程模型通过主线程接收连接、工作线程处理I/O;NIO的Reactor模型利用多路复用技术实现单线程监听多连接。详细解析了select和epoll的底层实现机制,并介绍了单线程和多线程Reactor的工作流程。

qq_14886109的博客 819

java处理异步非阻塞请求_Spring WebFlux 的异步非阻塞处理

前言随着 Web Servlet 技术栈的不断发展实现了异步处理与非阻塞 IO,但是其异步是不彻底的,因为受制于 Servlet 规范本身,比如其规范是同步的(Filter,Servlet)或阻塞(getParameter,getPart)。所以新的使用少量线程和较少的硬件资源来处理并发的非阻塞 Web 技术栈应运而生- WebFlux,其是与 Servlet 技术栈并行存在的一种新的技术,其基于...

weixin_34805367的博客 1032

Netty异步非阻塞事件驱动及组件原理详解

本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目方面提供参考。 Netty ...

菜鸟日记 1456

提升你的Netty服务器性能:零拷贝与Reactor模型精讲

内存池技术允许系统重复使用一块预先分配的内存空间,避免了频繁的内存申请和回收,这样可以显著降低因内存分配导致的性能瓶颈。Netty通过PooledByteBufAllocator实现了内存池,可以减少GC压力,增强系统稳定性。Netty支持多种序列化协议,其中包括自定义的编解码器等。选择或者实现一个高效的序列化框架,意味着要在保留数据结构丰富性的同时,最大程度地减少序列化数据的大小以及序列化与反序列化的时间。

逆流的小鱼 1350

从BIO到NIO到Netty,从阻塞IO到Reactor模型深度剖析Netty核心原理(干货)

很想写一篇关于Netty的剖析,但是只写Netty有些童鞋可能会一脸懵,这篇文章从浅入深,从BIO到NIO讲了个透彻,最后再讲到Netty底层原理,期间也是翻阅资料,也算是自己对相关知识的总结和复习吧~~ 1、什么是I/O模型?什么是BIO NIO AIO?三者有什么区别? 2、AIO性能更好,为什么Netty不使用AIO? 3、Redis、Nginx等为什么这么快? 4、Netty相比NIO有何优势?底层如何实现? 这些问题希望看完这篇文章之后都能找到答案~~ 目录 一、I/O模型 1..

Harrison 844

阻塞IO、非阻塞IO、同步IO、异步IO && Reactor模式

http://www.ivaneye.com/2016/07/23/iomodel.html 对于IO来说,我们听得比较多的是: BIO:阻塞IONIO:非阻塞IO同步IO异步IO 以及其组合: 同步阻塞IO同步非阻塞IO异步阻塞IO异步非阻塞IO 那么什么是阻塞IO、非阻塞IO、同步IO、异步IO呢? 一个IO操作其实分成了两个步骤:发起IO请求(阻塞)

sidihuo的专栏 1640

Java并发请求处理的终极方案:Reactor模式+异步非阻塞全实战

掌握高性能Java并发请求处理方案,轻松应对高并发场景。结合Reactor模式与异步非阻塞IO,提升系统吞吐量与响应速度,适用于网关、微服务等高负载应用。原理详解+实战代码演示,值得收藏。

ProceSeed的博客 929

走近科学之《netty 的秘密》

IO 相关概念、五种 IO 模型、BIO NIO AIO 特点及区别、NIO 设计原理及核心组件、netty 简介及应用场景、netty 线程模型(Reactor 线程模型)、netty 设计原理及核心组件、netty 常用技巧实现(心跳机制、长连接、tcp 粘包/拆包、大文件传输、SSL/TLS 加密传输等)、相关代码示例。

后端为主,前端为辅。 1536

NIO同步阻塞和非同步阻塞---过度到netty(一个异步事件驱动的网络应用程序框架)

BIO与NIO IO为同步阻塞形式,NIO为同步非阻塞形式,NIO并没有实现异步,在JDK1.7后升级NIO库包,支持异步非阻塞 同学模型NIO2.0(AIO) BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO:同步非阻塞式IO,服务器实现模式为一个...

HMing的博客 556
上一篇: git 03 | svn 转 git and 修改 git commit 邮箱
下一篇: Reactor 模式
阿杰、
博客等级 码龄11年 13粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值