11 NeroJings

尚未进行身份认证

我要认证

一切不过是思想的产物!

等级
TA的排名 3k+

用户态和内核态的切换

用户态和内核态的切换我们经常说,一个程序依赖DMA设备来减少用户态和内核态的切换次数,以此来提升性能。那么对于它的细节是如何进行的呢?本篇,博主与你一起研究一下用户态和内核态的划分,以及这件事情的前因后果。用户空间和内核空间对于32位的操作系统而言,它的寻址空间最大为4g(2的32次方),换言之一个系统进程最大可运行的内存地址空间为4个G,操作系统核心空间占用1g,其他3g则给予用户空间使用。针对Linux操作系统而言,最高的1G字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF),由

2020-07-28 17:21:27

聊聊DMA协处理器,IO设备的搬运工

DMA(Direct Memory Access 直接存储器访问) 是近些年电脑主机的重要组成部分,它主要用来建立不同硬件之间的数据传输沟通,从而使得数据IO不再引起cpu的大量中段负载。以此,提高CPU的利用率,使得程序的运算更快,而不用阻塞在io等待上,总结起来,DMA解放了CPU的搬运数据的工作,从而使得CPU更加专注于计算任务,从而提高机器的计算效率本质上讲,DMA就是我们在主板上的一块独立的芯片。在进行内存和IO设备通信的时候,我们可以直接通过DMA芯片来通信,而不再需要CPU来搬运数据。D

2020-07-21 17:53:53

反射调用为什么慢?细推反射细节!

写在前面​ Java的反射在日常开发中还是经常用到的技术点,这包括spring的Ioc,包括一些除cglib之外的bean copy(cglib采用asm动态生成字节码来实现),然而在spring的ioc中,我们或许无法感知到,这是因为大部分类实例都是单例,只在容器启动的时候加载一次,并在容器内缓存它的实例。但是在业务code中的beancopy则不然。你会发现请求量大的情况下,很多线程栈都会...

2019-08-09 12:38:57

死磕cglib系列之二 AbstractClassGenerator缓存解析

AbstractClassGenerator简介通过上一篇文章对Enhancer类的使用,我们大致对cglib的proxy功能有了一个基本了解,本篇从Enhancer类的父类AbstractClassGenerator源码入手,试着剖析一下作者在写cglib框架时候可能的思想。仔细阅读源码就发现该类作为父类,被很多的类继承,比如Enhancer、BeanCopier内部类、KeyFactory内...

2019-02-20 11:20:16

死磕cglib系列之一 cglib简介与callback解析

简介cglib是一套java动态代理实现框架,cglib被应用到spring app,hibernate等高级业务框架,spring事务在业务实现类未实现接口的情况下也会使用该技术。实际上,cglib基于继承实现,这也就意味着final,private相关的method无法被代理。基于asm框架对class字节码编辑改动,从而达到动态代理的目的,总之,被代理类没有实现接口的情况下cglib为首...

2019-02-14 17:47:15

电商-扣减库存的思想碰撞 [redis的eval函数与胶水语言lua的结合]

背景我们大家都知道,在一个电商系统里面,库存是一个很敏感的系统组成部分。这是因为在这一点上,我们的程序执行模型必须在一个点上做出改变,那便是从并行执行模型到串行执行模型的切换。因我们的某一个商品的库存资源可以认为是有且只有一个的,不管前面的执行过程有多少个线程,多少个用户,在实际扣减或回滚的时候,我们期望它是原子的,内存可见的,有序的执行顺序。实现案例结构图可能的复杂逻辑...

2018-12-08 09:52:36

千万级数据清洗案例总结 [mysql with mycat -> Elasticsearch]

背景最近工作较忙,没有时间打理博客,赶工,加班,黑白颠倒,失眠之余,写一写前阵子遇到的数据清洗案例。1000多万数据的清洗工作,从Mysql清洗到Es里面,起初的规划是用limit查询分片数据,然后逐一批次插入到es内部。然而,想法和实际操作完全两码事,细节性知识重要性尤其凸显 我们的目的性能瓶颈 可能出现的性能瓶颈从上图来看,我们粗略的可以这样划分我们的程序可能出现的...

2018-12-08 00:49:32

初识多线程

写在前面的话不可否认,对于大多数程序员在其职业生涯中很少遇到多线程的编程案例,即便遇到,也是自己感知不到的应用场景。诸如线程池,数据库连接池。亦或者通过新建线程来分担可延迟的业务处理来提高用户端响应效率,类似消息队列的角色。但是以上应用到多线程的领域,我们无法感知到多线程执行中的特点。如线程间通信,上下文切换,资源争抢,锁的互斥。以及三大特性:“可见行,原子性,有序性”。但是Java的多线...

2018-10-10 22:59:08

数据结构[二] 红黑树详解 内附Java实现

