- 博客(24)
- 收藏
- 关注
原创 使用 perf-tools 检查 glusterfs 内存泄漏问题
二次开发 glusterfs,执行几个命令的时候发现有内存泄漏的问题,一开始使用的是 valgrind 来进行检查,很快检查到两个地方,其中一个有完善的 stack,但是剩下一个只有简单的一个栈:根本没有办法解决,只好借助更加精细的内存检查工具 perf-tools 进行检查。
2023-11-30 17:35:33
406
原创 vim显示缩进对齐线
vim显示缩进对齐线工作中使用 vim 较多,但是在 vim 的默认设置中并没有缩进线,代码看起来会比较费劲,不过可以通过安装 indentLine 插件来实现此功能。1. 安装插件可以通过 vim-plug 直接进行安装:使用 vim ~/.vimrc 编辑 .vimrc 文件,添加语句Plug 'Yggdroot/indentLine'随后使用 vim 的命令行模式执行 :PlugInstall 进行安装显示安装成功服务器不能顺利下载插件的,也可以先通过 git clone htt
2021-11-30 18:02:26
6352
9
原创 GlusterFS源码分析——根据结构体成员的地址获取结构体对象的首地址
GlusterFS源码分析——根据结构体成员的地址获取结构体对象的首地址在GlusterFS中,各种链表是通过在结构体中包含一个链表结构体struct list_head来实现的,这个结构体的内部只有两个指针:next和prev,负责把相应的结构体串连起来。同时各种链表相关操作(初始化链表、向链表插入/删除节点、遍历链表等),都被设计成了通用的接口,在list.h实现。例如:/* list.h部分代码 */// 通用的链表操作接口struct list_head { struct list
2021-08-30 14:48:30
351
原创 GlusterFS源码分析——dht_create
GlusterFS源码分析——dht_create1、简介GlusterFS的分布式哈希表(DIstributed Hash Table,简称DHT)机制是数据分布的核心机制,以目录作为文件分布的基本单位。当用户在客户端创建目录的时候,会在所有brick进行创建,但是创建目录的时候,会根据哈希算法确定文件具体存放在哪个brick上。也就是说,所有brick都有相同的目录结构,但是文件只会存储于特定的brick上,根据文件所在目录的gfid和文件名寻找实际存储文件的brick。我们知道,在Gluster
2021-08-26 21:04:17
896
1
原创 GlusterFS源码学习——函数指针数组的妙用
GlusterFS使用C编写,源码中使用了大量的函数指针来实现模块化编程(是我自己以前没有接触过的编写方式),这样的方式可以很方便的实现功能扩展以及调用。今天学习的是函数指针数组,也就是把相同系列的函数的函数指针存放到一个数组中,通过这个数组和对应于函数操作的编号来进行调用。源码中代码很多,而且跳来跳去的很麻烦,所以自己照葫芦画瓢写了一个小的demo来加深印象,用来学习和记忆该方法。本文前面部分是自己的小demo,后面是GlusterFS的部分源码。demo/* 用来练习函数指针数组的的小demo
2021-08-24 19:36:18
255
原创 GlusterFS源码分析——重要数据结构
对几个重要数据结构的简单分析1. frame以及frame->local用来保存volfile内容的一个数据结构,同时还承担了其它重要功能glusterfs/libglusterfs/src/stack.h:struct _call_frame_t { call_stack_t *root; /* stack root 记录当前的用户是谁,要发送给server的,表示当前是谁在系统中工作 */ call_frame_t *parent; /* previous BP */
2021-08-18 11:37:39
1260
1
原创 分布式存储学习(一)相关概念
1.1 什么是网络存储?是数据存储的一种方法,指通过网络存储设备(包括专用数据交换设备、磁盘阵列或磁盘库等存储介质,以及专用的存储软件),利用原有网络,构建一个存储专用网络为用户提供信息存取和共享服务。开放系统的外挂存储根据连接方式的不同,分为直连式存储和网络化存储,网络化存储根据传输协议有分为NAS和SAN,所以现在的存储解决方案主要大致分为三种:直接附加存储DAS(Direct Attached Storage)、网络附加存储NAS(Network Attached Storage)、存储区域网
2021-07-22 21:06:09
302
原创 模板形式的单例类 (使用了智能指针)
实现一个模板形式的单例类,对于任意类型的类经过Singleton的处理之后,都能获取一个单例对象,并且可以传递任意参数并且还使用了智能指针,把生成的单例对象托管给智能指针,从而实现自动回收单例对象的资源此外,如果需要一个放在静态成员区的对象供其他类使用,又不希望修改原有的类的代码,这时候可以通过该模板套一层壳,形成单例对象。头文件template_singleton.hpp#include <iostream>#include <string>#include <
2021-06-12 15:39:10
480
原创 STL空间配置器之 allocate
我们知道new和delete管理对象时其实都内含两阶段操作,一个是对内存空间的操作,使用operator new和operator delete来申请和释放内存空间,一个是调用构造函数和析构函数来构造和销毁对象。类似的STL也需要两阶段的操作,不过为了精密分工,STL把两个阶段拆开了。对于内存的管理,STL会使用空间配置器(allocator)的**allocate()函数来分配足够大、原始的、未命名的内存;调用deallocate()**函数来回收内存,其中比较复杂的是allocate()函数,为了解
2021-06-08 13:51:47
403
原创 c++primer第五版 文本查询程序再探
1. 项目需求书上内容的实现,支持多种查询方式,包括:单词查询,用于得到包含给定单词的所有行逻辑非查询,使用~运算符,得到不包含给定单词的所有行逻辑或查询,使用|运算符,返回匹配两个条件中任意一个的行逻辑与查询,使用&运算符,返回匹配两个条件的行组合查询,可以混合使用上面的运算符以及圆括号,符号优先级按照C++通用的优先级对复杂表达式求值输出内容:输入的查询语句,圆括号来表示查询被解释和执行的先后次序;按照查询结果中行号的升序来打印行号和结果,并且每一行只显示一次2. 主
2021-05-28 19:32:15
484
原创 TinyXML2的基本使用之遍历和文本提取
XML是一种标记语言,被广泛用来作为跨平台之间交互数据的形式,主要针对数据的内容,通过不同的格式化描述手段(XSLT,CSS等)可以完成最终的形式表达(生成对应的HTML,PDF或者其他的文件格式)。而TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,由于XML是由节点组成的,节点之间是树形结构,有根节点、父节点、子节点、兄弟节点等。所以可以把其当做树来处理和使用。下面我们来看一下在C++中使用TinyXML2对XML文件进行遍历和提取信息的方法。1.TinyXML2的相关数据类型
2021-05-21 22:53:44
2065
原创 C++ 单例模式的自动释放
单例模式是为了确保某个类只能创建一个对象而设计的。当一个程序的某个类型只允许有一个实例的时候使用。一般采用动态分配的方式来生成单例对象,这个时候C++程序员就需要考虑内存回收的问题了,所以为了避免在使用单例模式时忘记回收资源而造成内存泄漏的问题,在实现单例模式的时候就使其可以自动被回收。不带自动释放的单例模式的实现与销毁我们先来复习一下没有自动回收机制的单例模式的实现和销毁。单例模式的实现:将构造函数私有化在类中定义一个静态的指向本类型的指针变量定义一个返回值为该类的指针的静态成员函数,在类
2021-05-20 23:25:19
1376
1
原创 自己实现 写时复制(cow)模式 的c++ string类型 使用了设计模式之代理模式
实现COW(写时复制)模式的String,让其operator[]能够区分出读写操作,从而避免只读时也修改引用计数。使用了设计模式中的 代理模式 来实现下标运算符和赋值运算符的重载,从而完整的实现COW(写时复制)。代码实现如下:my_string.h#ifndef __MY_STRING_H__#define __MY_STRING_H__#include <string.h>#include <iostream>using namespace std;cl
2021-05-19 23:14:03
1193
2
原创 C语言 四窗口聊天
C语言 四窗口聊天为了练习前段时间学习的共享内存、管道、消息队列等进程同步机制,做了一个聊天小项目。项目描述:有4个进程,A进程和B进程负责通信,从标准输入读到的字符串通过管道发给对方,A1和B1进程负责显示,其中:A进程和B进程通过管道通信,A进程和A1进程通过共享内存通信,B进程和B1进程通过消息队列通信;A进程从标准输入读到的字符串后,放到管道和共享内存里,从管道中读到的字符串放到共享内存里,B进程从管道中拿到A放的字符串,A1进程到共享内存中拿到字符串,打印到屏幕上;B进程从
2021-04-14 20:34:19
458
1
原创 C语言打印某一年的日历 (2*6格式)
输入一个年份(1970以后的),以 2*6 的格式打印当年的日历。主要思路:遍历日期,根据日期标记每一行应该打印的内容,存放到一个数组中,然后遍历数组,根据数组的内容逐行打印。代码如下:// 打印2*6格式的日历#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>char month[12][10] = { "January", "February", "March", "April", "May", "June", "July", "
2021-03-18 16:51:21
2256
1
原创 Golang 统计一个字符串中各单词出现的次数
统计一个字符串中每个单词出现的次数,主要思路是:1.将字符串中的单词分割并存入slice2.从slice中取出单词并存入map,存入过程中完成计数3.打印结果编写过程中遇到的主要问题:字符串如果是完整的句子,就会包含空格和标点符号,直接调用strings包中的Split函数没有办法进行很好的切分。解决代码如下:package mainimport ( "fmt" "unicode")// 统计一个字符串中每个单词出现的次数。例如:"Hello, how do you do?"中
2021-01-16 23:24:31
3489
原创 Golang map类型 复杂map类型
Golang中的map(映射)是一种无序的基于 key-value 的数据结构,类似Python中的字典,内部使用散列表(hash表)实现。除了常规的类型之外,还有两种较为复杂的类型:元素为map的slice元素为slice的map其中,在使用元素为map的slice时应当注意,完成slice的初始化之后,还是不能直接对其元素进行赋值等操作,因为此时的map元素还未进行初始化,所以无法赋值。应当先用make函数初始化map,然后才可以赋值。例如:package mainimport "fmt
2021-01-16 21:30:09
1276
3
原创 Golang切片 slice类型
Golang 的 slice 是一个引用类型,内部结构包含 地址、长度和容量,一般用于快速地操作一块数据集合。使用上来说 slice 是一个拥有相同类型元素的可变长度的序列,具有灵活、可自动扩容等优点。本质上,slice 是一个指向 array 的指针,当拷贝 slice 给另一个变量时,两个引用会指向同一个 array,类似Python中的深拷贝,从任何一个变量里修改,其他变量包括底层数组都会跟着改变。相关的操作如下所示:// 定义一个切片 var s1 []int // 定义一个存放in
2021-01-14 20:59:00
925
原创 Golang rune类型 和 byte类型
最近在学习Golang,这篇文章的主要目的是讨论在学习过程中遇到的一些关于Golang字符串的小问题。由于Golang中字符的存储方式较为特殊,所以单独拿来讨论一下。1. Golang中字符的定义首先我们都知道,字符串由一个或多个字符构成,字符串中的每一个元素叫做字符,在遍历或者单个获取字符串元素时可以获得字符。继承于C,在Golang中,字符串用双引号表示,字符用单引号表示,和python不同,这是要严格遵循的。而和C不同的是,Golang中的字符有以下两种类型:一种是 byte 类型,或者叫
2021-01-13 22:09:37
357
原创 win10上VSCode安装go语言插件失败的解决办法
win10上面VSCode安装go语言插件失败的解决办法1.安装git首先要在电脑上安装git,下载地址:https://git-scm.com/download/win根据系统位数选择相应的安装包下载并安装,安装过程中无脑next即可。2.建立golang.org文件夹在%GOPATH%\src\ 目录下,也就是你配置环境变量GOPATH的那个目录,创建新目录\golang.org,然后进入\golang.org再新建一个目录\x,创建完成后,如下图,3.克隆github上的插件到本地完成
2021-01-12 15:27:17
1067
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人