自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

专注【PostgreSQL源码学习&研究】

基于PostgreSQL V13.2版本,从源码角度,全方位、图文并茂地剖析各机制的背后设计、以及底层的实现原理

  • 博客(674)
  • 资源 (3)
  • 收藏
  • 关注

原创 【0149】System V IPC之消息队列(Message Queue)

1. 概述。

2021-11-30 14:23:07 1098 3

原创 【016】 深度优先搜索算法(Depth First Search, DFS )

文章目录1. 定义2. 实现1. 定义在计算机科学中,树遍历(也称为树搜索或遍历树)是图遍历的一种形式,它指的是访问(例如检索、更新或删除)树数据结构中的每一个节点,恰好一次过程。这种遍历按照访问节点的顺序进行分类。在 树(二叉树) 一文中,我们提到过,根据访问根(root)节点的顺序的不同,可分为:先序遍历、中序遍历和后序遍历。如下图所示,其中红色圆点表示先序、绿色表示中序、蓝色表示后序。其实上面这三种(先序、中序和后序)访问树的方式均属于我们本节将重点讲解的“深度优先搜索算法(Depth

2021-11-28 14:26:11 288

原创 【017】 二叉搜索树 Binary Search Trees(一)

文章目录1. 定义2. 搜索3. 插入4. 删除1. 定义二叉搜索树(Binary Search Tree, BST)又称为“二叉查找树”,它是一种二叉树,具有以下特点:① 若它的左子树不为空,则该左子树上所有节点的值都小于根节点的值。② 若它的右子树不为空,则该右子树上所有节点的值都大于根节点的值。二叉搜索树的属性是递归的:如果我们将任何节点视为“根(root)”,则这些属性将保持为真(true)。由于二叉搜索树中的节点排序方式,按(中序)顺序遍历(左节点,然后是根节点,然后是右节点)将始终

2021-11-28 13:46:04 245

原创 【021】mongoose V7.4源码剖析之套接字fd何时准备好读写

文章目录1. 概述在《mongoose V7.4源码剖析之响应客户端报文(九)》一文中,我们详细地描述了mongoose服务器是如何响应客户端数据的过程。它是先将待响应数据写入与该连接套接字fd相关联的变量c中成员send的指针变量成员buf所执行的内存缓冲区中。然后通过mg_mgr_poll()轮询监听函数,遍历mgr管理链表中的每一个连接节点(struct mg_connection类型)c,并通过判断该变量c中的成员send中的成员len的值否大于0,从而决定是否将该套接字fd加入到select(

2021-10-23 15:20:20 314

原创 【018】mongoose V7.4源码剖析之mg_iobuf_free()函数

文章目录1. 概述2. mg_iobuf_free()函数实现1. 概述在《mongoose V7.4源码剖析之mg_iobuf_del()函数的两大特性(十)》一文中,详细地分析了mg_iobuf_del()函数的两大特性和作用,虽然函数名带有del,然而它实际上却不负责内存空间的删除与释放操作。对于变量c中接收客户端发送数据的recv成员buf缓冲区,以及响应客户端数据的send成员buf缓冲区的内存空间释放操作是由函数mg_iobuf_free()负责完成。2. mg_iobuf_free()函

2021-10-21 11:34:00 321

原创 【017】mongoose V7.4源码剖析之mg_iobuf_del()函数的两大特性

文章目录1. mg_iobuf_del()函数1.1 初始化不再使用的数据的内存地址空间1.1.1 理解memmove()函数内存重叠1. mg_iobuf_del()函数函数mg_iobuf_del()在《mongoose V7.4源码剖析之读取客户端数据(八)》 和《mongoose V7.4源码剖析之响应客户端报文(九)》两文中都有用到过。它分别用来初始化(将不再使用的数据对应大小的内存地址初始化为0)“读取客户端数据成员recv中的buf缓冲区”,以及“响应客户端数据成员send中的buf缓冲区

2021-10-20 20:41:26 418

原创 【016】mongoose V7.4源码剖析之响应客户端报文

文章目录1. 概述2. mongoose 如何响应客户端数据2.11. 概述在《mongoose V7.4源码剖析之读取客户端数据(八)》一文中,通过图文并茂的方式,详细地讲解了mongoose服务器是背后读取客户端写数据的过程和原理。作为一个web服务器,在接收、读取并处理完成数据之后,我们需要给连接的客户端响应一个HTTP报文。在mongosoe 7.4版本中,相较于读取客户端发送的数据,mongoose如何响应数据这部分逻辑更加复杂一些。主要涉及到许多的细节部分,而其中每一个细节都将对整个

2021-10-19 19:19:13 706

原创 【015】 mongoose V7.4源码剖析之HTTP特定协议回调函数

文章目录1. 特殊协议回调函数http_cb2. 详聊 struct mg_http_message3. 1. 特殊协议回调函数http_cb在《mongoose V7.4核心篇之mgr管理用户请求套接字(五)》一文的2.4小节和《mongoose V7.4源码剖析之读取客户端数据(八)》一文的3.1小节中,有提到过http_cb()函数。它是mongoose服务为了实现HTTP(应用层)协议而在源码中实现的一个特殊回调函数,它在创建mongoose监听套接字以及其关联变量c时候(更多细节请阅读《mo

2021-10-16 16:57:06 2925 16

原创 【013】mongoose V7.4源码剖析之读取客户端数据

文章目录1. 概述2. 读取客户端发送的数据1. 概述在客户端与mongoose服务器建立了连接(完成三次握手)之后,内核会为本次的通信连接创建一个未使用的最小的文件描述符fd。接着创建一个struct mg_connection类型的变量,并且与该套接字fd关联起来,并将其添加到mgr管理链表中。更多详细的细节信息阅读《mongoose V7.4核心篇之mgr管理用户请求套接字(五)》。之后mongoose服务器会定期轮询该mgr链表中的所有套接字,并使用select()多路I/O复用的方式来对每

2021-10-15 10:22:41 687 6

原创 【012】 mongoose V7.4源码剖析之mgr管理用户请求套接字

文章目录1. 概述2. mongoose如何管理用户的socket连接2.1 为客户端连接创建套接口fd2.2 连接请求并发量不能超过FD_SETSIZE2.3 为本次连接请求创建一个mg_connection变量2.4 将连接添加到mgr管理链表1. 概述拓展阅读:《mongoose V7.4之本创建管理句柄 (一)》《mongoose V7.4之创建监听端口 (二)》《mongoose V7.4之创建mg_connection网络连接(三)》《mongoose V7.4核心篇之轮询监听soc

2021-10-14 13:16:28 347 2

原创 【010】 mongoose V7.4源码剖析之创建mg_connection网络连接

文章目录1. 概述2. 创建一个connection网络连接1. 概述当成功创建了一个mgr管理句柄,以及socket监听之后,接下来需要创建一个socket网络连接。如果对创建mgr管理句柄以及socket监听流程不熟悉,请先阅读下面几篇文章,再继续本文。《mongoose-7.4之本创建管理句柄 (一)》《mongoose-7.4之创建监听端口 (二)》《mongoose-6.14源码剖析之基础篇(一)》《mongoose-6.14源码剖析之创建管理句柄(二)》《mongoose-6.14

2021-10-12 16:51:41 664

原创 【009】 mongoose V7.4源码剖析之创建监听套接字fd

文章目录1. mg_connection结构声明1. mg_connection结构声明在继续本篇及之后的系列文章阅读之前,强烈建议先去回顾之前我这边写的几篇文章,这能帮你快速地熟悉mongoose服务,包括其内部重要数据结构、大致工作原理等。《mongoose 6.14源码剖析之基础篇(一)》《mongoose 6.14源码剖析之创建管理句柄(二)》《mongoose 6.14源码剖析之绑定监听端口(三)》社区一直在维护着mongoose源码,并且版本更新较为频繁,并且每次大版本的迭代更新,都

2021-10-12 11:35:18 437

原创 【0019】 深入分析PostgreSQL中VACUUM 与 VACUUM FULL机制

文章目录1. VACUUM概述2. VACUUM分类2.1 2.2 1. VACUUM概述VACUUM是PostgreSQL中的一个辅助进程,它主要负责完成两个主要任务:删除死元组(Dead Tuples)和冻结事务ID(Freezing Tansaction Ids)。本文主要分享VACUUM删除死元组的具体过程以及底层实现;而对于另一个“冻结事务ID”任务则将单独用一篇文章来介绍,因为它需要结合PostgreSQL的 多版本并发控制 (Multi-Version Concurrency Contro

2021-09-27 13:00:02 797

原创 【0020】 一文搞懂PostgreSQL中的扩展(extension)特性

文章目录1. 扩展(`Extension`)2. 创建扩展2.1 extension目录下缺失扩展2.2 编译安装扩展2.3 扩展构成3. 扩展使用4. 总结1. 扩展(Extension)除了在 源码编译安装PostgreSQL 一文中介绍的PostgreSQL具备着“类、继承等对象数据库特征。 以及非常丰富的功能集、完善的SQL标准支持、多版本并发控制、时间点恢复、异步复制、嵌套事务、在线/热备份、预写式日志容错”等技术特征之外,它还有一个重要特点,那就是它专为可扩展性和自定义而设计的。因此,这意

2021-09-18 10:51:07 864

原创 【0021】 事务系统内核架构(理论篇)

文章目录1. PostgreSQL事务系统1. 1 示例演示1. PostgreSQL事务系统PostgreSQL的事务系统是一个三层系统。底层实现了低级事务(Low-Level Transactions)和子事务(SubTransactions),在子事务和低级别事务之上是主循环的控制代码,后者又实现了用户可见的事务和保存点(SAVEPOINT)。中间层的代码由postgresql .c在处理每个查询之前和之后,或者在检测到错误之后调用:StartTransactionCommand()Com

2021-09-11 18:54:10 255

原创 【0022】 LZ压缩算法工作原理

文章目录1. 压缩算法1.1 有损压缩1.2 无损压缩2. LZ算法2.1 LZ算法的原理3. 无损压缩算法演变历史3.1 1. 压缩算法          1.1 有损压缩1.2 无损压缩2. LZ算法     2.1 LZ算法的原理          3. 无损压缩算法演变历史3.1                                                                                   

2021-08-02 20:31:02 852

原创 【0023】 使用gdb来调试研究PostgreSQL源码

文章目录1. 前言1. 前言     在 【PostgreSQL教程】· 源码编译安装PostgreSQL 一文中,详细讲解了通过编译源码的方式来安装PostgreSQL服务的流程和细节。值得注意的是,这样编译出来的版本是不带调试信息符号表的。如下图所示,postmaster可执行文件中当前共有30个段表,但是该段表中不存在与调试信息(与调试信息相关的段均已.debug_开头)相关的符号表。     因此,在postmaster服务出现某些底层内核问题(比如访问非法内存,发送SIGSEGV信号)的时

2021-07-01 20:48:12 835

原创 【0040】 PostgreSQL数据库表文件底层结构布局分析

文章目录1. 表文件1. 表文件    PostgreSQL提供了可靠、稳定、有序的数据存储、检索管理。即使在不知道其背后运行原理的情况下,也没有多大关系,因为我们只需要按部就班地执行建库、建表然后插入数据结构这几个流程,就可以如愿以偿地实现将我们的数据持久化于PostgreSQL数据库中。于是我们不得不好奇,这些数据最终落盘于磁盘上的哪个位置?又是以什么样的形式存储?存储的格式又是什么? 在这几个疑问的驱动下,本文将通过源码结合数据入库实践操作的方式,来详细地对PostgreSQL底层数据的存储方式进

2021-05-21 16:35:35 1518 4

原创 【0009】 postmaster.pid文件都存储了什么?

文章目录1. postmaster.pid是什么文件?1.1 postmaster.pid文件位于哪?1.2 postmaster.pid文件中都有什么数据?2. postmaster.pid文件的创建过程1. postmaster.pid是什么文件?1.1 postmaster.pid文件位于哪?1.2 postmaster.pid文件中都有什么数据?2. postmaster.pid文件的创建过程     postmaster.pid文件的创建入口是函数CreateDataDirLockFil

2021-03-02 21:52:53 630

原创 【026】 二叉树转换为双向链表

文章目录1. 二叉树转换为双向链表1. 1 二叉树节点数据类型声明1. 2 示例代码1. 二叉树转换为双向链表1. 1 二叉树节点数据类型声明     在 数据结构 · 树(二叉树) 一文中,详细的概述了二叉树的各种分类与特性,同时也用数组(顺序存储)方式来实现了二叉树的存储与遍历。显而易见,使用数组方式实现二叉树,视树的情形不同,对内存的空间浪费也大有所异(除非该二叉树是满二叉树),并且,使用数组来实现二叉树,非常具有局限性,这与用数组实现其他数据类型(比如队列、栈等)一样。因此需要使用动态的方式

2021-01-18 22:17:05 524 2

原创 【027】 树(二叉树)

文章目录1. 二叉树1. 1 二叉树定义1. 2 二叉树图示法2. 二叉树性质3. 二叉树分类3. 1 退化二叉树(Degenerate Binary Tree)3. 2 平衡二叉树(Balanced Binary Tree)3. 3 满二叉树(Perfect Binary Tree)3. 4 完全二叉树(Complete Binary Tree)3. 5 全二叉树(Full Binary Tree)4. 二叉树遍历5. 二叉树存储6. 二叉树常见操作1. 二叉树1. 1 二叉树定义     在一棵

2020-12-15 22:58:37 255

原创 【028】 树(概念篇)

文章目录1. 前言1.1 为何引入树数据结构2. 树3. 术语3.1 树的度3.2 节点的度3.3 叶子节点3.4 深度3.5 高度3.6 父亲节点(父节点)3.7 孩子节点(子节点)3.8 兄弟节点3.9 节点的层次3.10 堂兄弟节点3.11 子孙3.12 节点的祖先3.13 森林点4. 树的种类4.1 无序树(自由树)4.2 有序数4.2.1 二叉树4.2.1.1 完全二叉树4.2.1.2 满二叉树4.2.1.3 平衡二叉树(AVL)4.2.1.4 排序二叉树(BST)4.2.2 B树4

2020-12-08 00:21:30 201

原创 【029】 栈(链式存储)

文章目录1. 链表栈2. 链表栈实现2.1 链表栈节点类型声明2.2 链表栈操作2.2.1 初始化栈2.2.2 入栈2.2.3 弹栈2.2.4 获取栈顶元素2.2.5 判栈空2.2.6 遍历栈2.2.7 获取栈大小3. 完整示例代码1. 链表栈     在 《数据结构 · 栈(顺序存储)》 章节里,详细讲解了栈的功能特性,以及常见操作。同时还使用顺序存储(数组或是指针变量)的方式来实现了栈的功能。但是使用数组来模拟/实现栈,具有局限性及低效性,因为它只对固定数量的数据值有效。这也就意味着,在实现栈的

2020-12-05 10:39:57 303 4

原创 【031】 队列(链式存储·循环队列)

文章目录1. 概述1. 概述     在《数据结构·队列(链式存储,C实现)》一节,讲解了使用单链表方式来实现队列的功能。本节将着重描述如何使用单链表方式来实现循环队列。                                                                                                                   ...

2020-12-03 12:26:04 994

原创 【032】 队列(顺序存储)

文章目录1. 队列2. 队列操作3. 循环队列1. 队列    队列是一种使用较为广泛的线性表,即同类型的数据元素的有序集合。它的特性与栈不同,插入与删除发生在两个极端;一端用来进行元素插入,另外一端用来进行元素删除。和栈刚好相反,队列是一种先进先出(FIFO, First-In-First-Out)的抽象数据结构,先入队列的元素,将先被访问获取,后入队列的将被最后访问。队列通常用于解决各种系统资源程序,比如操作系统任务调度,就充分利用到队列的先进先出特性;又或者计算机中的某些资源共享,需遵循同步原则,

2020-12-03 00:25:44 361

原创 【033】 队列(链式存储)

文章目录1. 概述2. 队列的链式存储2.1 链式队列初始化2.2 入队列2.3 出队列2.4 获取队列头元素2.5 获取队列大小2.6 队列判空2.7 队列遍历1. 概述    在《数据结构·队列(顺序存储)》一文中,已详细讲解了队列的特性以及使用数组来实现队列的基本操作。队列也是属于线性表,因此,它也支持使用链表的方式来实现其先进先出(FIFO)特性。本文主要描述如何使用链式存储结构来模拟实现队列(包括循环队列链表)。    使用链式存储结构的好处是,入队列节点元素不受客观约束限制,只要内存空间足

2020-12-03 00:07:01 314

原创 【034】 栈(顺序存储)

文章目录1. 栈2. 栈的存储方式3. 栈的常见操作3.1 初始化栈3.2 入栈3.3. 出栈3.4 获取栈的长度3.5 判断栈空3.6 遍历栈1. 栈     栈是一种使用较为广泛的数据结构,常用在:内存管理、匹配括号、表达式求值、回溯(游戏、寻找路径、穷尽搜索)等,后面讲解编译原理时,将会用到栈数据结构。它同时也是属于一种特殊的线性表,只允许在同一端进行操作。允许操作的端(插入元素、删除元素)称为栈顶,另外一端称为栈底。位于栈顶部的元素是栈顶元素,相反,位于栈底部的元素是栈底元素。栈中的所有元素个数

2020-11-30 22:25:04 429

原创 【035】 链表(顺序存储)

一、前言     《数据结构》是每个程序猿都应该掌握的“必修课”。虽不及其他招式花哨、但却总能在关键时刻成为”必杀技”,给人致命一击。熟练掌握《数据结构》,能够间接、明显地提升你的编码技能与思维;同时,还能加速定位问题、解决问题的能力。“数据结构”中常见的类型有:数组、链表、栈、队列、图、树、堆和散列表。不同的数据结构类型均有自己独特的数据存储方式,以及优缺点。在擅长的方面,能够大显神威,发挥出光与热;而在不足面,则显得。                                   

2020-11-28 15:17:38 548 2

原创 【015】 双向链表实现日志记录框架库

文章目录1. LWlogc简介1.1 LWlogc特性1.1 lwlog.properties 配置文件1.1.1 lwlog.File1.1.2 lwlog.MaxBackupIndex1.1.3 lwlog.MaxFileSize1.1.4 lwlog.Threshold2. LWlogc代码架构2.1 LWlogc日志记录库布局图2.2 LWlogc服务启动流程2.3 使用LWlogc2.4 LWlogc内存、cpu占用3. LWlogc依赖库1. LWlogc简介​      L

2020-08-20 12:45:49 738

原创 C++11 委托构造函数(delegating constructor)

文章目录1. 委托构造函数2.3.4.1. 委托构造函数     委托构造函数(delegating constructor) 是C++11中新引入的一个新特性. 它是对C++98版本中的构造函数的一个改进. 所谓"委托构造函数", 就是使用它所归属类的其他构造函数来执行它自己的初始化操作. 换言之, 就是它把自身需要做的一些初始化操作任务交付给了其他的构造函数来完成.      为了让上述的描述更加通俗易懂, 不妨结合下图来理解C++11中的委托构造函数新特性的功能. 如图1, 班主任要求A、B、C

2020-07-21 17:34:31 772

原创 cJSON_Delete源码剖析

文章目录1. 释放cJSON结构体变量2.3.1. 释放cJSON结构体变量     见名知意, cJSON_Delete 函数用于释放一个cJSON结构体变量所申请的内存空间. 在阅读本章节内容之前, 我强烈推荐你先阅读 cJSON数据组装框架 章节, 这对你理解本节内容有很重要的帮助.      先附上cJSON_Delele函数的内部代码实现:void cJSON_Delete(cJSON *c){ cJSON *next; while (c) { next=c->ne

2020-07-17 10:22:10 2597 2

原创 RapidJSON报错: The document root must not be followed by other values.

文章目录1. 问题陈述2. 问题排查3. 问题现象4. 解决方案5. 结论1. 问题陈述     首先, json报文语法格式是正确无误的, 使用json在线工具解析ok. 而且出现的问题现象是: 相同的报文格式, 有的解析成功; 而有的解析失败。比如报文:[ { "name": "lixiaogang5", "sex": "男", "address": "guizhousheng" }]     概率性的某些同格式的json解析失败。解析过程: docume

2020-05-12 10:54:21 6019 2

原创 DNS域名系统详解

文章目录1. DNS概述2. DNS报文格式3. DNS应用场景4. DNS实战分析5. 总结1. DNS概述     当你想在某个浏览器中打开Chrome、Firefox、Bing等搜索引擎时,脑海里第一时间是想到输入:www.google.com(域名),还是输入ip地址:172.217.11.68. 习惯性地,都是输入域名地址,因为字符更容易被记住。比如,不用刻意,我们都能够轻易地记住淘...

2020-04-28 19:45:16 711

原创 TCP/IP之ARP详解

文章目录1. ARP概述2. ARP首部结构3. ARP工作原理3.1 ARP缓存3.24. ARP攻击5. 总结1. ARP概述                         2. ARP首部结构                         3. ARP工作原理3.1 ARP缓存     每一次的网络通信,应用层的数据都需要经过从应用层到物理层的封装步骤,即数...

2020-04-01 10:48:51 2153

原创 TCP/IP之网络层详解

文章目录1. 概述2. Wireshark与TCP/IP协议族对应关系3. IP标头3.1 IP标头结构类型声明3.2 IP标头图表3.3 IP标头各字段含义3.1.1 版本(Version)3. 总结1. 概述     网络层(Network Layer)位于TCP/IP协议族的第三层,它主要作用是负责在网络上的设备之间传输数据信息。在传输数据时,它将一个包含目的主机IP和源主机IP地址的标...

2020-03-27 18:16:18 498

原创 TCP/IP之传输层详解

文章目录1. 传输层特征2. 传输层协议2.1 TCP协议2.2 UDP协议3.1. 传输层特征     传输层位于TCP/IP协议族中的第4层,负责在网络主机中创建虚拟传输控制协议TCP,或用户数据报协议UDP,也叫“Transport Layer”。此层向其主机上运行的应用程序发送和接收数据。传输层将端口号分配给在主机上的应用程序中运行的进程,并将TCP或UDP标头添加到从应用程序接收的消...

2020-03-25 15:16:43 834

原创 【0004】 关于PostgreSQL数据库版本从9.2.24升级到PostgreSQL11.5的方案

文章目录一、 目的二、 风险评估三、 实施步骤四、 结果五、 注意一、 目的     当前设备中使用的PostgreSQL数据版本是9.2.24 。 而PostgreSQL官方最新的版本是12.2。 已经迭代了三个大版本,中间每个大版本又有若干个次版本的迭代更新。在每次的迭代过程中,都有许多的隐藏缺陷修复以及性能的提升,包括CPU、内存占用、磁盘读写、网络I/O、索引逻辑等等。为了提升设备中...

2020-03-25 10:23:54 2183

原创 内存对齐(Memory alignment)

文章目录1. 眼见并非总是为实2. 何为「内存对齐」2.1 为何需要「内存对齐」3.1. 眼见并非总是为实     在 C语言之结构体 章节里,对struct的功能和使用进行了详细的说明。「内存对齐」章节作为struct的一个扩充知识。事实也证明,实际开发中,关注结构体内存布局特性的同事寥寥无几。甚至某些同事表示从未去留意过声明的结构体所占用内存空间大小,他们会感到诧异、惊讶,为何声明的是同一...

2020-03-11 17:36:29 664 4

原创 Mongoose-6.14源码剖析之绑定监听端口

文章目录1.2.3.1.2.3.                    

2020-02-25 13:57:25 1314 2

原创 Draw.io-专业绘图工具

文章目录1. Draw.io介绍2. Draw.io使用2.1 进入Draw.io2.2 绘制图表3. 绘图样本1. Draw.io介绍     工欲善其事必先利其器。一款优秀而又强大的工具,能够给你的办公效率带来质的飞跃;如果碰巧你也正好是一名Linux爱好者且爱好写博客分享知识,那么这款Draw.io绘图工具将会是为你而量身打造。因为它是跨平台的,兼容Linux、Windows和macOS...

2020-02-24 17:58:05 5044

空空如也

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

TA关注的人

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