bytebuffer

【转帖】从操作系统层面理解Linux下的网络IO模型

笑着哭i 提交于 2020-01-24 20:10:39
从操作系统层面理解Linux下的网络IO模型 https://segmentfault.com/a/1190000021587865 I/O( INPUT OUTPUT),包括文件I/O、网络I/O。 计算机世界里的速度鄙视: 内存读数据:纳秒级别。 千兆网卡读数据:微妙级别。1微秒=1000纳秒,网卡比内存慢了千倍。 磁盘读数据:毫秒级别。1毫秒=10万纳秒 ,硬盘比内存慢了10万倍。 CPU一个时钟周期1纳秒上下,内存算是比较接近CPU的,其他都等不起。 CPU 处理数据的速度远大于I/O准备数据的速度 。 任何编程语言都会遇到这种CPU处理速度和I/O速度不匹配的问题! 在网络编程中如何进行网络I/O优化:怎么高效地利用CPU进行网络数据处理??? 一、相关概念 从操作系统层面怎么理解网络I/O呢?计算机的世界有一套自己定义的概念。如果不明白这些概念,就无法真正明白技术的设计思路和本质。所以在我看来,这些概念是了解技术和计算机世界的基础。 1.1 同步与异步,阻塞与非阻塞 理解网络I/O避不开的话题:同步与异步,阻塞与非阻塞。 拿山治烧水举例来说,(山治的行为好比用户程序,烧水好比内核提供的系统调用),这两组概念翻译成大白话可以这么理解。 同步/异步关注的是水烧开之后需不需要我来处理。 阻塞/非阻塞关注的是在水烧开的这段时间是不是干了其他事。 1.1.1 同步阻塞 点火后

[Netty 1] 初识Netty

五迷三道 提交于 2020-01-24 17:56:26
1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由ZMQ转为Netty,所以决心好好来研究和学习一下netty这个框架。 Netty项目地址: http://netty.io/index.html Github项目: https://github.com/netty/netty Netty是一个异步的、事件驱动的网络应用框架,基于它能够快速开发高性能协议的服务器和客户端。Netty是基于NIO的,它大大简化了网络编程,Netty强调“quick and easy“,但并不仅限于”quick and easy“,它的实现是建立在吸取了许多协议(FTP、SMTP、HTTP等)的实现经验的基础之上的,经过作者精心的设计探索,成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。 2. 架构介绍 netty的架构图: 我们可以看到主要有三大部分组成:Core、Transport Services和Protocol Support。 2.1 Core Core封装了底层通信接口并提供了一个抽象的可扩展的事件模型。 2.1.1 Zero-Copy-Capable Rich Byte Buffer netty基于NIO,但是它并没有使用NIO的ByteBuffer,而是使用了自己定义的Buffer:

ByteBuffer getInt() question

大憨熊 提交于 2020-01-23 05:41:27
问题 We are using Java ByteBuffer for socket communication with a C++ server. We know Java is Big-endian and Socket communication is also Big-endian. So whenever the byte stream received and put into a ByteBuffer by Java, we call getInt() to get the value. No problem, no conversion. But if somehow we specifically set the ByteBuffer byte order to Little-endian (my co-worker actually did this), will the Java automatically convert the Big-endian into the Little-endian when the data is put into the

BIO、NIO、AIO 个人总结

