缓冲区分析

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

C++ 从键盘、文件读入

会有一股神秘感。 提交于 2020-01-13 14:45:12
Background Info EOF是C语言中为了区分有效数据和输入结束符的。 EOF的输入由系统锁定,windows下是 ctrl+z ,linux/unix下是 ctrl+d . 在 C++ 中,输入输出流被定义为类。C++ 的I/O库中的类称为流类(stream class)。 用流类定义的对象称为流对象。   输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++ 形象地将此过程称为流(Stream)。C++的输入输出流是指由若干字节组成的宇节序列,这些宇节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存,在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。   实际上,在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。当用cout和插入运算符“<<”向显示器输出数据时,先将这些数据送到程序中的输出缓冲区保存,直到缓冲区满了或遇到endl,就将缓冲区中的全部数据送到显示器显示出来。在输入时,从键盘输入的数据先放在键盘的缓冲区中,当按回车键时,键盘缓冲区中的数据输入到程序中的输入缓冲区,形成cin流,然后用提取运算符“ >>”从输入缓冲区中提取数据送给程序中的有关变量

Oracle数据库的体系结构和用户管理

。_饼干妹妹 提交于 2020-01-08 07:44:38
一、Oracle体系结构 数据库的体系结构是指数据库的组成、工作过程、以及数据库中数据的组织与管理机制,要了解Oracle数据库的体系结构,必须理解Oracle系统的主要组件和重要概念。 1、Oracle体系结构概述 Oracle体系结构包含一系列组件,如下图所示,图中显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件和归档日志文件等。从图中可以看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的两个概念;DBA一个很重要的工作就是维护实例和数据库本身的正常工作。 1)实例 Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle实例启动时,将分配一个系统全局区(SGA)并启动一系列Oracle后台进程。Oracle实例有两种类型:单进程实例和多进程实例,单进程Oracle实例使用一个进程执行Oracle的全部操作,在单进程环境下的Oracle实例仅允许一个用户可存取;多进程Oracle实例(又称多用户Oracle)使用多个进程来执行Oracle的不同部分,对于每个连接的用户都有一个进程。 2)数据库 数据库是数据的集合,物理上指存储数据库信息的一组操作系统文件,每个数据库有一个逻辑结构和物理结构。物理结构是指构成数据库的一组操作系统文件,主要由三种类型文件组成

<转>C++输入cin详解

痞子三分冷 提交于 2019-12-25 15:50:15
输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入 #1: 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 char str[8]; 6 cin.getline(str, 5); 7 cout<<str<<endl; 8 cin.getline(str, 5); 9 cout<<str<<endl; 10 return 0; 11 } 测试: abcdefgh (回车) abcd (输出) (输出-换行) 【分析】之所以第一次输入完后直接程序就结束了,而不是进行第二次输入,是因为第一次多输入的数据还残留在缓存区中,第二次输入就直接从缓存区中提取而不会请求键盘输入,以下探讨几种常见的输入方式: 一 . cin>> 该操作符是根据后面变量的类型读取数据。 输入结束条件 :遇到Enter、Space、Tab键。 对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab) #2 : #include <iostream> using namespace

unix环境高级编程-标准IO

痴心易碎 提交于 2019-12-22 07:11:47
标准IO库: 不仅在unix上,在很多操作系统上都实现了标准的IO库,它处理了很多细节,例如缓冲区分配,优化长度执行IO等。 流和FILE对象: 对于标准的IO库,它们的操作是围绕流(stream)进行的。当用标准IO库打开或创建一个文件时,已经使一个流和一个文件相关联,标准的io文件流可用于单字节和多字节字符集,流的定向决定了所读。所写的字符是单字节还是多字节的,当一个流最初被创建,并没有定向,若在一个未定向的流上使用一个多字节IO函数,则将该流的定向设置为宽定向,若在未定向的流上使用单字节IO函数,则流定向为字节定向的。只有两个函数能够改变流的定向,freopen清除一个流的定向,fwide函数设置流的定向。 当打开一个流时,标准IO函数fopen返回一个指向FILE对象的指针,该对象通常是一个结构,包含了标准IO库为管理该流需要的所有信息,包括用于实际IO文件描述符、指向用于该缓冲区的指针、缓冲区的长度、当前在缓冲区的字符数等。 应用程序没有必要检验FILE对象,为了引用一个流,需将FILE指针作为参数传递给每个标准IO函数,称指向FILE对象的指针为文件指针。 标准输入,标准输出和标准出错: 对一个进程预定义了三个流,可以自动被进程使用,,这三个标准io流通过预定义文件指针stdin,stdout和stderr加以引用,这三个指针同样定义在头文件<stdio.h>中。 缓冲

服务器过载保护

