自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 c++云风coroutine库解析

云风coroutine库是一个C语言实现的轻量级协程库,源码简洁易懂,可以说是了(ru)解(keng)协程原理的最好源码资源。我在之前的文章中,借助腾讯开源的libco,对C/C++的协程实现有了一个简单介绍,参考博客。其实libco和云风coroutine有很多相似的思想,只不过实现的方式不同而已,云风库只是提供了一种实现思路,并没有对hook进行处理,而libco则是工业级的协程库实现。通过...

2020-05-05 17:33:13 697

原创 6.824分布式系统学习笔记

Lecture 1:Introduction为什么需要分布式系统?并行,多机能提供解决问题效率容错,多机器可以有效降低系统出错概率,当一台机器宕机后,另一台机器依旧能工作解除物理限制,分布在多地的机器能相互通信安全性与隔离性,labMapReduceRaft协议K/V servershared K/V servicePerformance --Scalability可...

2020-02-29 23:58:35 672

原创 HTTP知识总结

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一个用于web的客户端与服务器之间的交互协议。其在TCP/IP协议栈中处于应用层,与其相关的还有DNS(域名与IP之间的转换协议)、TCP(传输层协议)、IP(网络层协议)。目前主流的版本是HTTP/1.1,同时HTTP/2.0也在推广。

2019-12-13 15:12:07 310

原创 深入理解数据结构——红黑树

本篇文章深入讲述红黑树的原理与实现。红黑树是一个非常重要的数据结构,也是面试中的常考知识点。其本质上是一个平衡搜索树,可是其“平衡”的条件和AVL树不同。在深入了解红黑树之前要先熟悉平衡搜索树的相关知识,这里就不再介绍。

2019-12-04 09:09:47 241

原创 #include " *.c / *.cpp "源文件的理解和使用

今天在看redis源码的时候,ae库中为了跨平台式多路复用的实现,运用了如下代码。/* Include the best multiplexing layer supported by this system. * The following should be ordered by performances, descending. */#ifdef HAVE_EVPORT#includ...

2019-11-18 23:29:22 1237

原创 Redis中的事件管理

Redis中的很重要的一部分是对于事件的管理,ae事件库的最大特点就是简洁明了并高效。本章将重点放在Redis对于事件的处理过程。Redis事件事件调度过程...

2019-11-18 17:46:08 176

原创 Redis中的持久化策略——RDB与AOF

之前叙述了Redis中的数据库键值对存储方式以及键过期策略。本篇文章将着重介绍一下Redis中的数据持久化策略,这也是Redis中的重中之重。

2019-11-14 22:17:16 311 1

原创 Redis中的键空间与键过期

本章主要来介绍一下Redis的数据库对象,主要关注Redis对于存储在服务器中的键值对数据如何进行管理。

2019-11-13 15:12:01 356

原创 Redis的对象及命令

上一章讲解了Redis中的数据结构,这一章对Redis中的对象做详细介绍。Redis中对象Redis中有五大对象,分别是:字符串对象,列表对象,哈希对象,集合对象,有序集合对象。...

2019-11-07 20:40:04 996

原创 Redis的数据结构

之前简单介绍了Redis的特点和基本命令。这一章将着重于Redis的对象。相比于Memcached,Redis丰富的对象类型是一个非常重要的特点,每个对象又有两种以上的编码方式,这在对数据进行管理的时候提供了很大的便捷性,由于其是一个内存型数据库,内存的空间十分有限,不同的编码方式优化了数据存储时候的空间。Redis中的数据结构Redis中的数据结构十分丰富,主要包括一下六种,SDS,list...

2019-11-06 15:40:06 141

原创 Redis初识与配置

最近在了解Nosql的具体实现,redis作为KV数据库的重要成员,怎么能遗忘他呢。本篇文章对其特性做一些介绍,以后有时间对其底层做详细分析。Redis简介Redis是一个存储key-value对的内存型数据库,也就是说对其的基本增删改查等操作都是对内存中的数据进行(当然其也有持久化策略),由于这个原因,其读写性能相对于mysql等关系型数据库有很大的提升。其特点如下:1....

2019-11-03 16:00:31 136

原创 LevelDB源码解读——Compaction和VersionEdit

前面几篇简单介绍了LevelDB中的数据结构和存储方式(log、MemTable、sstable)。这一章节来解读一下LevelDB最核心的内容——合并操作与版本控制。Compaction按照LevelDB的框架思路,Compaction有两种使用方式,一种是MemTable -> Level0 ,称为Minor Com-paction,另一种是Level0 -> Level1,称...

2019-10-29 22:46:47 343

原创 LevelDB源码解读——MemTable和sstable

