自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 zookeeper知识点扫盲

最近在看ClickHouse的相关内容,发现也要用到zookeeper。太多的中间件用到了zk,对zk的了解又太少,有必要好好整理一下=-=

2022-09-03 13:23:30 865 1

原创 Arthas使用指北——命令、原理及案例

Arthas是Alibaba开源的Java在线诊断工具,可以很方便的在生产环境运行,在不重启服务的情况下,实现对服务的深度监控与诊断。包括但不限于:查看对象的值,函数的入参和返回值,全局的监控服务运行状态,诊断死锁、高资源占用,查看JVM的状态,甚至可以动态改变服务的源码,增加日志的打印等等,实乃解决线上问题的利器。同时作为一款debug工具,其简洁的交互方式,清晰的图表,tab自动补全等功能,也极大的方便了我们的使用。

2022-09-03 13:20:10 967

原创 Kubernetes Pod调度策略

前两天和组里老哥交流时提到了k8s的Pod调度非常有意思,因此恶补了一下这一块的知识,写个文章做个记录。个人榆枋之见,欢迎评论交流。

2022-09-03 13:18:37 1485

原创 基于Redis的分布式限流器Java实现

限流、熔断与降级是系统应对海量并发时进行自我保护的三大“神器”。其中限流作为常见的业务场景,在一些小型系统中也是存在一定的需求。对于Java而言,常见的开源限流组件,如Guava RateLimiter,通过线程同步实现限流,仅适用于单机应用,而像阿里的Sentinel等,对小型应用来说又未免过重。本文通过Redis实现了分布式限流器,支持加载不同的脚本进行简单计数器、滑动窗口以及漏桶限流方案,并通过注解的方式对接口进行限流,既实现了对业务代码的极低侵入,又可以定制化限流逻辑。在这里与各位同学分享,也希望大

2022-08-23 21:13:47 3218

原创 实现Kafka的优先级消费

优先级消费是业务中经常碰到的场景。对于同一类消息,消息内容可能由于其业务上的属性不同,而具有不同的“重要程度”,比如在一个消息推送系统中,一条告警消息显然比一条营销消息重要的多,我们希望即使队列中已经有了大量消息的情形下,优先级更高的消息,仍能够实现“插队”的优先消费,以保证更重要的消息不回被低优先级的消息阻塞。

2022-08-23 21:09:17 4633

原创 ClickHouse为什么那么快

为啥他能这么快呢?设计如此=-=

2022-08-23 21:01:41 480

原创 28nm Memory Compiler开发(一)OpenRAM论文阅读

