- 博客(157)
- 收藏
- 关注
原创 ceph基础库 - ThreadPool
代码路径所在代码位置:src/common/WorkQueue.cc线程池功能描述线程池主要成员class ThreadPool : public md_config_obs_t{ unsigned _num_threads; //构造线程池时指定的线程数量 std::vector<WorkQueue_*> work_queues; //待处理队列 std::set<WorkThread*> _threads; //
2022-05-24 14:11:53 386
原创 本地文件系统文件数据管理
磁盘布局是磁盘的空间划分管理,文件的空间被文件系统划分为与文件系统块一样大小的若干逻辑块,文件系统要做的事情就是将文件的逻辑块和磁盘的物理块建立联系,即文件系统数据管理。基于连续区域一次性为文件分配其所需要的空间,且空间在磁盘上是连续性的。因此只需要知道文件的起始位置所对应的磁盘位置和文件长度就可以知道文件数据在磁盘上是如何存储的。这种方案的主要缺点是:不够灵活,特别是追加写操作非常困难容易形成碎片空间目前主要应用在光盘等存储介质的文件系统中,如ISOFS基于链表将磁盘空间划分为相等大
2022-04-07 00:30:46 595
原创 归并排序的实现方式(C++)
merge函数void merge(vector<int> &vec, int lo, int mid, int hi) { vector<int> save; //临时数组 std::copy(vec.begin(), vec.end(), back_inserter(save)); int i = lo, j = mid + 1; for (int k = lo; k <= hi; k++) { //从lo向h
2022-02-18 20:02:03 514
原创 Heap题型套路
1 heap简介heap本质上是用Array或者vector实现的完全二叉树,这个tree的root节点代表整个heap的最大值(max_heap)或最小值(min_heap)。常用于解决Top K问题。C++并没有将heap作为容器,而是作为算法放到< algorithm>中,默认是max_heap,但是也可以通过指定比较算法构造min_heap。heap的低层机制vector本身就是一个类模板, 常用的API有以下几个:std::make_heap(RandomIt first,
2021-12-31 20:34:49 567
原创 Array题型刷题套路
1 概述Array类型题型,一般而言题目中数据都有固定长度或者数量,通常使用双指针的方式解决此类问题。此处双指针不一定就是两个指针,同时也不一定是真实的指针,而且多数是数组下标的处理方式,主要是指使用双指针的思维,比如同向移动指针或者反向移动指针。2 同向双指针方式使用下图表示同向双指针的思考方式:同向双指针将数据分为三个区域:[0, i) 表示处理好的数据[i, j) 表示处理过但是不需要的数据[j, array.len) 表示接下来要处理的数据那么一般此类题的通用步骤就是:初始
2021-12-29 00:29:52 319
原创 C++ STL源码剖析 -- 二叉堆
1 二叉堆二叉堆,就是一种完全二叉树,即整个二叉树除了最底层的叶子节点之外,是填满的,而最底层的叶子节点中间也没有空隙,如下图所示:使用数组层级存储| * | A | B | C | D | E | F | G | H | I | J |如果0位置保留,从1位置开始保存根节点,那么i位置的某个节点,其左孩子节点必定在2i位置,其右孩子节点则在2i+1位置,其父节点则位于i/2。如果0位置使用,从0位置开始保存根节点,那么i位置的某个节点,其左孩子节点必定在2i+1位置,其右孩子节点则在2i+2位
2021-12-27 20:54:30 553 1
原创 文件系统分布式锁简要介绍
1 命名空间不同服务的锁用不同的namespace来区分,不同元数据服务上锁namespace的名字不同,元数据锁和数据锁的namespace也不同,客户端理论上会向所有的服务发请求,所以客户端的锁分布在不同的namespace下,锁客户端用namespace来组织不同的锁链表.分布式锁模块跟元数据服务器中其他模块比较独立,它保存了系统中所有已经向该元数据服务器申请的锁。当有新的锁请求到来时,会直接进入锁申请模块。锁模块会检查该资源上是否已经有锁,并检查锁是否存在冲突,以决定申请的锁是否会被授权。客户
2021-12-22 00:12:49 428
原创 C++同步并发操作
何时需要线程同步线程完成前,需要等待另一个线程执行线程需要等待特定事件发生线程等待某个条件变为true线程同步的方式持续检查共享标记void wait_for_flag() { std::unique_lock lock(m); while (!flag) { lock.unlock(); lock.lock(); } do_something();}等待线程在检查间隙void wait_for_flag
2021-12-19 18:39:46 835
原创 C++线程间共享数据
通常我们使用锁保护线程间共享数据,这也是最基本的方式。当访问共享数据前,使用互斥量将相关数据锁住,再当访问结束后,再将数据解锁。线程库需要保证,当一个线程使用特定互斥量锁住共享数据时,其他的线程想要访问锁住的数据,都必须等到之前那个线程对数据进行解锁后,才能进行访问。这就保证了所有线程能看到共享数据,而不破坏不变量。1 使用互斥量C++提供 std::mutex创建互斥量,通过调用 lock()上锁,unlock()解锁。为方便使用,C++提供RAII语法的模板类 std::lock_guard()
2021-12-18 19:48:25 999
原创 Linux配置samba服务器
1 Linux 安装sambayum install -y samba2 修改配置文件添加用户adduser root \\如果是当前linux登录用户,可以省略该步smbpasswd -a root \\回车之后设置密码vim /etc/samba/smb.conf打开配置文件后,进行如下配置测试samba配置文件:testparm查看win当前用户工作组的方式:在dos命令行中输入net config workstation。设置防火墙:firewall-cmd
2020-10-28 09:50:18 2846 1
转载 GitLab配置ssh-key
1 背景当前很多公司都选择git作为代码版本控制工具,然后自己公司搭建私有的gitlab来管理代码,我们在clone代码的时候可以选择http协议,当然我们亦可以选择ssh协议来拉取代码。但是网上很少找到如何用git客户端生成ssh key,然后配置在gitlab,我当时在做的时候苦于摸索,后来终于找到了解决方案,那么本文,我们就来聊一聊如何本地git客户端生成ssh key,然后配置在gitlab里,而后使用ssh协议进行提交和拉取git远程仓库的代码。2 解决方案打开本地git bash,使用
2020-10-27 15:54:49 2012
转载 kmalloc/kfree,vmalloc/vfree函数用法和区别
1 kmallockmalloc内存分配和malloc相似,除非被阻塞否则他执行的速度非常快,而且不对获得空间清零.tiger说明:在用kmalloc申请函数后,要对起清零用memset()函数对申请的内存进行清零。2 kamlloc函数原型#include<linux/slab.h>void *kmalloc(size_t size, int flags);(1)第...
2019-08-14 11:32:24 1117
转载 Linux 的 NUMA 技术
一、引言随着科学计算、事务处理对计算机性能要求的不断提高,SMP(对称多处理器)系统的应用越来越广泛,规模也越来越大,但由于传统的SMP系统中,所有处理器都共享系统总线,因此当处理器的数目增大时,系统总线的竞争冲突加大,系统总线将成为瓶颈,所以目前SMP系统的CPU数目一般只有数十个,可扩展能力受到极大限制。NUMA技术有效结合了SMP系统易编程性和MPP(大规模并行)系统易扩展性的特点,较好解...
2019-08-13 17:08:44 4422
转载 Linux Slab分配器--概述
slab分配器是Linux内存管理中非常重要和复杂的一部分,其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内碎片,而且处理速度也太慢。而slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符就是一类),每当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当...
2019-08-12 11:35:51 291
转载 Linux内存管理中的slab分配器
Linux内核中基于伙伴算法实现的分区页框分配器适合大块内存的请求,它所分配的内存区是以页框为基本单位的。对于内核中小块连续内存的请求,比如说几个字节或者几百个字节,如果依然分配一个页框来来满足该请求,那么这很明显就是一种浪费,即产生内部碎片(internal fragmentation)为了解决小块内存的分配,Linux内核基于Solaris 2.4中的slab分配算法实现了自己的slab分配...
2019-08-12 11:07:54 406
转载 解读关键字volatile
1 volatile是什么?volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。2 编译器优化是什么意思?int i = 5;int a = i;……int b = i;编译器发现两次从i读数据的代码...
2019-08-09 16:47:42 173
转载 动态分级存储特性-SmartTier
1简介SmartTier动态分级存储特性提供智能化数据存储管理的功能,通过统计和分析数据的活跃度,将不同活跃度的数据和不同特点的存储介质动态匹配,提高存储系统性能并降低用户成本。应用SmartTier特性不会中断现有业务,不会影响数据读写。SmartTier SmartTier通过数据迁移将活跃度高的繁忙数据迁移至具有更高性能的存储介质(如SSD硬盘),将活跃度低的空闲数据迁移至具有更高容量且更...
2019-08-01 20:16:19 5201
原创 正则表达式标记
正则表达式标记属于正则的扩展表示法,格式:(?iLmsx)各个字符的含义是:i:不区分大小写的匹配L:根据所使用的本地语言环境通过\w、\W、\b、\B、\s、\S实现匹配s:使点号(.)可以匹配\nm:能够在目标字符串实现跨行都说,而不必将整个字符串视为单个实体x:该标记允许用户通过抑制在正则表达式中使用空白符(除了在字符类中或者发斜线转义中)来创建更易读的正则表达式举例:参...
2019-07-06 15:53:19 619 2
转载 python re模块的findall和finditer
python正则模块re中findall和finditer两者相似,但却有很大区别。两者都可以获取所有的匹配结果,这和search方法有着很大的区别,同时不同的是一个返回list,一个返回一个MatchObject类型的iteratorcontent = '''email:12345678@163.comemail:2345678@163.comemail:345678@163.com'...
2019-07-05 17:42:53 11977
转载 正则表达式(括号)、[中括号]、{大括号}的区别小结
正则表达式的() [] {}有不同的意思。() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。(\s*)表示连续空格的字符串。[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。{}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s{1,3}表示匹配一到三个空格。(0-9) 匹配 ...
2019-07-05 17:17:09 6916
转载 python正则表达式中group
1 正则表达式中的(…)用于匹配括号内的任何正则表达式,并且指明组的开始和结束位置;可以在执行匹配之后检索组中的内容,并且可以在可以在字符串中使用\number来进行进一步的匹配,如下所述。当需要匹配字符’(‘或者’)’时,可以使用(和) ,或者[(]和[)]来实现。以上便是Python3.6官方文档对于(…)表达式的解说,该括号表达式用于定义一个group,一个正则表达式中可以有多个括号表达...
2019-07-05 14:41:35 10310
转载 python字符串处理
str = ‘0123456789’print str[0:3] #截取第一位到第三位的字符print str[:] #截取字符串的全部字符print str[6:] #截取第七个字符到结尾print str[:-3] #截取从头开始到倒数第三个字符之前print str[2] #截取第三个字符print str[-1] #截取倒数第一个字符print s...
2019-07-05 09:04:08 136
转载 怎样用 parted 管理硬盘分区
众所周知,对硬盘分区是 Linux 管理员一项最重要的管理任务之一,他们不能不知道这个。你可能会问为什么我们要用 parted 而不是fdisk? 它们有什么区别?好问题,我会告诉你这两者的区别。parted 支持用户在大于 2TB 的硬盘上创建硬盘分区, 但fdisk 命令不支持对比 fdisk 来说,parted 是一个更高级的工具支持更多的分区表类型,包括 GPT (全局唯一标识分...
2019-06-20 23:24:05 2958
转载 parted分区和挂载及非交互式操作
交互式分区1 将磁盘上原有的分区删除进入:#parted /dev/sdb查看:(parted)p删除:(parted)rm 1 (parted)rm 22 将磁盘格式变成gpt的格式(part只能针对gpt格式的磁盘进行操作) 转换:(parted) mklabel gpt 分区:(parted) mkpart primary 1 500 ...
2019-06-18 15:10:30 2190
转载 硬盘的读写原理
硬盘的种类主要是SCSI 、IDE 、以及现在流行的SATA等;任何一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;比如 SCSI标准已经经历了SCSI-1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的 Ultral-160就是基于SCSI-3标准的;IDE 遵循的是ATA标准,而目前流行的SATA,是ATA标准的升级版本;IDE是并口设备,而SATA...
2019-06-03 20:15:19 5052
转载 存储快照实现原理
存储快照有两种实现方式:COW(写时复制Copy-On-Write)、ROW(写重定向Redirect-On-Write),两种实现方法有区别,造成读写性能、应用场景有比较大的区别。1 COW原理见下图(从网上找的,没自己画)。1)原卷数据是A~G。此卷Metedata像指针一样指向这些数据。2)当做快照时,重新复制一份Metedata,并且也指向这些A~G数据。3)当有数据要写入到源卷...
2019-06-03 15:32:08 2086
转载 Linux中的线程局部存储
在Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程局部存储方面,简单...
2019-05-28 14:49:59 434
转载 Linux下原生异步IO接口libaio介绍
在调研 fio的实现时,接触了libaio的使用方式。由于fio 的io engine发送及接受数据的流程是按照liaio库的方式进行的。所以初步使用了libaio。现总结如下。几点说明本文的重点在于libaio的使用方式。所以对什么是同步、异步及阻塞、非阻塞IO,请参考相应资料。比较权威的资料是Richard Stevens的“UNIXNetwork Programming Volume...
2019-05-07 13:50:02 17312
转载 Linux下libaio的一个简单例子
libaio是Linux下的一个异步非阻塞接口,它提供了以异步非阻塞方式来读写文件的方式,读写效率比较高。首先推荐两个介绍Linux I/O模型的页面,写的很好:http://www.ibm.com/developerworks/cn/linux/l-async/http://www.iteye.com/topic/868702对于libaio的读写过程简单说来就是你发出一个读写请求,然后...
2019-05-07 11:40:31 1736
转载 LVM(逻辑卷管理器)的条带化
1 什么是条带化当多个进程同时访问一个磁盘时,可能会出现磁盘冲突。磁盘系统对访问次数(每秒的IO操作,IOPS)和数据传输速率(读写速率,TPS)有限制。当达到这些限制时,后面需要访问磁盘的进程就需要挂起等待,这就是磁盘冲突。避免磁盘冲突是优化I/O性能的一个重要目标。条带化技术是一种自动的将I/0负载均衡到多个物理磁盘上的技术。条带化技术将一块连续的数据分成很多小部分,并把他们分别存储到不同...
2019-04-25 20:29:25 1416
转载 gdb打印内存字节
单字节16进制打印address地址处的长度为16的空间的内存,16表示空间长度,不是16进制,x表示16进制,b表示byte单字节可以使用examine命令(简写是x)来查看内存地址中的值。x命 令的语 法如下所示:x/<n/f/u> <addr>n、f、u是可选的参数。n是一个正整数,表示需要显示的内存单元的个数, 也就是说从当前地址向后显示几个 内存单元的内容...
2019-01-30 11:40:48 2758
转载 Git统计代码量
1 指定用户名版git log --author="_Your_Name_Here_" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, sub...
2019-01-25 16:56:54 3212
原创 直接插入算法
1 算法原理插入算法是每次将一个新数据插入到有序队列中的合适位置的一种算法。 算法的详细过程描述如下: 假设有一个无序队列R1, R2, R3, …, Rn (1)首先认为R1是有序的,然后将R2, R3,…,Rn依次插入到这个有序队列的合适位置,因此我们需要一个外部循环 (2)我们需要将Ri插入到合适位置,Ri前面的数据已经是有序的了,我们需要将Ri依次和前面的数据进行比较,每次比较...
2018-05-25 23:17:53 6567
原创 shell脚本执行错误 $'\r':command not found
在linux上执行脚本时出现$’\r’:command not found,然而仔细检查脚本,对应行位置只是一个空行,并没有问题,那么linux为什么会将一个回车的空行报错?原因是这样的:脚本是在window下编辑完成后上传到linux上执行的,win下的换行是回车符+换行符,也就是\r\n,而unix下是换行符\n。linux下不识别\r为回车符,所以导致每行的配置都多了个\r,因此是脚本编码的问
2017-10-26 09:46:32 30277 1
转载 sed命令
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复
2017-10-25 10:48:00 719
转载 Makefile之filter-out
1 功能说明$(filter-out PATTERN…,TEXT) `函数名称 :反过滤函数—filter-out。 函数功能 :和“filter”函数实现的功能相反。过滤掉字串“TEXT”中所有符合模式“PATTERN”的单词,保留所有不符合此模式的单词。可以有多个模式。存在多个模式时,模式表达式之间使用空格分割。返回值 :空格分割的“TEXT”字串中所有不符合模式“PATTERN”的字串。 函数
2017-09-07 11:47:09 22761
转载 教你上传本地代码到github
1. 建立git仓库 cd到你的本地项目根目录下,执行git命令git init2. 将项目的所有文件添加到仓库中git add .如果想添加某个特定的文件,只需把.换成特定的文件名即可。 3. 将add的文件commit到仓库git commit -m "注释语句"4.去github上创建自己的Repository 创建页面如下图所示: 点击下面的Create repository
2017-08-12 19:19:01 403
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人