自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 postgres源码学习之简单sql查询

查询操作调用顺序为PortalRun–>PortRunSelect–>ExecutorRun–>standard_ExecutorRun–>ExecutePlan。,我们可以看到,当有新的连接通过权限认证之后,将进入等待接收sql语句,并执行sql语句的过程。涉及到查询结果返回的,会调用到printtup函数。建立连接后,服务端postgres就等待接收命令。中介绍的结果集存储有着相似的地方。参考postgres的处理流程。其输出形式和之前介绍的。

2025-02-19 19:48:02 570

原创 postgres源码学习之登录

postmaster_child_launch函数调用传入的第一个参数为B_BACKEND,所以新进程将进入BackendMain函数进行处理。从调用栈中不难看出,master的会在ServerLoop函数中进行循环接收新的连接,并创建新的进程处理该连接。忽略其中的细节,不难看出实际上调用了postmaster_child_launch函数,其主要内容如下。新的子进程启动后,对该连接进行权限认证,如果认证通过后,将等待客户端输入sql语句。完成权限认证后,子进程将进入idle状态,等待sql输入。

2025-02-19 18:00:08 799

原创 postgres源码学习之准备工作

CFLAGS=“-g3 -O0” CPPFLAGS=“-g3 -O0” 这两个参数配置的意义主要是为了后续可以方便的进行gdb单步调试。通过上一节的配置,使用pgsql test即可进行sql语句的执行;源码安装可参考https://www.postgresql.org/docs/17/install-make.html。当使用psql或者dbeave连接后,通过ps aux | grep postgres会发现多出来连接进程;然后可使用dbeaver,进行连接验证。源码下载后,进行解压。

2025-02-19 17:58:58 329

原创 Mysql Resultset 解析记录

每个字段的定义包括,字段头+字段体,字段头的定义与前面的header定义相同,而后定义的是字段的各个内容,包括catalog、database_name,table_name,orig_table_name,column_name, orig_column_name,字符集索引,字符集长度,列类型,列标识及列精度;

2025-01-29 10:00:48 1196

原创 Debian source_list首次踩坑

个人首次使用Debian,对镜像源的各个字段含义其实不是很清晰,通过百度AI引擎拿到答案后,就直接用了;出现问题后,依然是继续搜索,发现进入了死胡同。换了一个思路后,恰好找到了解决方案,也算是运气好了,要不然会花费更多的时间进行处理。事实上,在发现apt install g++失败后,我也是使用了DeepSeek进行提问,查找答案的;给出的答案是使用aptitude install进行解决(确实是常用技能);但事实上更深层次的问题竟然是起始配置的错误。

2025-01-08 10:17:32 1038

原创 suricata源码编译从Centos迁移到Debian过程记录

操作系统切换后,或多或少都会有一些意想不到的问题存在;好在有正确的版本可参照执行比如cbindgen可通过回退版本得到解决。此外,gcc -std=c11及-std=gnu11的差异点,还需进一步研究。

2025-01-07 15:39:39 1327

原创 More Effective C++之技术Techniques,Idioms,Patterns_条款26-27

对于限制class的数目,我们最常见的做法是使用单例模式,将构造函数定义为私有,然后定义一个static对象,可定义于class中,亦可定义在static 函数中,然后用户通过该static函数返回一个对象,本条款建议定义在static函数中。该小节主要是利用了内存分配机制,栈空间地址通常位于高位地址,堆空间通常位于地位地址空间,但是该判断对于可移植性不是很强,以此为依据写出来的代码通用性不是很强,此处就不做过多的介绍,本条款介绍两种场景,一种是对象只产生于heap中,另一种是禁止对象产生于heap中;

2024-12-25 23:08:45 668

原创 More Effective C++之技术Techniques,Idioms,Patterns_条款25

本章描述C++程序员常常遭遇的一些问题的解决办法,这些解法都已获得证明。本书把这样的解法称为techniques(技术),也有称为idioms(惯用手法)或patterns(模式)。不论如何称呼它们,当每天与软件开发过程中的各种小冲突搏斗时,本章提供的信息可以带给我们很多帮助。

