自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 资源 (1)
  • 收藏
  • 关注

原创 【go学习笔记】database/sql实现分析

文章目录前言代码框架Driver接口连接池管理策略相关用户接口实现rowsStmtmysql驱动实现细节总结前言后端程序主要是数据驱动型的,因此大多数后端应用也就主要涉及几类和数据相关的操作:读数据,写数据,处理数据。其中,读写是处理的基础。读写操作必然涉及编程语言和各种各样数据库的交互,因此任何后端编程语言都必须提供良好的数据库交互接口方便程序读写数据。本文主要是介绍golang的数据库操作...

2019-02-14 20:07:12 1430

原创 lua虚拟机--lua函数调用

前言数据栈函数调用字节码CALL指令虚拟机实现调用栈总结前言本文介绍lua虚拟机中是如何实现lua函数调用的,不涉及C函数的调用。除了通过介绍栈帧结构来了解函数调用的过程,还将对lua支持不定长参数函数的实现进行深入分析。下面我们具体分析lua在调用CALL指令前后栈的变化。数据栈函数调用字节码对以下的lua函数调用代码:...

2018-06-27 04:02:37 1817

原创 Tars源码分析---智能指针的实现

前言TC_AutoPtrTC_HandleBaseT构造函数赋值重载析构函数小结TC_ScopedPtrTC_SharedPtrtc_shared_count_basetc_shared_count_impl_ptc_shared_count_impl_pdTC_EnableSharedFromThis构造函数赋值重载总结前言...

2018-06-25 20:18:21 1038

原创 Tars源码分析---线程池实现

