编译原理-词法分析
编译器模型:
graph LR 源代码-->|词法分析器|词法单元 词法单元-->|语法分析器|语法分析树 语法分析树-->|中间代码生成器|中间代码 中间代码-->|代码优化,机器无关|中间代码 中间代码-->|代码生成器|目标代码 目标代码-->|机器相关代码优化|机器码 机器码-->output((机器码执行))
编译器模型:
graph LR 源代码-->|词法分析器|词法单元 词法单元-->|语法分析器|语法分析树 语法分析树-->|中间代码生成器|中间代码 中间代码-->|代码优化,机器无关|中间代码 中间代码-->|代码生成器|目标代码 目标代码-->|机器相关代码优化|机器码 机器码-->output((机器码执行))
MurmurHash 是一种非加密hash功能,适用于基于hash的一般查找。由Austin Appleby在2008年发明, 并出现了多个变种,目前托管在github。该名称来自两个基本操作,乘 multiply 和 旋转 rotate(该算法实际上使用shift和xor而不是rotate),用于其内循环。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。
Redis在实现字典时用到了两种不同的哈希算法,MurmurHash便是其中一种(另一种是djb),在Redis中应用十分广泛,包括数据库、集群、哈希键、阻塞操作等功能都用到了这个算法。该算法最新版本是MurmurHash3,基于MurmurHash2改进了一些小瑕疵,使得速度更快,实现了32位(低延时)、128位HashKey,尤其对大块的数据,具有较高的平衡性与低碰撞率。
很多 JVM CPU Profiler(例如VisualVM,NetBean Profiler,YourKit 和 JProfiler等)都提供了CPU分析器。一般CPU Profiling功能有两种实现方式: Sampling和Instrumentation。
Sampling由于低开销的特性,更适合用在CPU密集型的应用中,以及不可接受大量性能开销的线上服务中。而Instrumentation则更适合用在I/O密集的应用中、对性能开销不敏感以及确实需要精确统计的场景中。上面介绍的CPU Profiler更多的是基于Sampling来实现。
通道(Channel)在 JDK NIO 中引入[1]。如果要从I/O设备(例如,硬盘或 Socket)中读取数据,则需要通过通道将数据写入到缓冲区,然后再从缓冲区读取数据。
1 | //创建一个服务端socket通道用于接收连接 |
Java 传统 IO 是面向流的,流的处理是单向「只能从输入流中读取数据,或是向输出流中写入数据」且阻塞的。通常都是从输入流中边读取数据边处理数据,这样 IO 处理效率就会很低,基于上述原因,JDK1.4 引入了 NIO,而 NIO 是面向 Buffer 的,在处理 IO 操作的时候,会一次性将 Channel 中的数据读取到 Buffer 中然后在做后续处理,向 Channel 中写入数据也是一样,也是需要一个 Buffer 做中转,然后将 Buffer 中的数据批量写入 Channel 中。通过增加Buffer支持了数据的灵活处理。
除此之外,Nio Buffer 还提供了堆外的直接内存和内存映射相关的访问方式,来避免内存之间的来回拷贝,所以即使在传统 IO 中用到了 BufferedInputStream 也还是没办法和 Nio Buffer 相匹敌。本文将结合源码介绍 ByteBuffer[1]。
在之前介绍linux命令free时,有提到过docker中使用free命令获得的常常是宿主机的内存使用情况。那么怎么获取docker中内存的使用情况呢?
版本 2.0,2014 年 9 月 16 日发布
在不同领域中深耕的组织都在不约而同地尝试发现相似的软件构建模式。 希望这些系统会更健壮、更具回弹性 、更灵活,也能更好地满足现代化的需求。
近年来,应用程序的需求已经发生了戏剧性的更改,模式变化也随之而来。仅在几年前, 一个大型应用程序通常拥有数十台服务器、 秒级的响应时间、 数小时的维护时间以及GB级的数据。 而今,应用程序被部署到了形态各异的载体上, 从移动设备到运行着数以千计的多核心处理器的云端集群。 用户期望着毫秒级的响应时间,以及服务100%正常运行(随时可用)。 而数据则以PB计量。 昨日的软件架构已经根本无法满足今天的需求。
我们相信大家需要一套贯通整个系统的架构设计方案, 而设计中必需要关注的各个角度也已被理清, 我们需要系统具备以下特质:即时响应性(Responsive)、回弹性(Resilient)、弹性(Elastic)以及消息驱动(Message Driven)。 我们称这样的系统为反应式系统(Reactive System)。
在《UNIX网络编程》中介绍了5种I/O模型:阻塞I/O、非阻塞I/O、I/O复用、SIGIO、异步I/O; Unix的I/O模型,一个输入操作通常包括两个不同的阶段:
对于一个套接字的输入操作,第一步通常涉及等待数据从网络到达,当所等待分组到达时,被复制到内核的某个缓冲区;第二步把数据从内核缓冲区复制到应用进程缓冲区。
网络应用需要处理的无非就是两大类问题,网络IO,数据计算。相对于后者,网络IO的延迟,给应用带来的性能瓶颈大于后者。网络IO的模型大致有如下几种: