自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Stay Hungry, Stay Foolish

每天进步一点点

转载 Linux内核数据结构移植(list和rbtree)

简介list 介绍修改部分list.h 对外的接口使用示例 - 测试 list.h 中所有的list操作rbtree 介绍修改部分rbtree.h 对外接口使用示例简介主要移植了内核中的 list,rbtree。使得这2个数据结构在用户态程序中也能使用。同时用 cpputest 对移植后的代码进行了测试。(测试代码其实也是使用这2个数据结构的方法)内核代码的如下文件:(内核版本 v3.2 ...

2020-03-14 17:08:41 106

原创 Redis设计与实现--数据结构与对象(二)

整数集合简介整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且元素数量不多时,redis就会使用整数集合作为集合键的底层实现。整数集合定义在intset.h/intset中:typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; /...

2020-03-14 16:49:43 75

原创 Redis设计与实现--数据结构与对象(一)

简单动态字符串简介与c语言的区别获取字符串长度的复杂度为常数项防止缓冲区溢出减小修改字符串时带来的内存重分配次数空间预分配惰性空间释放二进制安全链表简介字典简单动态字符串简介字符串是我们经常用到的数据结构,在c语言中,字符串是采用N+1长度的字符数组来表示长度为N的字符串,其中,字符数组末尾为’\0’,用来代表字符串的末尾。但是,redis并没有直接采用c语言的实现方式,而是自己构建了一种...

2019-12-21 19:13:42 172

转载 libevent源码深度剖析十一

前言为了支持定时器,Libevent必须和系统时间打交道,这一部分的内容也比较简单,主要涉及到时间的加减辅助函数、时间缓存、时间校正和定时器堆的时间值调整等。下面就结合源代码来分析一下。初始化检测Libevent在初始化时会检测系统时间的类型,通过调用函数detect_monotonic()完成,它通过调用clock_gettime()来检测系统是否支持monotonic时钟类型:stat...

2019-11-23 16:27:29 84

转载 libevent源码深度剖析十

前言Libevent的核心是事件驱动、同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows、Linux、Unix等不同平台上却各有不同,如何能提供优雅而统一的支持方式,是首要关键的问题,这其实不难,本节就来分析一下。统一的关键Libevent支持多种I/O多路复用技术的关键就在于结构体eventop,这个结构体前面也曾提到过,它的成员是一系列的函数指针,...

2019-11-23 16:23:03 61

转载 Linux samba的配置和使用

目录背景samba是什么samba怎么安装samba怎么配置配置新创建的用户背景在最近学习FFmpeg的过程中自己使用了VMware Workstation安装的Linux(CentOS6)开发环境,在环境的搭建过程中需要使用samba,其实在日常工作中也经常使用samba,只是自己很少去亲自操作,而这次自己从头开始搭环境时遇到了一些问题,因此打算研究一下samba的常规使用方法和常见问题的解...

2019-10-08 23:08:04 57

原创 Git常用操作总结

基础操作创建别名分支操作查看当前分支创建本地分支推送本地分支到远程仓库删除分支拉取远程分支到本地提交代码合并分支回滚分支未进行 add 操作未进行 commit 操作已经执行 commit 操作基础操作创建别名git中可以给一些常用命令设置别名,这样就不用每次都输入长长的单词了,常用的别名设置为:git config --global alias.co checkoutgit conf...

2019-09-22 19:13:22 95

原创 STL容器之deque源码详解

简介构造函数主要函数特点参考资料简介deque是一种双向开口的连续性空间,可以在头尾两端分别做元素的插入删除操作,deque没有所谓的容量(capacity)概念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新空间并链接起来。虽然deque也提供了Random access iterator,但是它的迭代器不是普通指针,其复杂程度很高,同时,对于deque的排序操作,为了高效率...

2019-09-07 12:05:48 78

原创 STL容器之vector源码详解

简介构造函数主要函数push_backclear特点参考资料简介vector的数据安排和array和类似,它们的主要差别在于空间的运用和灵活性,array是静态空间,一旦配置了就不能改变,vector是动态空间,随着元素的加入,它会自动扩充空间以容纳新的元素。构造函数// 默认构造函数explicit vector(const allocator_type& __a = all...

2019-09-01 09:55:49 100

原创 STL容器之list源码详解

简介构造函数主要函数push_backpush_frontclear特点参考资料简介相对于vector的连续线性空间,list就显得更加复杂,它每插入或者删除一个元素,就配置或释放一个元素空间,因此,list对于空间的利用非常精准,一点也不浪费,而且,对于任何位置的插入或者删除,list永远是常数时间。构造函数explicit list(const allocator_type&...

2019-09-01 09:55:19 40

转载 char[],char *,string之间转换

char []与char *之间转换char []转char *:直接进行赋值即可char *转char[]:字符拷贝实现,不能进行赋值操作char 与const char 之间转换const char 转char :拷贝实现,不能进行赋值char 转const char :直接进行赋值char *与string之间转换char *转string:1)直接赋值;2)构造转换实现string转ch...