前言TC_ThreadThreadWorkerTC_ThreadPoolTC_ThreadQueue总结前言Tars底层实现了一个线程池库,主要源代码位于tc_thread_poo.(cpp,h)文件中。线程池队列涉及的核心是工作线程和任务队列的设计。本文基于tars中的实现进行介绍。TC_Thread线程池的工作线程类(ThreadWo...

2018-06-24 19:18:07 1643 1

原创 Tars源码分析---内存哈希表的实现

前言基本原理前言在cpp/util中实现了基于内存的哈希表(hashmap.(cpp,h))。该哈希表支持dump到文件,以及从文件load到内存。在实现上,它基于传统的开链哈希,分别为每个哈希桶维护一个block链表,相同哈希值的kv对散列存储到相同的block链表中。链表中每个block存储具体的一个kv数据。由于hashmap使用TC_Mem...

2018-06-23 12:37:29 1393

原创 Tars源码分析----Application

前言前言

2018-06-17 20:38:24 3325 1

原创 Tars源码分析---TC_EpollServer

前言架构IO_Thread PoolHandler PoolAdapter总结前言这个系列的文章主要分析腾讯的开源RPC框架Tars。Tars除了提供RPC服务之外,还配套了一整套的运营管理平台。它同时支持C++,java等多种编程语言。本系列主要是分析tars的cpp部分实现,涉及的版本是github上最近release的1.40版。主要是在源...

2018-06-15 21:07:01 1755 1

原创 makefile规则之order-only依赖 ----- |

最近在看caffe的代码,首先不得不说caffe的代码写的这是结构清晰,代码简洁。后续我也会写关于caffe源码解析的博文。今天主要是看一下makefile规则里面的一个order-only依赖规则。我们都知道makefile构建工程的基本语句是:targets : prerequisites command这句构造语句可以简单理解为,根据prerequisites中的文件...

2018-04-05 21:06:56 2239

原创 Nginx源码剖析--连接池

前言NGINX是一个http服务器。http基于tcp协议,tcp是基于连接的协议。也就是每个http请求都要在某个TCP连接上。在NGINX中,用一个结构体表示连接:struct ngx_connection_s每个连接都用一个ngx_connection_s结构体表示。每次监听socket accept到一个新的连接都会”新建”一个新的ngx_connection_s对应到这个

2017-12-15 22:20:14 798

原创 Nginx源码剖析--ngx_http_optimize_servers函数分析

前言本章将继续介绍HTTP模块初始化函数:ngx_http_block中的内容。将会涉及到server块的组织,监听端口的管理,以及ip地址和server块之间的组织关系。下面我们将从listen关键字说起,然后根据listen配置项以及它的解析函数了解nginx组织server块和监听端口的过程。最后在介绍ngx_http_optimize_servers函数。所有这些工作都是为了实现Nginx的

2017-12-03 00:13:21 876

原创 Nginx源码剖析--HTTP请求各阶段的具体作用

前言Nginx将HTTP请求分为11各阶段进行处理。每个阶段包含零到多个handler处理函数。分阶段处理的目的是增加灵活性,方便模块介入。HTTP请求处理主要分为一下11个阶段:typedef enum { NGX_HTTP_POST_READ_PHASE = 0, NGX_HTTP_SERVER_REWRITE_PHASE, //对server对应的uri的转换 NGX_HT

2017-11-26 10:37:29 684

原创 Nginx源码剖析--HTTP请求的分阶段处理的初始化

前言Nginx作为一个http服务器,核心任务就是处理HTTP请求。在接收到请求时,Nginx框架首先解析http请求,将解析结果放在ngx_http_request中,由于http是在tcp上工作的,因此解析可能会持续一段时间。nginx用状态机完成对HTTP请求的异步解析。整个解析过程都是由Nginx框架代码完成,不需要用户介入。当解析得到完整的http请求后,就开始处理http请求。ng

2017-11-16 15:42:57 551

原创 Nginx源码剖析--HTTP模块初始化概述

前言前面讲了HTTP模块配置结构体的组织以及各个server,location块为了能够实现快速查找而使用的组织数据结构。这些内容都属于HTTP模块的初始化部分。除了之前讲的内容之外,HTTP初始化还包括其他内容。我们将在这部分讲述这些内容。对HTTP模块的初始化是从‘ http’关键字开始的。也就是说,当配置文件解析器在配置文件中读到http关键字,则会开始根据http块中的配置信息初始化http

2017-11-10 15:40:34 831

原创 Nginx源码剖析--server和location的组织

前言我们知道,Nginx的配置文件的http块中一般会存在多个server块,每个server块中也会有多个locations块,而每个location块中也允许有多个location块。前面我们在分析http模块的配置结构体的时候也看到,这些块是通过上一级的ngx_http_core_module模块创建的配置结构体管理的。比如http块中的所有server块都是由ngx_http_core_mo

2017-11-04 17:04:37 1543

原创 Nginx源码剖析--HTTP模块配置信息的merge

前言考虑有如下形式的配置文件:http{ .... server { ..... location { ..... } }}根据前面的讲解,Nginx会为每个http块,server块和location块创建一个ngx_http_conf_ctx_t结构体。这个结构体主要是为了管理各个模块的main_conf,srv

2017-10-27 15:08:20 612

原创 training set, validation set, test set的区别

首先安利一下一个机器学习的入门在线课程:台湾大学机器学习以及关于上面这个问题的一个解答:解答大四做毕设的时候就有这个问题,当时没想明白,后面一直疑惑不解,直到今天才搞懂。首先写一下结论:training set: 用来训练模型validation set : 用来做model selectiontest set : 用来评估所选出来的model的实际性能我对这三个名词的疑惑主要是由于一下几个

2017-10-22 17:54:58 22394 3

原创 Nginx源码剖析--HTTP模块配置结构体在conf_ctx中的组织

前言http模块配置结构体组织架构问题解决方案总结前言上一篇文章介绍了event模块的配置结构体的初始化以及模块中的一些初始化函数,比如init_process函数。这些工作都是在服务器启动之前必须完成的。 在介绍event模块的配置结构体初始化时,我们知道event模块的解析是从events{}“events”关键字开始的。也就是说与event模块相关的所有配置项都必须在配置文件的ev

2017-10-21 15:00:40 1192 2

原创 Nginx源码剖析--event类型模块

目录目录前言核心模块几种event模块ngx_event_core_moduleepoll和kqueue等功能性的event模块嵌入到Nginx框架中总结前言前面梗概介绍了Nginx模块配置的信息。简单地说,nginx的灵活性主要归功于他的高度模块化和可配置性。其中可配置性依赖于配置文件。在nginx中,模块就是一个struct类型的全局变量。Nginx通过为每个模块维护一个配置结构体

2017-10-13 13:57:59 653

原创 Nginx源码剖析--模块配置信息初始化

目录目录前言关于conf_ctxNginx中的模块Nginx模块的形式ngx_module_s配置文件解析框架前言前面在介绍ngx_cycle_t结构体的初始化时,我们深入到了ngx_cycle_init函数中。在那里我们说过,对ngx_cycle_t->conf_ctx的初始化是占篇幅最大的一部分。而之前我们在介绍ngx_cycle_t结构体中

2017-10-01 13:21:45 565

原创 gcc -c

昨天玩opengl,找了一个代码跑了一下,首先编译,然后运行。编译顺利通过,但是运行的时候一直说二进制文件不能执行,很是郁闷。后来才发现是它gcc选项的问题。它用了 gcc -c,而这个选项生成的是没有链接时的目标文件,因此自然是不能执行的。毕竟需要把相关的库啊之类的链接进去才能组成一个完整的可执行程序。

2017-09-30 21:12:14 605

原创 Nginx源码剖析--ngx_cycle_t的初始化

前言前一篇介绍了ngx_cycle_t中各个成员的具体含义,虽然许多成员具体作用和实现方式我们没有深究,但也有了一个初步的了解。这篇文章将介绍ngx_cycle_t的初始化过程,主要是在ngx_init_cycle函数中完成的,之所以说主要,因为ngx_cycle_t的初始化还会依赖于一个old_cycle,这个old_cycle的初始化是在main中完成的。ngx_init_cycle的函数原型如

2017-09-30 19:19:14 847

原创 Nginx源码剖析--ngx_cycle_s结构体分析

前言Nginx框架是围绕着ngx_cycle_t结构体运行的。ngx_cycle_t结构体中包含的信息主要可以分为以下部分:所有模块的配置信息Nginx运行时所需要的一些资源,包括连接池,内存池,打开文件,操作目录等等本文将详细介绍ngx_cycle_t结构体所包含的内容。ngx_cycle_t结构体的内容struct ngx_cycle_s { //保存所有模块的配置结构体

2017-09-30 16:03:02 1398

原创 nginx源码剖析--从main函数开始

八九月份找好工作之后,着实懒散了一段时间。现在回想起来,九月份没有做一件有意义的事情,成天都是胡思海想。现在工作基本上定下来了,打算这段时间直到毕业,好好学习几个方面的知识:后台开发数据存储后台开发上主要是打算吃透nginx。为了达到这个目的,这段时间会写一系列的nginx源码剖析的文章。由于水平实在有限,可能会写相当长的时间,并且写的时候也会有许多问题。不过我总是会尽自己最大的努力的。想起来

2017-09-30 14:22:52 861

原创 从云风的coroutine库学习协程

协程又被称为微线程,不过其实这样的称呼无形中为理解协程增加了一点阻碍。协程本质上是在一个线程里面,因此不管协程数量多少,它们都是串行运行的,也就是说不存在同一时刻,属于同一个线程的不同协程同时在运行。因此它本身避免了所有多线程编程可能导致的同步问题。协程的行为有点像函数调用,它和函数调用的不同在于,对于函数调用来说,假如A函数调用B函数,则必须等待B函数执行完毕之后程序运行流程才会重新走回A,但是对

2017-07-28 18:45:29 2626

原创 leveldb源码剖析---迭代器设计

本篇主要介绍leveldb中的迭代器设计。迭代器设计封装了leveldb中的所有遍历操作。一个好的设计思想应该是:每个存在容器的地方,就应该有对应容器的迭代器的设计。leveldb是一个容器,leveldb中的每个level中的所有文件组成一个容器,进行merge时,所以待合并的文件集也是一个容器,当然每个sstable文件本身也是一个容器,等等。因此,为每个容器设计一个迭代器,封装访问容器的细节是

2017-05-08 19:44:30 3157

原创 leveldb源码剖析---缓存系统

通过前面的分析可以知道,leveldb为了提高写的性能,牺牲了部分的读性能。最差的情况可能需要遍历各个level中的每个文件。为了缓解读性能,leveldb引入了缓存机制,当然,版本信息中包含各个level的文件元信息在一定程度上也可以提高读性能。leveldb提供的缓存系统的底层数据结构是一个开链哈希class ShardedLRUCache : public Cache : LRUCach

2017-04-24 17:01:49 962

原创 leveldb源码剖析---日志系统

前言日志就是记录数据库增删记录的文件。之所以需要记录这些东西,主要是为了防止万一数据库运行期间异常崩溃导致的数据丢失。而之所以会出现数据丢失,原因在于我们在往数据库中写数据时,并不是真的将数据库写入到了磁盘中,而可能只是将数据暂存到内存中而已。如果在数据flush到磁盘之前系统崩溃(数据库bug,操作系统bug,机器故障等等),那缓存在内存中的数据就会丢失,而用户以为这些数据已经成功写入数据库了(这

2017-04-05 13:38:14 2192

原创 leveldb源码剖析---版本管理

所谓的版本,简单地说,指的是leveldb中各个level层的文件信息。显然,随着compaction的进行和新的memtable写入生成新的sstable,版本会不断变化。版本除了记录各层的文件信息外,还记录各层关于compaction的的信息,比如在对于当前版本,最适合进行compaction的level是哪层,以及这层中最适合compaction的是哪个文件等信息。和版本相关的类主要是以下三个

2017-03-29 13:19:26 1910 4

原创 leveldb源码剖析----compaction

根据恰面的分析,背景线程的主体工作在BackgroundCompaction函数中完成。这个函数主要完成以下两个工作:如果imm_非空,则将imm_写入到磁盘中生成新的sstable文件对level中的文件进行合并。合并的目的主要是避免某个level中sstable文件过多,并且可以通过合并的过程删除掉过期的key-value和被用户删除的key-value。这篇文章主要是从Backgroun

2017-03-28 18:11:18 2643 1

原创 leveldb源码剖析---DBImpl::MakeRoomForWrite函数的实现

前言前面我们说过,leveldb用户通过调用write或者put函数向数据库中写入数据实际上是将数据写入到levedb的Memtable中。我们也曾经提到过,leveldb中有两个MemTable,分别是imm_和mem_,其中imm_是不可写的,因此实际上我们将数据写入到mem_中。leveldb提供持久化,也就是需要将内存中的数据保存到磁盘上,也就是前面说的以sstable的形式将数据持久化。在

2017-03-27 16:34:28 2542

原创 leveldb源码剖析--数据写入(DBImpl::Write)

前面我们介绍了leveldb中数据的编码 ,数据在内存中的存储形式(MemTable),数据在磁盘中的存储格式(sstable),以及sstable的形成过程等等。本篇博文将从leveldb用户的角度,详细走一遍leveldb用户写入数据的整个流程。接口leveldb对用户提供两个可以写入数据的接口: Status Write(const WriteOptions& options, WriteBa

2017-03-27 13:50:57 3823 2

原创 leveldb源码剖析---filter block

前面我们分析了leveldb中的index block和data block。这里主要是分析filter block。filter block属于一种metadata block,它的构造主要由FilterBlockBuilder完成。filter block的作用就是提供快速判断一个key是否存在于某个datablock中,以加速查找的过滤器。回忆在分析TableBuilder的Add函数时,每

2017-03-26 17:33:34 2423

原创 leveldb源码剖析--key-value形式的Block块中的数据存储格式

前言前面我们介绍了sstable的存储格式,在介绍sstable时,我们主要关注的是sstable的空间布局,主要是以block为单位。但是具体block里面是怎么存储数据的,我们并没有做过多的介绍。在前面一篇介绍TableBuilder的文章中,我们知道TableBuilder主要是负责生成sstable文件,而且正如我们之前所说,TableBuilder负责的是宏观的sstable生成,具体到数

2017-03-26 13:58:43 2120

原创 leveldb源码剖析--TableBuilder生成磁盘sstable

TableBuilder 将数据写入磁盘生成sstable的工作由TableBuilder类完成。顾名思义,TableBuilder负责中封装了sstable的生成格式,它对用户的接口主要是void Add(const Slice& key, const Slice& value);函数,从函数的形式我们也可以看到,就是将键值对逐次加入到sstable中,而至于sstable中的其他管理块,比如in

2017-03-25 21:24:15 1968

原创 将数组分成两部分,使得这两部分的和的差最小

将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小。比如对于数组{1,0,1,7,2,4},可以分成{1,0,1,2,4}和{7},使得这两部分的差值最小。思路:这个问题可以转化为求数组的一个子集,使得这个子集中的元素的和尽可能接近sum/2,其中sum为数组中所有元素的和。这样转换之后这个问题就很类似0-1背包问题了:在n件物品中找到m件物品,他们的可以装入背

2017-03-25 19:13:56 13720 2

原创 leveldb源码剖析--MemTable

前言根据前一篇可以知道,leveldb在磁盘中的存储模型是sstable,sstable总的来说就是存储一个一个的key-value信息序列以及一些管理信息。用户一般是通过leveldb的用户接口Status Put(const WriteOptions&, const Slice& key, const Slice& value);或者Status Write(const WriteOptions

2017-03-24 16:00:47 1144

转载 产生死锁的必要条件和解决方法

死锁:多个进程为了竞争资源而造成的僵局,如果没有外力作用,这些进程将再也不能向前推进。产生死锁的原因: 1. 竞争系统资源 2. 进程的推进顺序不当产生死锁的必要条件:互斥条件: 进行要求对其分配的资源进行排他控制,即在一段时间内某资源只能为这一个进程享有。请求和保持条件:当进程因请求资源而阻塞时,对已经获得的资源保持不放不剥夺条件: 进程的资源只能由自己释放环路等待条件:在发生死锁时

2017-03-22 00:01:14 590

原创 leveldb源码剖析-sstable

leveldb中存储数据的文件格式称为sstable。它的存储格式如下图所示 从sstable的格式可以看出,在一个sstable文件中,除了包含核心的key-value数据的data block区域外,还有其他几个数据区。这些额外的数据区域主要是用于组织data block,使得在读的时候可以快速地从sstable中找到所查找的key对应的value。下面我们来分析一下sstable中的各

2017-03-20 15:03:24 1321 1

原创 leveldb源码剖析--编码

leveldb是一个google出品的单机kv数据库。用C++编写,代码量很小,大概只有1~2万行。代码写的可以用优雅来形容,毫无疑问是我至今看到的最优雅的c++代码。而且由于代码量比较小,可以直接通读整个源码,了解一个完整的kv系统的构建流程。是一个很好的学习材料。这也是我第一次读数据库方面的源码,尝试用博客记录阅读过程。在阅读源码的过程中,感觉自己有了很大的提高。希望再写一遍,把这种提高深刻以下

2017-03-19 21:41:11 2665 6

转载 C语言中的变长数组 data[0]

本文装载自:http://www.cnblogs.com/Anker/p/3744127.html主要是在看leveldb源码时, SkipList::Node里面的port::AtomicPointer next_[1]定义有点不解,因此上网搜到下面这篇讲解,做个笔记。前言今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可能为0呢?于是上网搜了一下这

2017-03-14 19:18:15 824

Introduction to Algorithms 3rd - 副本.pdf

《算法导论》,MIT算法课的教材,非常经典。是深入学习算法技术的必备书籍。 PDF是文本型的,非图片。因此非常清晰,也比较小。

2015-07-11

空空如也

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

TA关注的人

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