2024-12-23 22:47:21 1201

原创 More Effective C++之效率Efficiency_下

虚函数真正的运行时期成本发生在和inlining互动的时候。有时候我们的确会有正当的理由回避编译器所产生的服务,例如隐藏的vptrs及“指向virtual base classes”的指针,可能会造成“将C++对象存储于数据库”或“进程(process)边界间搬移C++对象”时的困难难度提高,所以我们可能会希望以某种方式模拟这些性质,使C++对象较易完成其他工作。程序中的每一个class凡声明(或集成)虚函数这,都有自己的一个vtbl,而其中条目(entries)就是该class的各个虚函数实现体的指针。

2024-12-22 23:14:59 738

原创 More Effective C++之效率Efficiency_中

但是观念和实物之间,有一个名为“优化”的黝黯地带,有时候我们可以以某种方式撰写“返回值为一个对象”的函数,使编译器得以将临时对象优化,使它不复存在。“以一组输入数据作为程序或程序库的典型用途”不只是件困难的事,就算有这样的数据,也是没用的,除非我们有一个可信赖的方法足以决定客户的“典型”程度。命名对象、匿名对象、编译器优化等相关讨论度相当有趣,但是我们不要忘了本条款的主题:操作符的“复合版本”(例如,operator+=)比其对应的“独身版本”(例如,operator+)有着更高效率的倾向。

2024-12-22 18:20:05 1034

原创 More Effective C++之效率Efficiency_上

上述4个例子显示,lazy evaluation在许多领域中都可能有用途:可避免非必要的对象复制,可区别operator[]的读取和写动作,可避免非必要的数据库读取动作,可避免非必要的数值计算动作。尽管如此,lazy evaluation并非永远是好主意。就像我们搁下打扫房间的工作一样,如果父母一定回来检查的话,我们究竟还是得打扫,占不到丁点便宜。是的,如果计算式必要的,lazy evaluation并不会为程序节省任何工作或任何时间。

2024-12-21 20:59:42 1001

原创 记一次pfring在目标机器上出现Illegal instruction.的修复过程

解决过程其实比较直观,指令集不兼容就通过重新编译,找到适合的指令集即可;不过为了验证是否为avx2指令集的问题,通过学习可通过objdump -d命令获取动态库/可执行程序最终的执行命令,对后续验证应该使用哪个指令集进行编译提供了有效途径。

2024-12-19 18:20:44 929