2019-08-29 22:23:24 71

转载 存储基础知识 - 网络存储主要技术

网络存储主要技术目前磁盘存储市场上,存储分类根据服务器类型分为:封闭系统的存储和开放系统的存储。1、封闭系统主要指大型机,AS400等服务器,开放系统指基于包括Windows、UNIX、Linux等操作系统的服务器;2、开放系统的存储分为:内置存储和外挂存储;开放系统的外挂存储根据连接的方式分为:直连式存储(Direct-Attached Storage,简称DAS)和网络化存储(Fabr...

2019-08-24 14:05:59 566

原创 存储基础知识目录

网络存储主要技术主要协议和相关技术文件系统RAID技术数据复制与容灾备份技术windows相关linux相关存储网络知识存储I/O云存储其他存储常见的存储技术...

2019-08-24 14:04:24 168

原创 STL迭代器

简介迭代器的辅助函数简介要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。迭代器按照功能分成以下五种:Input iterator:这种迭代器所指向的对象,不允许改变Output iterator:唯写...

2019-08-24 10:49:49 20

转载 Make命令教程

简介Make的概念Makefile文件的格式概述目标(target)前置条件(prerequisites)命令(commands)Makefile文件的语法注释回声(echoing)通配符模式匹配变量和赋值符内置变量(Implicit Variables)自动变量(Automatic Variables)判断和循环函数Makefile 的实例执行多个目标编译C语言项目简介代码变成可执行文件,...

2019-08-18 15:20:03 202

原创 STL配置器

配置器空间配置器的必要性小块内存会带来内存碎片问题小块内存的频繁申请释放会带来性能问题一级空间配置器二级空间配置器优缺点参考资料配置器如果你不曾仔细研读STL源码,你是不会发现在STL还会有空间配置器的存在的,因为它是隐藏在一切组件(特别是容器)的背后,默默工作。如果你需要自己实现一个STL,最先设计的就应该是空间配置器,因为它是一切STL的基础。空间配置器的必要性小块内存会带来内存...

2019-08-18 14:46:41 32

原创 STL简介

STL概论长久以来,软件界一直希望建立一种可复用的东西,让工程师/程序员的心血不至于随时间迁移、人事异动而烟消云散,从子程序、函数、类别,到函数库、类别库、各种组件,从结构化设计、模块化设计、面向对象设计,到模式的归纳整理,无一不是软件工程的漫漫奋斗史。为的就是复用性的提升。为了建立数据结构和算法的一套标准,并降低其间的耦合关系,以提升各自的独立性、弹性、交互操作性,C++诞生了STL。S...

2019-08-18 11:32:48 74

转载 Linux 中直接 I/O 机制的介绍

直接 I/O 的动机什么是缓存 I/O (Buffered I/O)缓存 I/O 的缺点自缓存应用程序( self-caching applications)Linux 2.6 中的直接 I/O 技术Linux 2.6 中提供的几种文件访问方式标准访问文件的方式同步访问文件的方式内存映射方式直接 I/O 方式异步访问文件的方式Linux 2.6 中直接 I/O 的设计与实现内核为块设备执行直接 ...

2019-08-11 17:12:28 120

转载 块存储、文件存储和对象存储的区别及联系

基础知识块级概念文件级概念物理块与文件系统之间的关系块存储、文件存储、对象存储块存储优点缺点文件存储优点缺点对象存储相关问题为什么对象存储兼具块存储与文件存储的好处,还要使用块存储或文件存储呢?基础知识块级概念块级是指以扇区为基础,一个或几个连续的扇区组成一个块,也叫物理块。它是在文件系统与块设备(例如:磁盘驱动器)之间。块级备份:块级备份是指物理块复制,效率高,实时性强,备份时间短,...

2019-08-11 11:53:16 380

转载 常见的硬盘类型介绍

简介按接口类型分类概述IDESATASCSISASFCSSD参考资料简介对于硬盘来说,常见的有以下几种分类方式:按生产厂家分类大部分人选择硬盘都是会先看厂家,然后才是容量、材质等信息,常见的硬盘厂家主要有:希捷Seagate西部数据Western Digital三星SAMSUNG闪迪SanDisk金士顿Kingston…按照硬盘材质分为两大类HDD(Hard...

2019-07-31 21:56:00 3373

转载 libevent源码深度剖析九

前言现在再来详细分析libevent中I/O事件和Timer事件的集成,与Signal相比,Timer事件的集成会直观和简单很多。Libevent对堆的调整操作做了一些优化,本节还会描述这些优化方法。集成到事件主循环因为系统的I/O机制像select()和epoll_wait()都允许程序制定一个最大等待时间(也称为最大超时时间)timeout,即使没有I/O事件发生,它们也保证能在time...

2019-04-03 11:04:06 159

转载 libevent源码深度剖析八

前言现在我们已经了解了libevent的基本框架:事件管理框架和事件主循环。上节提到了libevent中I/O事件和Signal以及Timer事件的集成,这一节将分析如何将Signal集成到事件主循环的框架中。集成策略——使用socket pair前一节已经做了足够多的介绍了,基本方法就是采用“消息机制”。在libevent中这是通过socket pair完成的,下面就来详细分析一下。So...

2019-03-22 13:03:41 97

转载 libevent源码深度剖析七

前言现在我们已经初步了解了libevent的Reactor组件——event_base和事件管理框架,接下来就是libevent事件处理的中心部分——事件主循环,根据系统提供的事件多路分发机制执行事件循环,对已注册的就绪事件,调用注册事件的回调函数来处理事件。阶段性的胜利Libevent将I/O事件、定时器和信号事件处理很好的结合到了一起,本节也会介绍libevent是如何做到这一点的。在...

2019-03-20 15:59:02 122

转载 libevent源码深度剖析六

前言前面已经对libevent的事件处理框架和event结构体做了描述,现在是时候剖析libevent对事件的详细处理流程了,本节将分析libevent的事件处理框架event_base和libevent注册、删除事件的具体流程,可结合前一节libevent对event的管理。事件处理框架-event_base回想Reactor模式的几个基本组件,本节讲解的部分对应于Reactor框架组件。...

2019-03-20 15:39:39 96

转载 libevent源码深度剖析五

前言对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的管理。libevent的核心-eventLibevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执行相应的事件处理,...

2019-03-18 15:40:29 111

转载 libevent源码深度剖析四

前言详细分析源代码之前,如果能对其代码文件的基本结构有个大概的认识和分类,对于代码的分析将是大有裨益的。本节内容不多,我想并不是说它不重要!源代码组织结构Libevent的源代码虽然都在一层文件夹下面,但是其代码分类还是相当清晰的,主要可分为头文件、内部使用的头文件、辅助功能函数、日志、libevent框架、对系统I/O多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基...

2019-03-18 15:13:28 163

转载 libevent源码深度剖析三

前言学习源代码该从哪里入手?我觉得从程序的基本使用场景和代码的整体处理流程入手是个不错的方法,至少从个人的经验上讲,用此方法分析libevent是比较有效的。基本应用场景基本应用场景也是使用libevnet的基本流程,下面来考虑一个最简单的场景,使用livevent设置定时器,应用程序只需要执行下面几个简单的步骤即可。首先初始化libevent库,并保存返回的指针struct eve...

2019-03-17 23:37:01 122

转载 libevent源码深度剖析二

前言前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reactor模式进行必要的介绍,并列出libevnet中的几个重要组件和Reactor的对应关系,在后面的章节中可能还会提到本节介绍的基本概念。Reactor的事件处理机制首先来回想一下普通函数调用的机制:程序调用某函数,函数执行,程序等待,函数将结果和控制权返回给程序,程序继续处理。Reactor释义“反应堆...

2019-03-17 21:04:27 82

转载 libevent源码深度剖析一

前言Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少。写这一系列文章的用意在于,一则分享心得;二则对libevent代码和设计思想做系统的、更深层次的分析,写出来,也可供后来者参考。附带一句:Libevent是用c语言编写的(MS大牛们都偏爱c语言哪),而且几乎是无处不函数指针,学习其源代码也需要相当的c语言基础。Libevent简介上来当然要先夸奖啦...

2019-03-14 22:44:23 85

转载 select poll epoll

简介select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核...

2018-08-17 16:04:18 135

原创 记一次Spring Websocket后台服务器CPU占用率过高的问题排查过程

背景最近在做Spring Websocket后台程序的压力测试,但是当并发数目在10个左右时,服务器的CPU使用率一直在160%+,出现这个问题后,一开始很纳闷,虽然服务器配置很低,但也不至于只有10个并发吧。。服务器的主要配置如下:CPU:2核 Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz内存:4GB使用top命令查看资源占用情况,发现pi...

2018-07-14 14:37:17 7108 4

转载 MySQL性能优化神器Explain使用分析

简介我们前面介绍过慢查询,通过慢查询可以定位执行效率较差的SQL语句,定位到一个SQL语句以后,我们下面就是要探究为什么该SQL语句执行效率很低,是因为全表扫描、还是索引设置不当,这些信息都需要通过EXPLAIN来获取。EXPLAIN命令是查看优化器如何决定执行查询的主要方法。它可以对SELECT语句进行分析,并输出SELECT执行的详细信息,以供开发人员针对性优化。EXPLAIN命令用法...

2018-07-03 09:12:24 323

转载 MySQL慢查询日志总结

慢查询日志概念MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该...

2018-06-29 18:41:49 265

转载 Linux—shell中$(( ))、$( )、``与${ }的区别

命令替换在bash中,$( )与` `(反引号)都是用来作命令替换的。命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。 exp 1[root@localhost ~]# echo today is $(date "+%Y-%m-%d")today is 2017-11-07[root@localhost ~]# ec...

2018-06-29 16:09:25 98

原创 Java并发编程之ConcurrentLinkedQueue详解

简介在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,下面我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列ConcurrentLinked...

2018-06-26 10:00:26 27817 21

原创 Java并发编程之ConcurrentHashMap详解

简介我们知道,HashMap并不是线程安全的,要使用线程安全的HashMap,可以用HashTable或者通过Collections.synchronizedMap方法来获取一个线程安全的Map,但是这两种线程安全的Map都是使用synchronized来保证线程安全,因此,在多线程竞争激烈的情况下,它们的效率非常低。因为当一个线程访问synchronized同步方法时,其他线程访问Map,可能会...

2018-06-25 10:15:28 488

转载 缓存穿透,缓存击穿,缓存雪崩解决方案分析

前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案有很多种方法可以有效地...

2018-06-22 10:06:52 126

原创 Java动态代理详解(二)

简介我们在Java动态代理详解(一)这篇博客中已经为大家介绍了代理模式,并且简单介绍了JDK静态代理、JDK动态代理以及cglib动态代理。我们在这一篇博客中,将会从源码的角度来对JDK动态代理进行详细讲解。在上一篇博客中,我们使用动态代理的核心代码如下:public class SubjectProxy implements InvocationHandler { private Subjec...

2018-06-21 20:21:11 181

转载 Class.newInstance()与new、Constructor.newInstance()的区别

在初始化一个类,生成一个实例的时候,newInstance() 和 new 有什么区别?用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。 Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。 例如: Class ...

2018-06-21 17:23:29 897 1

原创 Java动态代理详解(一)

简介静态代理动态代理

2018-06-21 11:37:00 176

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