Abstract内存设计的可用性常常抑制了计算机系统的研究。现有的流程设计套件(PDK)经常缺少存储器编译器,而昂贵的商业解决方案仅提供具有不变单元,有限配置和限制性许可证的存储器模型。手动创建内存可能既费时又乏味,而且设计通常不够灵活。本文介绍了OpenRAM,一种开放源代码的内存编译器,它提供了一个平台,用于跨各种技术,大小和配置生成,表征和验证可构造内存设计。它可以进行计算机体系结构,片上系统设计,存储器电路和器件研究以及计算机辅助设计的研究。Introduction静态随机存取存储器(SRAM

2021-03-10 12:09:11 4269 1

原创 利用Vitis开发基于ZCU106的神经网络加速器(二)——DPU编译及Demo

前言上一篇文章讲到了如何生成可供Vitis使用的XRT platform。这次我们使用生成的platform来开发一个完整的加速器Demo并在ZCU06上跑通。DPU概述DPU是Vitis AI中官方提供的FPGA神经网络加速器,其架构如下图:DP(Deep Learning Processor Unit)是专用于卷积神经网络的可配置计算引擎。 引擎中使用的并行度是设计参数和应用程序。 它包含一组高度优化的指令,并支持大多数卷积神经网络,例如VGG,ResNet,GoogleNet,YOLO,SS

2020-11-24 14:57:00 4933 13

原创 利用Vitis开发基于ZCU106的神经网络加速器(一)——Vitis概述及XRT编译

前言毕设要用到Xilinx家的ZCU106这块板子,了解到最近Xilinx统一了Vivado,XilinxSDK,并集成了常用开源IP核,推出了Vitis统一软件平台,使我们不再需要关注底层的Verilog实现,因此尝试使用Vitis开发一个神经网络加速器,作为毕设的基础。Vitis架构XRT由上图可以看到,Xilinx为我们提供了各种各样的加速库,而XRT(Xilinx Runtime Library)则是我们的代码与Xilinx硬件交互的中间件和媒介。有了XRT,我们就可以用更上层的开发方

2020-11-19 22:09:26 4308 2

翻译 论文笔记:An Efficient Hardware Accelerator for Sparse Convolutional Neural Networks on FPGAs

Abstract深度卷积神经网络(CNN)以巨大的计算为代价取得了卓越的性能。随着CNN模型变得越来越复杂和深入,通过剪枝网络中的冗余连接来压缩CNN以使其稀疏已成为一种吸引人的方法,可以减少计算量和内存需求。另一方面,FPGA被证明是加速CNN推理的有效硬件平台。但是,大多数现有的FPGA体系结构都集中在密集的CNN模型上。当执行稀疏模型时,这些密集的体系结构效率低下,因为大多数算术运算都涉及零操作数的加法和乘法。在这项工作中,我们提出了一种用于FPGA上稀疏CNN的硬件加速器。为了有效地处理稀疏卷积层

2020-10-30 18:50:16 1302

原创 何为业务安全,业务安全部门的具体职责是什么?

互联网安全的发展史一提到互联网领域的安全问题,我想大多数人的第一反应是利用网络、软件的漏洞进行的各种攻击,或者用手指在键盘上跳舞的黑客们,这似乎是一个老生常谈的问题。我们每个人都能随口说出几种攻击,比如SQL注入、中间人攻击、DDOS攻击等,然而每个概念在历史发展的不同阶段,却都有着迥异的内涵,互联网安全就是如此。在互联网行业发展的初期,我们会更关注传统安全领域,如黑客,漏洞等上文所提到的内容,实际上这些大致可归类于操作系统、网络、应用软件层面的安全。再之前呢,我们的安全甚至会囊括硬件基础、设备层

2020-10-28 10:47:46 3055

翻译 论文笔记:An Efficient Hardware Accelerator for Structured Sparse Convolutional Neural Networks on FPGAs

An Efficient Hardware Accelerator for Structured Sparse Convolutional Neural Networks on FPGAsAbstract深度卷积神经网络(CNN)在广泛的应用中都实现了最先进的性能。但是,复杂的人工智能(AI)任务广泛需要更复杂的更深的CNN模型,这些模型通常对算力的要求极高。尽管最近在网络压缩方面的研究进展(例如剪枝)已经显著减轻了硬件设备的计算负载,但是由于剪枝引起的不规则性,仍然无法阻止现有的加速器充分利用稀疏性的

2020-10-23 15:18:44 1310

原创 个人整理的面试题汇总(七)——Spring相关

IOCIOC(Inversion Of Control)控制反转。两种实现方式:DL(依赖查找),DI(依赖注入)。Spring就是实现的DI。IOC的想法是通过一个第三方的IOC容器实现各个相互依赖对象之间的解耦。通过引入IOC容器,可以使复杂系统中的各个对象不再相互依赖,使每个开发者可以只关注于实现自己的类,与别人的工作没有任何关系。比如在没有IOC容器这个“粘合剂”时,当类A代码的某个阶段,需要用到类B时,需要主动的创建对象B,或者调用已经创建好的B对象,也就是对象A依赖于对象B。而有了IOC容

2020-10-22 15:45:27 1281

原创 个人整理的面试题汇总(六)——分布式系统

分布式系统分布式事务指事务的每个操作步骤都位于不同的节点上,需要保证事务的 AICD 特性。产生原因数据库分库分表;SOA 架构,比如一个电商网站将订单业务和库存业务分离出来放到不同的节点上。应用场景下单:减少库存同时更新订单状态。库存和订单不在不同一个数据库,因此涉及分布式事务。支付:买家账户扣款同时卖家账户入账。买家和卖家账户信息不在同一个数据库,因此涉及分布式事务。解决方案3.1 两阶段提交协议两阶段提交协议可以很好得解决分布式事务问题,它可以使用 XA 来实现,XA 它包含两个

2020-10-21 13:32:42 1182 2

原创 个人整理的面试题汇总(五)——网络

四层网络协议:OSI模型分层,每层对应的协议和功能TCP和UDPTCP与UDP区别总结:1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付,Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。3、UDP具有较好的实时性,工作效率比TCP高,适

2020-10-20 14:29:18 582

原创 个人整理的面试题汇总(四)——数据库

MySql事务你用支付宝去去超市买东西,100块钱转给超市,其实这是两步:第一步,在支付宝数据库中你的账户减去100;第二步,在超市的支付宝账户上加上100元,交易完成;但是如果第一步完成了,还没执行第二步的时候,停电了会发生什么呢?会发生,你的账户减少了100块,超市的账户金额没变,这不就出现问题了,不得打架了吗?为了解决这个数据一致性问题,数据库事务应运而生。数据库事务是指一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属

2020-10-19 12:01:33 13706

原创 Install Optolithium in ubuntu 16.04

First, enter directory OptolithiumC which in <OPTOLITHIUM_SRC>cd <OPTOLITHIUM_SRC>/OptolithiumCWe need cmake to install this open source software, so cmake should be installed if not exist.sudo apt install cmakeThe following we continue i

2020-10-17 19:33:06 1124 1

原创 Magic源码阅读(六)——DRC检查的实现(下)

对于前面提到的后台自动运行的持续的DRC检查器,也是在DRCcontin.c中实现的,核心方法为DRCContinuous,由WindDispatch()调用,这个函数会一直运行,检查当前窗口中是否有待DRC的区域,如果有则就会使用恰当的方式进行检查。当用户键入了一个新的命令后,这个函数会以最快的方式进入中断。voidDRCContinuous(){#ifndef MAGIC_WRAPPER Rect drc_orig_bbox; /* Area of DRC def that chan

2020-10-15 18:17:47 560

原创 Magic源码阅读(五)——DRC检查的实现(中)

接下来我们关注一下DRC更为底层的实现,DRCWhy调用的是DRCInteractionCheck和DRCArrayCheck函数,以及处理DRCCheckThis函数所添加的list中区域的DRCCheckTile函数。DRCInteractionCheck在DRCsubcell.c源文件下,是进行subcell interaction检查的顶层方法,这个方法会检查所有违背interaction规则的错误,并调用传进的函数参数进行处理。intDRCInteractionCheck(def, area

2020-10-15 18:17:35 499

原创 Magic源码阅读(四)——DRC检查的实现(上)

当我们从版图文件中读取数据并生成我们基于角勾链的数据模式后,下一步就是在我们的版图上进行DRC(设计规则检查),接下来让我们看一下magic是如何进行常用的DRC的。DRC部分涉及的源码主要有以下几个源文件drc.h #declaration of the main interface, defination of global variablesDRCarray.c #implementation of array related design rule checkDRCbasic.c

2020-10-15 18:15:24 1145

原创 个人整理的面试题汇总(三)——操作系统

文件描述符0 ,1,2叫文件描述符;Linux中,每打开一个文件都有一个小的整数与之对应,就是文件描述符!0 是标准输入的 (stdin)1 是标准输出的 (stdout)2 是标准报错输出的 (stderr)'<'是输入重定向符‘>’是输出重定向符软链接和硬链接的区别对于一个文件来说,有唯一的索引接点(inode)与之对应,而对于一个索引接点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问该文件。Linux下是一切皆文件的,文件夹、新加的硬盘

2020-10-15 09:57:14 808

原创 个人整理的面试题汇总(二)——多线程

线程运行的几种状态Synchronized和locksynchronized和lock的用法区别synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写.

2020-10-14 10:24:29 245

原创 个人整理的面试题汇总(一)——Java基础知识

Java和C的区别Java与C++都是面向对象语言,都使用了面向对象思想(例如封装、继承、多态等)由于面向对象有许多非常好的特性(继承、组合等),因此二者都有很好的可重用性需要注意的是,二者并非完全一样,下面主要介绍它们的不同点:1)Java为解释性语言,其运行过程为:程序源代码经过Java编译器编译成字节码,然后由JVM解释执行。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java的执行速度比C/C++慢,但是Java能够跨平台执行,而C/C++不能。2)Java

2020-10-13 17:07:38 192

原创 Magic源码阅读(三)——数据导入和构建

我们之前已经了解了magic的角勾链数据结构和GDSII版图文件,那么我们的magic是如何实现将GDSII数据库文件构建为基于角勾链这种数据结构的图的呢?Magic构图方法无论是从命令行读入GDSII文件,还是在软件中以UI的方式打开文件,最终都是触发的CmdCalma(MagWindow *w, TxCommand *cmd)这个函数,当命令为read file时,我们会触发函数switch分支中 case CALMA_READ: if (cmd->tx_argc != 3) go

2020-10-09 12:05:57 1368 1

原创 Magic源码阅读(二)——版图GDSII文件的数据格式和解析方法

GDSII流格式,常见的缩写GDSII,是一个数据库文件格式。它用于集成电路版图的数据转换,并成为事实上的工业标准。GDSII是一个二进制文件,其中含有集成电路版图中的平面的几何形状,文本或标签,以及其他有关信息并可以由层次结构组成。GDSII数据可用于重建所有或部分的版图信息。它可以用作制作光刻掩膜版。GDSII文件的所有数据都是由一连串的数据块链接组成的。这些数据块大体上可分为文件头,模块结构头,图素头,图素,图素尾,模块结构尾,文件尾这几个部分,每个部分包含若干个模块,有些模块是必须包含的,另外一些

2020-09-28 14:55:13 13589 4

原创 Magic源码阅读(一)——综述

Magic源码阅读(一)——综述Magic是什么magic是一个集成电路的布局系统。它将有关设计规则和连通性的专业知识直接整合到布局系统中,这是为了支持以下的powerful new operation:持续的规则检查器(能够实时的后台检测当前的违反规则的地方),plowing操作来避免交互式的拉伸和压缩(interactive stretching and compaction),布线工具能够在当前通道已经存在的连接下进行工作。为了实现这些新型op,magic设计了一种新的数据结构,叫做角勾链(co

2020-09-25 17:00:06 2026

原创 几种常用排序算法的最佳实践,记录下备用

class Sort { public void quickSort(int[] arr, int st, int end) { if(st >= end) { return; } int l = st; int r = end; int cur = arr[st]; while(l < r) { while(l < r &&am

2020-09-25 14:10:12 119

原创 LeetCode1494 并行课程II——状态压缩DP

前言

2020-09-14 17:46:33 291

原创 LeetCode LCP09:最小跳跃次数——广度优先搜索的优雅写法

前言看评论又学了一手:以往在广度优先搜索的场景中,使用一个队列,如果想进行层次的遍历,我的做法是再new一个队列,把新出现的元素放到新队列中,完成后再将新队列赋给原先的指针。即while(!queue.isEmpty()) { Queue<Integer> next = new LinkedList(); int cur = queue.poll(); while(!queue.isEmpty()) { //add some item to new queue } //fin

2020-09-14 17:19:49 264

原创 面试题:如何设计一个阻塞队列?

前言面试问到了这个问题,回答的很糟糕,这里记录一下。当时回答的是在读取时用while循环判断是否为空,是的话就sleep一段时间,再重新判断,不为空则读取并返回,在插入时用while循环判断是否为满,为满则sleep一段时间,再重新判断,不为满则插入。完全没有考虑线程安全的问题,同样用循环等待的方式也太过暴力了,实在是一个糟糕的设计。分析我们知道阻塞队列相比于普通队列,区别在于当队列为空时获取被阻塞,当队列为满时插入被阻塞。当被阻塞时,我们的获取或插入线程进入阻塞状态,当队列中有了元素或者有剩余空

2020-09-14 13:26:11 1441

原创 整理一下我们常用的开源组件中,哪些是多进程模型,哪些是多线程模型

前言

2020-09-14 11:42:58 265

原创 什么是CI CD? 什么是DevOPS?他们有什么联系和区别?

前言

2020-09-11 12:59:43 8512

原创 LeetCode1483 树节点的第K个祖先——构造缓存,查询优化到O(logN)

题目LeetCode1483 树节点的第K个祖先给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。请你设计并实现 getKthAncestor(int node, int k) 函数,函数返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 -1 。树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。提示:1 <= k <= n &

2020-09-11 11:54:33 269

原创 整理一下各种背包问题:01背包,完全背包,填满背包,带负数的背包

前言发现自己不知第几次搜背包问题的相关知识点了,决定自己整理一下,好记性不如烂笔头。01背包问题:有n件物品,第i件物品的价值是v[i],重量是w[i],背包的容量是c,问能装下的最大价值是多少?我们令dp[i][j]表示前i件物品放到容量为j的背包中的最大价值,则可以对第i件物品分情况讨论,若不放第i件物品,则dp[i][j]等于dp[i-1][j],若放第i件物品,首先要满足j大于w[i],此时的dp[i][j]等于dp[i-1][j-w[i]]+v[i],取两者中的较大值即可。代码publ

2020-09-07 17:58:08 1322

原创 Java移位运算符的优先级带来的一个小坑,二分查找中用>>1代替/2居然死循环了

先说结论优先级运算符结合性1()、[]、{}从左向右2!、+、-、~、++、–从右向左3*、/、%从左向右4+、-从左向右5<<、>>、>>>从左向右6<、<=、>、>=、instanceof从左向右7==、!=从左向右8&从左向右9^从左向右10|从左向右11&&从左向右12||从

2020-09-07 13:41:55 875

原创 策略模式真的只是为了干掉if-else吗?

前言

2020-09-04 19:21:32 380

原创 二项式定理在算法中的应用

前言数学中的一些公式在计算机科学中非常有用,尤其是在ACM中,几乎全是概率论与数理统计。今天说一下常用的一个公式:二项式定理。二项式定理的最基本形式是:(a+b)n=Cn0anb0+Cn1an−1b1+Cn2an−2b2+...+Cnna0bn(a + b)^n = C_n^0a^nb^0+C_n^1a^{n-1}b^1+C_n^2a^{n-2}b^2+...+C_n^na^0b^n(a+b)n=Cn0​anb0+Cn1​an−1b1+Cn2​an−2b2+...+Cnn​a0bn由此可以得到两个重要

2020-09-03 18:58:29 836

原创 MySQL如何实现批量更新为不同的值?三种方法:临时表,prepared statement,on duplicate key

前言在对MySQL进行大量数据导入的时候,对于插入,我同通常会采用批量插入的方式insert into `tb` (`id`, `f1`, `f2`) values (1, 'a','b'), (2, 'c', 'd'), (3, 'e', 'f')...这样一方面是能够节约网络IO的次数,另一方面也能减少MySQL硬解析的时间,对于效率的提升有很大帮助。那么对于批量更新,如果我们想更新为不同的值,该如何去操作呢?标准SQL其实,我们想实现批量更新,其实就是要优化大量数据更新的时间,最简单的方

2020-09-03 10:34:50 435

原创 LeetCode1531:DP的常见思路——分情况讨论

前言在使用动态规划解决问题时,最关键的一步就是列出状态转移方程,完善代码一般就是水磨工夫了。但是状态转移方程并不好列,我们需要将问题拆分成子问题,并找到如何用子问题的解递推我们当前问题的解。要找到状态转移方程,首先我们要找到一种最合适的方法去表示状态,或者说中间结果,然后找到这样表示状态时状态间是如何递推的。这两步都很关键。简单的DP问题其状态转移方程往往是很容易看出的,当前的结果一般是之前结果的加减乘除或者逻辑运算。而复杂一些的DP问题就会转几个弯,一般是无法直接从中间结果得到,需要根据具体的问题做

2020-09-02 16:37:18 583

原创 一个有意思的面试问题:分布式系统下,缓存失效后如何保证所有不同机器只有一个线程去读取DB更新缓存?

先来分析一下这个问题:实际上是缓存击穿问题的拓展版,如果一个很热的key失效了,瞬间又有大量的请求落到这个key上,导致请求击穿到DB,发生事故。对于单机的情况,我们可以加个锁来解决这个事情,并做一个双重校验,来保证只有一个线程去更新这个key,大致逻辑如下:public String get(String key) { if(existInRedis(key)) { return getValueFromRedis(key); // 实际上这里要搞成原子的,存在直接返回 } else {

2020-08-31 19:39:14 368

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除