原创 More Effective C++之异常Exceptions_下

    函数参数的声明语法,和catch子句的声明语法,简直如出一辙:    我们可能因而假设“从抛出端传出一个exception到catch子句”,基本上和“从函数调用端传递一个自变量到函数参数”是一样的。其实有相同之处,但是也有重大的不同点。    让我们从相同点开始谈起。函数参数和exception的传递方式有3种:by value,by reference,by pointer。然而视所传递的参数或exceptions,发生的事情可能完全不同。原因是当调用一个函数,控制权最终会回到调用端(除非函

2024-12-18 23:36:21 890

原创 More Effective C++之异常Exceptions_上

C++增加了exceptions性质后,深远而根本地、并可能令人不舒服地改变了许多事情。例如,原始指针的使用如今竟成为了一种高风险行为,资源泄露(resource leaks)的机会大增,撰写符合期望的constructors和destructors的难度也大增。程序员必须特别小心,防止程序在执行时突然中止。可执行文件和程序库变得更大、速度更慢。上述所言都只是我们知道的事情而已。欲将exceptions纳入程序设计考虑,还有许多C++社区所不清楚的相关事务,其中最大的部分就是不知如何正确掌握它。

2024-12-16 22:49:44 893

原创 More Effective C++之操作符operators

可加以重加载的操作符overloadable operators,它让我们所定义的类型有着和C++内建类型一样的语法,允许我们在“操作符背后的支撑函数”内放置威力强大的手段,那是内建类型不可能有的待遇。当然,“可让诸如‘+’和‘==’符号做任何事情”这个事实,也意味着我们可能利用重载操作符写出一些令人难以理解的程序。成熟的C++程序员知道如何驾驭操作符重载的强大威力,不落入令人费解的沉沦中。可叹的是,稍有不慎,便向下沉沦。

2024-12-14 21:51:31 1000

原创 More Effective C++之基础主题basic

基础议题,包括pointers, references, casts, arrays,constructors,这一章描述pointer和reference的差异,并告诉你它们的适当使用时机。本章介绍新的C++转型(casts)语法,并解释为什么新式转型法比旧式的C转型法优越。本章也检验了C的数组概念即C++的多态(polymorphism)概念,并说明为什么将这两者混用是不明智之举。

2024-12-12 23:12:23 648

原创 STL之空间配置器allocator

以STL的运用角度而言,空间配置器是最不需要介绍的东西,它总是隐藏在一切组件(更具体的说是指容器,container)的背后,默默的工作,默默付出。但若以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以放置资料。不先掌握空间配置器的原理,难免在阅读其它STL组件的实现时处处遇到挡路石。为什么不说allocator是内存配置器而说它是空间配置器呢?因为空间不一定是内存,空间也可以是磁盘或其它辅助存储介质。

2024-12-10 23:39:03 1140

原创 STL之适配器(adapters)_下

请注意,源代码清楚地告诉我们,只要客户端定义一个istream iterator并绑定到某个istream object,程序便立刻停在istream_iterator::read()函数,等待输入,这不是我们所预期的行为,因此,请在绝对必要的时候才定义所需要的istream iterator- -这其实是C++程序员在任何时候都应该遵循的守则,但是很多人都忽略了。注意,本节的两个适配器并未纳入STL标准,SGI STL的私产品,但是颇有钻研价值,我们可以从中学习如何开发适合自己的,更复杂的适配器。

2024-12-08 22:11:25 595

原创 STL之适配器(adapters)_上

这样的迭代器包括专司尾端插入操作的back_insert_iterator,专司头端插入操作的front_insert_iterator,以及可以从任意位置执行插入操作的insert_iterator.由于这三个iterator adapters的使用接口不是十分直观,给一般用户带来困扰,因此,STL更提供三个相应函数:back_inserter(),front_inserter(),inserter();所谓对迭代器的修饰,只是一种观念上的改变(复制操作变为插入操作,前进变后退,绑定到特殊装置上等)。

2024-12-08 00:10:45 842

原创 STL仿函数

仿函数functors另名函数对象functions objects。在之前的算法介绍中,我们已经用到了仿函数。此章,我们对仿函数做一个更详细的介绍。

2024-12-06 23:24:42 902

原创 STL算法之merge sort

在中,我们对inplace_merge进行了简要的描述,但是对里面的细节描述的不是很清晰;本章进行更细致的拆解;同时merge将使用merge sort作为实现算法的主要手段。

2024-12-05 22:27:03 962

原创 STL算法之sort

STL所提供的各式各样算法中,sort()是最复杂最庞大的一个。这个算法接受两个RandomAccessIterators(随机存取迭代器),然后将区间内的所有元素以渐增方式由小到大重新排列。还有一个版本则是允许用户指定一个仿函数代替operator

2024-12-04 23:54:31 1341

原创 记一次pfring_open error [No such device] (pf_ring not loaded or interface zc:p2p1 is down ?)修复过程

为了使得网口接收流量能够突破1G,所以尝试使用pfring,发送example中的pfsend,同时使用zc(zero copy)模式进行数据发送。但是再调用的过程中出现了pfring_open error [No such device] (pf_ring not loaded or interface zc:p2p1 is down?)错误。遂开始进入了排查及定位过程。使用的版本未PF_RING 8.6.1。

2024-12-04 17:53:53 777

原创 linux运维命令

执行完以上命令后,通过firewall-cmd --list-all查看规则生效情况。

2024-12-04 15:40:45 347

原创 STL算法之其它算法_下

这个算法将[first,last)的元素次序随机排列。也就说,在N!中可能的元素排列中随机选出一种,此处N为last-first。N个元素的序列,其排列方式为N!中,random_shuffle会产生一个均匀分布,因此任何一个排列被选中的几率为1/N!。这很重要(稍后看源码,事实上依赖于随机数是否真随机),因为有不少算法可能会依赖排列的随机性。其算法实现过程,基本也是依次对每个元素进行随机的替换,以实现随机排列的功能。

2024-12-03 23:37:07 792

原创 STL算法之其它算法_中

而其后一个排列组合是cab。实际做法简述如下,从最尾端开始往前寻找两个相邻元素,令第一个元素为*i,第二个元素为*ii,且满足*i>*ii.找到这样一组相邻元素后,再从尾端开始往前检验,找到第一个小于*i的元素,令为*j,将i,j元素对调,再将ii之后的所有元素颠倒排序。首先,从尾端往前寻找两个相邻的元素,令第一个元素为*i,第二个元素为*ii,且满足*i

2024-12-02 22:23:46 815

原创 STL算法之其他算法_上

定义于SGI内的所有算法,除了相关算法之前已经介绍过,其余安排在该文中。其中有很单纯的循环遍历,也有很复杂的快速排序。运作相对单纯者,在第一小节中,其他相对比较复杂的算法,每个算法各一小节。

2024-12-01 23:40:29 1103

原创 STL算法之set相关算法

STL一共提供了四种与set(集合)相关的算法,分别是并集(union)、交集(intersection)、差集(difference)、对称差集(symmetric difference)。所谓set,可细分为数学上定义的和STL的定义两种,数学上的set允许元素重复而未经排序,例如{1,1,4,6,3},STL的定义(也就是容器)则要求元素不得重复,并且经过排序,例如{1,3,4,6}。本节的四个算法所接受的set,必须是有序区间(sorted range),元素值可重复出现。

2024-11-30 23:12:36 794

原创 STL基本算法之copy与copy_backward

稍后配合源码进行说明;从稍后即将显示的源码可知,copy元素时一一进行元素的赋值操作,如果输出区间的起点位于输入区间内,copy算法便(可能)会在输入区间的(某些)元素尚未被复制之前,就覆盖其值,导致错误的结果。在这里我们一再使用可能这个字眼,是因为,如故宫copy算法根据其所接收迭代器的特性决定调用memmove()来执行任务,就不会造成上述错误,因为memmove(),会考虑重叠的情况再进行处理,保证不会出现值还没被拷贝就被覆盖的情况。以上就死copy()的故事,一个无所不用其极地强化执行效率的故事。

2024-11-29 22:05:01 666

原创 STL算法之基本算法<stl_algobase.h>

STL标准规格中没哟区分基本算法或复杂算法,然后SGI却把常用的一些算法定义于之中,其他算法定义于之中。以下一一列举这些基本算法。

2024-11-28 23:42:47 1145

原创 STL算法之数值算法<stl_numeric.h>

这一节介绍的算法,统称为数值(numeric)算法。STL规定,欲使用它们,客户端必须包含头文件.SGI将它们实现与文件中。

2024-11-27 21:49:02 987

原创 STL之算法概览

算法,问题之解法也。以有限的步骤,解决逻辑或数学上的问题,这一专门科目我们称为算法(Algorithms)。大学信息相关教育里面,与编程最有关直接关系的科目,首推算法与数据结构(Data Structures,亦即STL中的容器)。STL算法即是将最被运用的算法规范出来,其涵盖区间有可能在每五年一次的c++标准委员会中不断增订。广义而言,我们所写的每个程序都是一个算法,其中的每个函数也都是一个算法,毕竟它们都用来解决或大或小的逻辑问题或数学问题。唯有用来解决特定问题(例如排序,查找,最短路径,三点共线。

2024-11-26 22:07:51 897

原创 STL关联式容器之hash_set、hash_map、hash_multiset、hash_multimap

虽然STL只规范复杂度与接口,并不规范实现方法,但STL set多半以RB-tree为底层机制。SGI则是在STL标准规格之外另又提供了一个所谓的hash_set,以hashtable为底层机制。由于hash_set所提供的操作接口,hashtable都提供了,所以几乎所有的hash_set操作行为,都只是转调用hashtable的操作行为而已。运用set,为的是能够快速搜寻元素。这一点,不论底层是RB-tree或是hashtable,都可以达成任务。

2024-11-25 21:48:51 1088

原创 STL关联式容器之hashtable

下图为开链法(separate chaining)完成hashtable的图形表述。为了了解SGI STL源码,我们遵循SGI的命名,称hash table表格内的元素为桶(bucket),此名称的大约意义是,表格内的每个单元,涵盖的不只是个节点(元素),可能是一桶节点。下面是hash table的节点定义注意,bucket所维护的linked list,并不采用STL的list或slist,而是自行维护上述的hashtable node。至于buckets聚合体,则以完成,以便有动态扩展能力。

2024-11-24 21:04:04 1058

原创 STL关联式容器之hashtable介绍

hash table可提供对任何有名项(named item)的存取操作和删除操作。由于操作对象是有名项,所以hash table也可被视为一种字典结构(dictionary)。这种结构的用意在与提供常数时间之基本操作,就像stack或queue那样。乍听之下这几乎是不可能的任务,因为制约条件如此至少,而元素个数增加,搜寻操作必行耗费更多时间。倒也不尽然。举个例子,如果所有的元素都是16-bits且不带正负号的整数,范围0~65535,那么简单的运用一个array就可以满足上述期望。

2024-11-23 22:32:01 785

原创 STL关联式容器之multiset及multimap

multiset的特性及用法和。

2024-11-23 16:45:33 271

原创 STL关联式容器之map

如果想要修正元素的键值,答案是不行的,因为map元素的键值关系到map元素的排列规则。如果想要修改元素的实值,答案是可以的,因为map元素的实值并不影响map元素的排列规则。pair的第一元素被视为键值,第二元素被视为实值。又由于map所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map操作行为,都只转调用RB-tree的操作行为而已。map拥有和list相同的某些性质:当客户端对它进行元素新增操作(insert)或删除操作(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。

2024-11-22 23:04:29 286

原创 STL关联式容器之set

又由于set所开放的各种操作接口,RB-tree也都提供了,所有几乎所有的set操作行为,都只是转调用RB-tree的操作行为而已。STL特别提供了一组set/multiset相关算法,包括交集set_intersection,联集set_union,差集set_difference、对称差集set_symmetric_difference,后续内容会进行描述。set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。(除了被删除的那个迭代器)

2024-11-22 20:41:54 278

原创 STL关联式容器之RB-tree(红黑树)_下

下面是rb-tree的定义。你可以看到其中定义有专属的空间配置器,每次用来配置一个节点的大小,也可以看到各种型别定义,用来维护整颗RB-tree的三笔数据(其中有个仿函数,functor,用来表现节点的大小比较方式),以及一些member function的定义或声明。

2024-11-21 22:23:19 768

原创 STL关联式容器之RB-tree(红黑树)_中

为了避免中情况4“父子节点皆为红色”的情况,持续向RB-tree的上层结构发展,形成处理时效上的瓶颈,我们可以施行一个由上而下的程序(top-down proceduce):假设新增节点为A,那么就沿着root往A的路径,只要看到有某个节点X的两个子节点皆为红色,就把X改为红色,并把两个子节点改为黑色,如下图所示:从根节点到新增节点A的路径,如下图所示,使用淡蓝色标识箭头方向:此时发现了节点50为X节点,解X变为红色,并将X的两个子节点变为黑色;

2024-11-20 22:17:50 914

DPDK和Hyperscan构建的网络防御系统

针对系统并发访问用户数量急剧提升,后端的安全验证对服务器消耗日益突出的问题,ntel DPDK 和 Hyperscan 的网络安全防御系统,系统基于并行处理机制,在数据经过的网关处进行安全验证,以有效的避免子后端服务器可 能遭受的DDoS 的攻击,减轻了子后端服务器的压力和保护服务器的健康运行。

2020-09-18

空空如也

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

TA关注的人

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