﹥>﹥吖頭↗ 提交于 2019-12-19 17:10:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 服务器过载保护(上篇)——过载介绍 http://wetest.qq.com/lab/view/?id=69 1 何为过载 “ 过载 ” 一词,在海量服务的后台开发中,基本都会遇到。何为过载,即当前负载已经超过了系统的最大处理能力。例如,系统每秒能够处理的请求是 100 个,但实际每秒的请求量却是 1000 个,就可以判定系统出现了过载。 过载的定义看似简单,但却是处理过载问题的关键。对于任何其他问题,同样得抓住问题的本质,方可不偏离问题核心,万变而不离其宗。 2 过载后果 “ 过载 ” 的出现,会导致部分服务不可用,如果处置不当,极有可能引起服务完全不可用,乃至雪崩。 我们的系统中,由于是单线程状态机的处理模式,顺序处理所有链接的缓冲区消息,当出现处理能力的下降或者请求量大幅增加,导致处理能力小于请求量的情况下,消息就会在系统缓冲区中堆积,造成消息处理的延迟会持续增加,在正式环境中,链接数目较多,系统缓冲区较大,最终会导致消息处理延迟大到不可接受的程度,最终会导致处理的都是无效消息,造成服务不可用。 当然具体的业务需要具体的分析,把握住问题的影响,才能够做到一切尽在掌握,根据 “ 墨菲定律 ” ,通常对后果的判断不应过于乐观,谨慎行事、考虑充分才能够做到胸有成竹。 3 过载原因 “ 过载 ” 的出现

[常用类]StringBuffer 类,以及 StringBuilder 类

泄露秘密 提交于 2019-12-18 04:30:14
线程安全,可变的字符序列。 字符串缓冲区就像一个 String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。 字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。 StringBuffer的主要是 append 和 insert 方法,它们被重载以便接受任何类型的数据。 每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。 除非另有说明,否则将 null 参数传递给 null 中的构造函数或方法将导致抛出 NullPointerException 。 1 public StringBuffer() //构造一个没有字符的字符串缓冲区,初始容量为16个字符。 1 public StringBuffer(int capacity)构造一个没有字符的字符串缓冲区和指定的初始容量。 2 参数 3 capacity - 初始容量。 4 异常 5 NegativeArraySizeException - 如果 capacity参数小于 0 。 1 public StringBuffer(String str) /

Oracle体系结构和用户管理

隐身守侯 提交于 2019-12-14 05:54:23
博文结构 Oracle数据库体系结构 Oracle物理结构 Oracle逻辑结构 Oracle内存结构 Oracle进程结构 创建用户并授权 一.oracle体系结构概述 Orcale体系结构 Oracle体系结构包含一系列组件。 如图显示了Oracle体系结构中的主要组件,包括实例、用户进程、服务器进程、数据文件及其他文件,如参数文件、口令文件 和归档日志文件等. 从图中可以看出,实例和数据库是Oracle数据库体系结构的核心组成部分,也是最重要的 两个概念, DBA -个很重要的工作就是维护实例和数据库本身的正常工作。 1.实例 Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。Oracle 实 例启动时,将分配- -个系统全局区(SGA) 并启动一系列Oracle后台进程。Oracle 实例有两种类型: 单进程实例和多进程实例。单进程Oracle实例使用一个进程执行Oracle的全部操作,在单进程环境下 的Oracle实例仅允许- -个用户可存取。多进程Oracle实例(又称多用户Oracle)使用多个进程来执行 Oracle的不同部分,对于每个连接的用户都有一个进程。 2.数据库 数据库是数据的集合,物理上是指存储数据库信息的一组操作系统文件,每个数据库有-个逻 辑结构和一个物理结构。物理结构是指构成数据库的一组操作系统文件

Netty-源码分析ByteBuf-slice和retainedSlice使用细节

家住魔仙堡 提交于 2019-12-13 08:36:39
Netty-源码分析ByteBuf-slice和retainedSlice使用细节 slice() = slice(buf.readerIndex(), buf.readableBytes()) 源码片段,返回原始ByteBuf可读字节的一部分, 修改返回的缓冲区或此缓冲区的内容会影响彼此的内容,他们维护单独的index和makers,此方法不会修改原始缓冲区的readerIndex或writerIndex。 @Override public ByteBuf slice() { return slice(readerIndex, readableBytes()); } @Override public ByteBuf slice(int index, int length) { ensureAccessible(); return new UnpooledSlicedByteBuf(this, index, length); } boolean release0() { return unwrap().release(); } public static void main(String[] args) throws Exception { PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;

Buffer和Channel

那年仲夏 提交于 2019-12-13 06:40:19
    在细讲Buffer和Channel前,我们先对几个概念梳理一下。我们在做网络编程的时候时常听到三种东西:BIO,NIO,AIO。 BIO是java中普通的IO包,jdk1.4时出现了NIO,N表时New,所以其实就是新版的IO,jdk1.7时出现了AIO,也叫NIO2.0。那这三种IO有什么区别呢?IO是同步阻塞IO,NIO是同步非阻塞IO,AIO是异步非阻塞IO。这里有几个名词,同步和异步,阻塞和非阻塞,我们举个例子:     我们在烧水,当水还没开这一段时间里,我们有两种选择,站在旁边等水烧开或者先去做别的事(比如刷个剧),如果我们选择等水烧开,就是阻塞,如果我们先去刷个剧,等会儿再来看一眼水有没有烧开,就是非阻塞。但是你会觉得,看会儿剧又要回来瞅一眼水开没开是一件很烦的事情,要是水开了能够告诉我水开了就好了,比如现在的智能家居,你尽管去刷剧,等水开了通过app给弹个消息告诉你水开了,这就是异步非阻塞。     放到我们网络编程的场景下,现在有AB两个系统,B调A系统一个接口,如果该系统是一个耗时操作(像烧水那样), BIO 模式下,B系统的当前线程就会等在那里(等水烧开),而NIO模式下,B系统的这个线程就会先去做别的事情,等会儿回来看接口有没有返回,如果返回了继续处理,没返回再去做别的事情(就跟你看会儿剧去看一眼水开没有一样)。而在AIO模式下