- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章没吃透Netty 缓冲区,还能算得上Java老司机?由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文转载自微信公众号「小明菜市场」,作者小明菜市场。转载本文请联系小明菜市场公众号.
前言 。
Java NIO 需要理解的主要有缓冲区,通道,选择器,这三个主要的部分.
基础 。
用户空间和内核空间 。
操作系统为了提供稳定性,把虚拟地址空间分为用户空间和内核空间,其中用户进程只能操作用户空间的内容,而内核空间的内容可以操作用户空间的内容以及用户空间的内容.
I/O过程中的数据流向 。
假设我们需要从磁盘中的某个文件读取数据,进程发起read系统调用,进入内核状态,内核会随即向磁盘控制硬件发出命令,要求其从磁盘读取数据,磁盘控制器把数据直接写入到内核缓冲区中,随后内核会吧数据从内核空间的临时缓冲区拷贝到用户缓冲区,进程再次切换回用户态继续执行。总结数据流向是:磁盘 -> 内核缓冲区 -> 用户缓冲区 。
内存空间多重映射 。
对于虚拟地址的空间,一个以上的虚拟地址可以指向同一个物理内存地址。如果用户空间的虚拟地址和内核空间的虚拟地址映射到同一个物理地址,那么这块物理地址代表的空间就对内核和用户进程都可见。便可省去数据在内核缓冲区和用户缓冲区来回复制的开销.
缓冲区 。
Java NIO 数据传输过程,数据先放到发送缓冲区 -> 通过通道发送到接收端 -> 接受端通道接受数据并填充到接受缓冲区 所以缓冲区的作用其实是连接通道作为数据传输的目标或者来源.
核心概念 。
属性 。
需要理解Buffer工作机制,需要了解如下几个属性 。
存取 。
缓冲区的核心就在于存取操作,buffer提供了相对位置存取和绝对位置存取两种方式.
代码如下 。
//相对位置存取 。
public abstract ByteBuffer put(byte b); 。
public abstract byte get(); 。
。
//绝对位置存取 。
public abstract ByteBuffer put(int index, byte b); 。
public abstract byte get(int index); 。
翻转 。
翻转是 buffer的核心概念,可以理解buffer有两种模式,写模式和读模式。写模式:我们分配一个缓冲区,然后直接填充数据,读模式下。我们从头开始读取数据。如何从写模式切换到读模式,翻转,翻转的时候我们用limit记录待读取数据的长度,然后把位置置换为0就可以开始读取数据了.
public final Buffer flip() { 。
//记录待读取数据的长度 。
limit = position; 。
//从头开始读取数据 。
position = 0; 。
mark = -1; 。
return this; 。
} 。
demo 。
//创建一个缓冲区 。
ByteBuffer buffer = ByteBuffer.allocate(100); 。
//写数据 。
for (char c : "hello".toCharArray()) { 。
buffer.put((byte) c); 。
} 。
//翻转 。
buffer.flip();//等价于 buffer.limit(buffer.position()).position(0); 。
//读数据 。
while (buffer.hasRemaining()) { 。
char c = (char) buffer.get(); 。
System.out.println(c); 。
} 。
直接缓冲区 。
对于一般的I/O过程,数据流向是,磁盘或者网络 -> 内核临时缓冲区 -> 用户空间缓冲区 。
直接缓冲区解决的是内核空间临时缓冲区到用户空间缓冲区复制这一步耗费的多余。虽然直接缓冲区是I/O的最佳选择,但是其比创建非直接缓冲区将会耗费更大的成本了,所以一般都是直接重复使用.
创建缓冲区 。
Buffer不能直接通过构造函数实例化,都是通过静态工厂方法创建,下为ByteBuffer的静态工厂方法.
//创建内存缓冲区 。
public static ByteBuffer allocate(int capacity); 。
//创建直接缓冲区 。
public static ByteBuffer allocateDirect(int capacity) ; 。
。
public static ByteBuffer wrap(byte[] array, int offset, int length) 。
原文地址:https://mp.weixin.qq.com/s/EP5H2uNT7NlA732UMclACg 。
最后此篇关于没吃透Netty 缓冲区,还能算得上Java老司机?的文章就讲到这里了,如果你想了解更多关于没吃透Netty 缓冲区,还能算得上Java老司机?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 Gunicorn 为 Django 应用程序提供服务,它工作正常,直到我将其超时时间从 30 秒更改为 900000 秒,我不得不这样做,因为我有一个用例需要上传和处理一个巨大的文件(过程
我有一个带有非常基本的管道的Jenkinsfile,它可以旋转docker容器: pipeline { agent { dockerfile { args '-u root' } } stag
在学习 MEAN 堆栈的过程中,我遇到了一个问题。每当我尝试使用 Passport 验证方法时,它都不会返回任何响应。我总是收到“localhost没有发送任何数据。ERR_EMPTY_RESPONS
在当今的大多数企业堆栈中,数据库是我们存储所有秘密的地方。它是安全屋,是待命室,也是用于存储可能非常私密或极具价值的物品的集散地。对于依赖它的数据库管理员、程序员和DevOps团队来说,保护它免受所
是否可以创建像图片上那样的边框?只需使用 css 边框属性。最终结果将是没 Angular 盒子。我不想添加额外的 html 元素。我只想为每个 li 元素添加 css 边框信息。 假设这是一个 ul
我是一名优秀的程序员,十分优秀!