简介&我的理解R-B Tree 红黑树简介-3个特性红黑树是二叉查找树的一种,与AVL平衡二叉树相差不大,也是左小右大的数据存储结构,重点在于查找数据,同样是O(height)的时间复杂度。相对于AVL树的靠高度平衡,红黑树是靠颜色平衡的,而为了维持接下来的几个特性,使得它在插入或者删除操作以后必须进行旋转和重新着色才可以保持红黑树特质.它主要有以下几种特性(虽然太过形式化,我...

2018-09-19 14:22:13

数据结构[一] 平衡二叉树 AVL树结构详解 [Java实现]

博客思维导图简述 先不说平衡二叉树,我们单开来说,这样比较方便理解。 先说二叉树,再说平衡条件,没那么多花里胡哨的理论,我只是想让大家看完能明白,能写出来 二叉树 什么是二叉树?二叉树数据结构,顾名思义,只有两个叉,在数据结构中,操作性能要远高于线性结构,有O(height)的索引性能。与线性结构有相同的空间复杂度,特性如下: 每个节...

2018-09-14 11:02:48

Nginx负载均衡的5种方式

声明Nginx共支持5种负载方式,以此来实现相关的请求流量分派。通过在不同机器上计算。最终结果返回用户。值得一提的是,以下负载方式,没有经过博主验证过,在实际使用使用待调试。有什么错误发现,还望提醒!!!图解理解轮询分派upstream loop{ server 127.0.0.1:8080 server 127.0.0.1:7080 se...

2018-09-10 11:13:04

Nginx Location Uri匹配详解

写在前面的话:老规矩,先啰嗦几句,输出一下情绪,很久没有深夜写博文了,做了技术就是这样,深度和广度,都需要你兼具,相信很多从业者学东西之前都先问自己一个问题,学这个有没有用?浪费时间吗?说实话,我也是这个问题问过自己很多次。研究Nginx之前,也定位过自己,Java研发,会配置简单的Nginx,会用。ctrl+c ctrl+v能解决很多问题,但是出了问题还是自己解决不了。很多小伙伴会说...

2018-09-09 01:39:27

Nginx配置详解

啰嗦几句在Apache服务器上,一个服务器进程在同一时刻只能处理一个网络请求,如果希望apache能够承受更多的并发,那么要启动更多的服务器进程,这使得服务器之间的进程来回切换频繁,耗费过多的系统资源Nginx模型:一个master进程多个worker进程,master进程只负责管理worker进程,而不负责网络请求 worker进程数最好与当前机器的CPU核心数相同,这样使得每一个wo...

2018-09-07 19:00:39

Nginx简介与安装

支持模块安装GCC(GNU Compiler Collection)可用来编译C语言程序,Nginx不会直接提供二进制可执行程序,GCC是必须的编译工具如果遇到C++编写的Nginx模块,则必须安装gcc-c++编译器的支持yum -y install gccPCRE(Perl Compatible Regular Expressions) Perl兼容正则表达式,该库是Nginx正...

2018-09-06 19:18:39

class字节码文件

写在前面的话 class文件结构可以说是一套规范,不一定是Java编译器编译出来的版本,它用来描述一个文件中对应的字段,类,常量池,继承关系等等。值得一提的是这个文件是完全紧凑型的。从第一个字节到最后一个字节,表达的意思按照约定好的严格规范。由于这种字节码可以运行在jvm上实现跨平台的亮点。所以不只是Java语言编译器可以编译成这种文件。class文件是学习jvm中比较重要的一环。我尽量用...

2018-05-18 12:20:42

Java加载类过程

类加载过程图解:简介:以上这张图是博主经过阅读周志明的深入理解Java虚拟机一书,并在网上看了若干帖子之后画出来的,我争取用一句话来 描述每个阶段都做了什么,因为每个阶段做的事情实在有一些多,而我们做为开发者也着实想理解的深入一些,所以,我 接下来用一些文案描述,究竟每个步骤发生了什么, 但是,首先澄清一点。基于博主的理解有限,加上主观判定有可能错误。所以欢迎大家指正。一起学...

2018-05-16 17:20:31

SnowFlake算法推演

简介:snowflake算法目的是为了生成分布式系统唯一ID而产生的,这种算法,可以保持69年使用,高并发情况下1MS可以生成4096个不同的ID,那么为什么呢?如何做到的呢?为什么是69年?首先69年运算可以用2的41次方推算出来时间戳,然后看一下这个时间的量,也就是从1970年开始的偏移量正好是69年,如果想要更长的时长,只需要加长时间戳的位数即可。为什么是40...

2018-05-11 16:33:56

位运算案例

概述:在二进制计算中,最常见的就是位运算了。而位运算也经常出现在各位大神的源码当中,在研读了snowflake算法以后。决定自发的研究一些位运算,以应用到实际程序中。欢迎大家在评论区追加运算的应用场景,或者算法中实际应用到的位运算本篇持续更新!!基本运算,定死一个值为MAX(8位DEMO):最大值: 1111 1111 最小值 0000 0000设X = MAX , Y &l...

2018-05-10 23:10:50

计算机基本定义

字面量(Literal): 理解为常量即可,比如 int i = 0,float b = 1.1f 等等。符号引用(Symblic Reference): Java文件编译到class文件之后。在常量池结构中真实存在的引用指向。比如说在UserService类中引用了User a = new com.demo.User();但是到内存结构中,我们并不知道User的具体内存地址...

2018-05-10 17:14:41

散列(HASH)---内含Java HashMap理解

散列是什么?散列又称为hash,设K为key,那么则有存储位置下标 index = F(k).这里F做的事情也就是我们本文要讲的散列,hash。通过散列算法。我们避免了循环比对,实现了不规则数据高效率存取Java HashMap 数组+链表什么是hash碰撞如上图,数组+链表,将我们的每一个KV的映射关系保存到了对象数组中。那么有:PUT = F(K) = 构造en...

2018-02-26 19:11:06

查看更多

勋章 我的勋章
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。