在前几章中,我们已经熟悉了LevelDB中的创建、读数据、写数据等基本操作,现在应该仔细来看看存储数据的结构体了,一开始我们已经看了skiplist的实现,其实MemTable中基本上就是依靠skiplist来实现的。MemTable是在内存中的数据存储结构,一些基本的读取操作都是会先对其做操作,而sstable则是磁盘上的存储结构。MemTableMemTable的结构较为简单。对其的get...

2019-10-27 15:22:19 1145

原创 LevelDB源码解读——数据库开启、读取与存入

本章主要介绍对LevelDB基础操作Open,Put,Get等操作,熟悉具体的数据读写处理流程。

2019-10-24 21:54:49 458

原创 LevelDB源码解读——Log日志文件

日志文件是LevelDB架构中最重要的一个部分,由于LSM-Tree是将写入的数据先存放在内存中的Memtable, 当到达临界时,就将其变成只读Immutable Memtable,随后后台进程将其flush到磁盘上sstable,如果在这个过程中系统发生错误,内存中的数据就会受到破坏,这时候就需要日志文件进行恢复。LevelDB在将数据写入内存的时候就会将其记录在日志文件中。日志格式每一条...

2019-10-22 17:23:29 569

原创 LevelDB源码解读——简介及数据结构

久闻LevelDB大名,由于课程需要,借助此次机会对levelDB源码的几个主要模块进行解读,同时加强对c++的理解。LevelDB简介LevelDB是一个google开源的持久型K-V数据存储引擎,是一个很好的c++学习源码。LevelDB的主要特点在于其写性能十分优秀(在牺牲了部分读性能的前提下),这也是LSM-Tree的主要特性之一。LevelDB的安装这里不再叙述,详见LevelDB...

2019-10-19 22:28:54 1120

原创 Nginx基础流程与启动过程解析

最近在学习nginx源码,由于时间有限,主要看主体逻辑流程,事件模块,HTTP模块等重要模块。本章首先对nginx启动过程做详细分析。nginx架构设计理念nginx启动过程概述master进程worker进程...

2019-10-12 18:26:25 589

原创 C++协程概述