柔情痞子 提交于 2020-01-22 20:54:47
BIO(blocking io) BIO即为阻塞IO,在网络编程中,它会在建立连接和等待连接的对端准备数据阶段进行阻塞。因此为了支撑高并发的用户访问,一般会为每一个socket 连接分配一个线程。但使用的瓶颈更加明显,无法支持上百万、甚至千万以上的并发。且线程切换带来的开销也更大。 代码示例: Server端 Server 端绑定 8082 端口 通过 accept() 方法 阻塞等待客户端建立连接 当与客户端建立一个 socket 连接通道之后,server 端口将新建一个线程进行 【读】 、【写】 ( ps: 这里的读是阻塞的,因为当server端发起读的请求时, 如果此时对端未准备好数据,那么将一直阻塞等待 。 直到:1. 对端通过 socket 发送数据2. 将数据从内核态 拷贝到用户态 ) try { // 绑定本地 8082 端口 ServerSocket server = new ServerSocket(8082); while (true) { //阻塞等待客户端 socket 建立连接 Socket accept = server.accept(); Thread t = new Thread(new Runnable() { @Override public void run() { // 一个线程处理一个socket 连接 BufferedReader

常见的六种OOM异常和错误

二次信任 提交于 2020-01-21 15:47:40
1、java.lang.StackOverflowError 报这个错误一般是由于方法深层次的调用,默认的线程栈空间大小一般与具体的硬件平台有关。栈内存为线程私有的空间,每个线程都会创建私有的栈内存。栈空间内存设置过大,创建线程数量较多时会出现栈内存溢出StackOverflowError。同时,栈内存也决定方法调用的深度,栈内存过小则会导致方法调用的深度较小,如递归调用的次数较少。 Demo: public class StackOverFlowErrorDemo { static int i = 0; public static void main(String[] args) { stackOverflowErrorTest(); } private static void stackOverflowErrorTest() { i++; System.out.println("这是第 "+i+" 次调用"); stackOverflowErrorTest(); } } //运行结果: 。。。。 这是第 6726 次调用 这是第 6727 次调用 Exception in thread "main" java.lang.StackOverflowError 。。。。 注意:这是一个Error!!!! 2、java.lang.OutOfMemoryError: Java heap

Mediacodec, decode byte packet from server and render it on surface

房东的猫 提交于 2020-01-21 10:20:30
问题 I have some issues with MediaCode. I have 3 components; Decoder, Downloader and Render. And Simple FragmentStreamVideo that initialize the 'SurfaceView' and the 'Downloader'. The other components like the Render and Decoder are initialized in the SurfaceView. Then, a syncronize is done between the Decoder and the Dowloader, implemented by BlockingQueue<String> queue where String = Filename ( Each frame has its file ). Another syncronize between Decode and Render is done by the standard

Buffer

放肆的年华 提交于 2020-01-20 11:01:33
Buffer的基本用法 使用Buffer读写数据一般遵循以下四个步骤: 写入数据到Buffer 调用flip()方法 从Buffer中读取数据 调用clear()方法或者compact()方法 当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。 一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。 下面是一个使用buffer的例子 @Test public void test3() throws IOException { SeekableByteChannel inChannel = Files.newByteChannel(Paths.get("D:\\scl\\20190820\\a.txt"), StandardOpenOption.READ); ByteBuffer buf = ByteBuffer.allocate(4); while (inChannel.read(buf) != -1) {

Scatter/Gather

我是研究僧i 提交于 2020-01-20 10:59:13
概述 Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。 分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。 聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。 scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。 1.Scattering Reads Scattering Reads是指数据从一个channel读取到多个buffer中。如下图描述: @Test public void test1() throws IOException { FileChannel inChannel = FileChannel.open(Paths.get("D:\\scl\\20190820\\a.txt"),

Netty之缓冲区ByteBuf解读(一)

[亡魂溺海] 提交于 2020-01-18 02:57:12
Netty 在数据传输过程中,会使用缓冲区设计来提高传输效率。虽然,Java 在 NIO 编程中已提供 ByteBuffer 类进行使用,但是在使用过程中,其编码方式相对来说不太友好,也存在一定的不足。所以高性能的 Netty 框架实现了一套更加强大,完善的 ByteBuf,其设计理念也是堪称一绝。 ByteBuffer 分析 在分析 ByteBuf 之前,先简单讲下 ByteBuffer 类的操作。便于更好理解 ByteBuf 。 ByteBuffer 的读写操作共用一个位置指针,读写过程通过以下代码案例分析: // 分配一个缓冲区,并指定大小 ByteBuffer buffer = ByteBuffer.allocate(100); // 设置当前最大缓存区大小限制 buffer.limit(15); System.out.println(String.format("allocate: pos=%s lim=%s cap=%s", buffer.position(), buffer.limit(), buffer.capacity())); String content = "ytao公众号"; // 向缓冲区写入数据 buffer.put(content.getBytes()); System.out.println(String.format("put: pos=%s

Java NIO

走远了吗. 提交于 2020-01-17 02:12:14
NIO:non-blocking input output NIO核心类 Channel 类似于Stream,但是是双向的 非阻塞性 操作唯一性,通过Buffer 文件类:FileChannel UDP类:DatagramChannel TCP类:ServerSocketChannel/SocketChannel 使用: //服务器通过Socket创建channel ServerSocketChannel serverSocketChannel = ServerSocketChannel . open ( ) ; //绑定端口 serverSocketChannel . bind ( new InetSocketAddress ( 8000 ) ) ; //监听客户端连接,建立socketChannel连接 SocketChannel socketChannel = serverSocketChannel . accept ( ) ; //客户端连接远成主机 SocketChannel socketChannel = SocketChannel . open ( new InetSocketAddress ( "127.0.0.1" , 8000 ) ) ; Buffer 作用:读写Channel中的数据 属性: Capacity Position Limit Mark 使用: /