本篇文章记录了,我在学习C/C++实现协程封装过程的新得体会,以及对协程的理解。一开始对知道“协程”这个概念实在go语言里面,很多资料对其的描述都是“轻量级的用户态线程”。 首先,用户态和内核态分别是程序在运行过程中的两种状态,如果线程在用户进程地址空间的状态下中执行程序,则称为用户态,一旦发生系统调用、中断、异常等事件,就会由用户态转换到内核态,进入到内核地址空间去执行函数(系...

2019-09-27 16:43:20 1756

原创 C++11新特性解析

Table of Contents类型推导智能指针移动语义杂项nullptr、0、NULLconstexpr本篇博客对于C++11的新特性做一些详细的描述和记录。尽量用简洁的语言和小栗子说明C++11做了哪些优化工作。类型推导模板函数类型推导。当调用一个模板函数时候,会自动进行模板参数推导。在推导的过程中,实参的引用性会被忽略(也就是说如果传进的是一个引用...

2019-09-17 17:31:14 737

原创 c++对象模型解析(一)

本系列记录在学习过程中,我对于c++对象模型的理解,主要包括如下知识点等底层实现机制。c++对象大小计算 虚函数(虚表,虚指针) 构造函数,析构函数(定义,作用,什么时候编译器自动生成) 多重继承,虚继承(菱形继承,优劣处) 动态绑定(多态,静态类型与动态类型)struct 和 class之间关系区别成员变量权限,首先struct中的成员变量默认是私有的,class的成员...

2019-07-28 16:20:53 209

原创 muduo Reactor结构分析

muduo采用的是one Loop per Thread 的模式,即每个线程中有一个主循环,再配合着IO多路复用,即可实现在一个线程中同时监听多个fd。主要利用EventLoop{.h/.cc} Channel{.h/.cc} Epoll{.h/.cc}来实现Reactor模式。回顾Reactor事件处理模式 Reactor模式是了解高性能IO的最基础模式,其主要的思想是,...

2019-07-15 17:42:24 141

原创 初识Nginx

什么是Nginx Nginx是一个高性能Web服务器,其与Tomcat、Apache等服务器相比,拥有以下特点拥有响应快(单次请求获得更快响应) 高扩展性(模块之间的耦合度较低) 高并发(单机支持10万连接) 热部署(在不停止Nginx服务器的情况下升级Nginx) 跨平台Nginx的组成 Nginx有四个部分组成,分别是:Nginx二进制可执行文件,由各个模...

2019-06-23 10:59:22 96

原创 muduo多线程异步日志分析

最近在看muduo的源码,对于其日志系统的实现颇为感兴趣,找了两三天好好研究了一下,本文记录一些所学到的知识。基础知识 日志是每个高性能服务器必备的组件,分为两种:诊断日志和交易日志。诊断日志,主要的作用是供开发人员和运维人员进行故障诊断和追踪,如果系统在运行过程中出现异常,也可以通过脚本语言对日志进行排查,muduo的日志系统就是属于这一类。交易日志主要是用来记录系统状态的...

2019-05-07 16:35:19 906

原创 C++中的左值与右值

来源 C++中的左值和右值其实是一个很久远的概念,但是逐渐到C++11才被重视起来。如今理解这两个概念对于正确运用C++11的一些特性十分有帮助。 首要要知道这两个名词其实是继承C语言,C语言中是可以简单理解为:左值是赋值语句的左侧,右值则不能。然而在C++中,则不能简单的这么认为,但是可以归纳为:当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的...

2019-05-03 12:08:09 184

原创 C++智能指针循环引用问题

今天遇到一个问题需要记录一下,C++中的RAII机制对于内存泄漏问题有了很大的帮助。当我们在拿到一块堆空间的时候,就应该用智能指针包裹起来,当对象生命周期结束的时候会自动释放申请的内存。 智能指针的类型常用的有三种,shared_ptr,unique_ptr,weak_ptr。三种智能指针各有特点,简单而言,shared_ptr有引用计数,unique_ptr一个对象只能指向一块...

2019-04-30 20:41:22 395

原创 MYSQL事务

事务简介 事务是数据库区别于文件系统的最重要特征之一。事务可以保证数据库从一个状态转移到另一个状态,也就是说在一个事务中的语句要么全部一起提交(所有修改都会保存),要么回滚(所有修改都不会保存)。 事务的性质:原子性,一致性,隔离性,持久性(ACID)保证一个事务的正确执行。每种性质具体含义具体参考:https://blog.csdn.net/puliao4167/articl...

2019-04-26 19:51:50 102

原创 MYSQL索引

索引简介 索引是存储引擎用于加快查询的一种数据结构,一种优良的索引策略能够对查询性能有效的优化。索引有以下三个优点:索引减少了需要扫描的数据量 索引可以帮助服务器避免排序和临时表 索引可以将随机IO变成顺序IO 但是,索引并不是越多越好,过多的索引易导致磁盘使用率上升,给系统带来负担。总体来说,一般只有索引帮助存储引擎快速查找到记录带来的好处大于其带来的开销时候,索引才是...

2019-04-17 16:47:42 96

原创 MYSQL基础

一、MySQL逻辑架构 MySQL的逻辑架构主要包含三层。最上层的应用层,主要基于网络客户端/服务器的工具或者服务,比如连接认证,授权认证,安全等功能。 第二层是MySQL的核心服务功能层,包括查找解析,分析,优化,缓存以及所有的内置函数等,除此之外,所有的跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。 第三层是存储引擎层,主要负责MySQL中数据的存储与...

2019-04-09 14:29:39 139

转载 docker安装与使用

转载自 https://blog.csdn.net/yx_222/article/details/80936757 本文主要介绍在Ubuntu16.04 LTS 64位系统下通过apt的Docker官方源安装最新的Docker CE(Community Edition),即Docker社区版的步骤。Docker安装卸载可能存在旧版本的docker:$ sudo a...

2019-04-04 16:08:53 148

原创 深入理解数据结构——树的遍历

概述 树是一个种非线性数据结构,由于线性数据结构的访问时间太慢,因此推演出“树”结构,其一般操作复杂度都为O(logn)。树的应用非常广泛:如文件系统,计算表达式的值,数据存储磁盘上的索引等。 树的遍历有很多种方法,主要包括先序遍历(递归、非递归),中序遍历(递归、非递归),后序遍历(递归、非递归),层次遍历。树的数据结构中主要包含:节点值,指向左孩子的指针和指向右孩子指针。...

2019-03-29 20:02:56 667

原创 深入理解数据结构——链表、栈、队列

一、链表(1)数组和链表的比较数组是在连续的地址空间中存储,链表可以不连续 数组的查找较为方便,然而插入和删除操作花销大,需要整块数组的移动 链表的查找不方便,需从表头开始遍历,但是插入和删除操作较为方便 数组在初始化时候需要给定大小,链表则不用(2)单链表的实现 在链表中利用指针实现较为简单,数据存储在一个结构体中,每个结构体包含数据以及指向下一个结构体的指针。当一个新...

2019-03-27 17:11:57 286

原创 Linux下常用的监测服务器命令

本篇用于记录一些Linux下命令或者工具的使用一、tcpdump tcpdump是一个网络抓包工具,可以根据主机、接口、协议等选项过滤出想要从网络上抓取的数据包,也可以根据选项指明数据包表达的格式。tcpdump的选项:-i 指定要监听的网卡接口-n 使用ip地址表示主机;使用数字表示端口-e 显示以太网帧头部信息 tcpdump还可以用表达式来进一步过滤数据...

2019-03-14 16:11:14 190

原创 高性能服务器程序框架

我们按照服务器的一般原理,可将服务器解析为三个主要的模块:IO处理单元(主要用于处理客户连接,读写网络数据),逻辑单元(业务进程或者线程,用于分析客户数据并将结果传递给IO处理单元或者而直接发给客户端,具体是哪种方式取决于事件处理模式),存储单元(本地数据库或者缓存)。模块之间需要有可靠的通信方式,一般为请求队列,或者是池。一、两种高效事件处理模式 服务器通常要处理三种事...

2019-03-11 11:13:43 117

原创 网络编程笔记——select、poll、epoll

五种IO模型简介 阻塞式IO,非阻塞式IO,IO复用,信号驱动式IO,异步IO为五种UNIX\LINUX下的IO模型。阻塞式IO。默认情况下所有套接字都为阻塞,当进程调用IO系统调用时(如read,recvfrom),会从用户态转换成内核态,准备从内核的缓存区中将数据复制到进程的缓冲区,如果数据没有准备好(即没有到达套接字),则一直阻塞直到数据准备好然后进行复制(或者发生错误返回)。...

2019-03-09 20:26:45 360

原创 Linux系统编程——内存映射与写时复制

基本概述    内存映射就是将虚拟内存中的一块区域与磁盘上的对象建立关联以初始化虚拟内存区域的内容。有两种映射文件映射:讲一个文件的一部分直接映射到调用进程的虚拟内存中 匿名映射:一个映射没有对应的文件(也可以理解成一个内容总是被初始化为零的虚拟文件的映射)    一个进程的映射中的内存可以与其他进程中的映射共享,当两个或者多个进程共享相同的物理分页时候,每个进程都可以对其做修改和读取...

2019-02-25 16:55:34 1478

原创 虚拟内存管理知识点回顾

概述    首先需要知道虚拟内存是一个抽象的概念。概念上而言,虚拟内存是一个存放在磁盘上N个连续字节大小的单元组成的数组。每个进程都拥有一个虚拟内存空间,在此空间上进程可以对虚拟内存进行管理和应用(例如内存映射和malloc、free等动态分配内存空间)。虚拟内存的作用(为什么需要虚拟内存?而不是直接操控物理内存):将主存可以看成是一个存储在磁盘上地址空间的高速缓存,也就是说,其功能是在主...

2019-02-23 19:24:26 388

原创 Linux系统编程——POSIX消息队列

简介    POSIX消息队列就是进程之间通讯的方式之一,其特点是以消息的形式交换数据(数据的交换单位是整个消息),POSIX消息队列和System V消息队列相比,有以下优点:消息通知特性允许一个进程能在一条消息进入之前为空的消息队列时候,异步的通过信号或者线程的实例化接收通知 Linux下可以通过poll()、select()、epoll监控POSIX消息队列打开、关闭、删除消息队...

2019-02-21 16:18:49 680

原创 链接、装载与共享库

程序执行简述 由下图编译的过程可以看出,源程序经过预处理,编译,汇编等步骤形成可重定位目标文件,再由多个可重定位目标文件链接成可执行目标文件。 每个步骤做的事情:(1)预处理(预编译),处理源代码中以“#”开头的预处理指令,如#include,#define。具体工作如下:将所有#define删除,并展开所有宏定义 处理所有条件预编译指令,如#if,#ifndef...

2019-02-09 22:08:05 152

原创 C++——vector和list简述

vectorvector概述    vector是STL中序列式容器的一种,可以理解为“可变长的数组”。与array的区别:array是静态空间,大小一旦固定就不能改变,vector是动态空间,随着元素的加入,他会有自己的机制来扩充空间以填充元素。vector的迭代器是random access iterator类型。vector小例子#include <vector&gt...

2019-01-21 14:14:29 369

原创 C++——迭代器Iterator

Iterator简介    迭代器是一个抽象的概念,其可以说是算法与容器之间的桥梁,迭代器提供一种方法,使之能够依存巡防某个聚合物(容器)所含的所有元素,而有无需暴露该聚合物的内部表达方式。    迭代器也可以看成一个行为类似指针的对象,而指针的行为主要就是内容提领(*)和成员访问(->)    根据移动特性和实施操作,迭代器分为五类:Input Iterator:迭代器所指...

2019-01-19 14:20:17 218

空空如也

空空如也

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

TA关注的人

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