liangximin2046
码龄8年
关注
提问 私信
  • 博客:75,692
    75,692
    总访问量
  • 66
    原创
  • 954,370
    排名
  • 41
    粉丝
  • 0
    铁粉

个人简介:学生

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:四川省
  • 加入CSDN时间: 2016-09-17
博客简介:

梁熙民的csdn博客

博客描述:
简简单单
查看详细资料
个人成就
  • 获得48次点赞
  • 内容获得41次评论
  • 获得215次收藏
  • 代码片获得116次分享
创作历程
  • 3篇
    2022年
  • 11篇
    2021年
  • 49篇
    2020年
  • 3篇
    2019年
成就勋章
TA的专栏
  • 数据库
    5篇
  • 分布式系统
    6篇
  • 操作系统
    7篇
  • c++
    5篇
  • clickhouse
    1篇
  • 数据结构
    2篇
  • 计算机网络
    1篇
  • 算法
    11篇
  • linux
    2篇
  • muduo
    25篇
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

357人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

2021 CMU-15445/645 Project #4 : Concurrency Control 【完】

0 介绍2021年秋季15445的第四个project是并发控制相关的内容,主要是实现一个LockManager。这个LockManager可以依据事务需要进行tuple级别的琐管理,总的来说还是比较考验多线程编程的基本功,希望读者在做之前理解mutex、condition_variable的工作原理以便方便调试bug,这些内容在我之前的博客做过总结,同时对数据库系统概念这本书里的相关章节进行阅读。下面介绍一下具体实现方案,本文依然不会提供源码。同时推荐这篇知乎文章,我做的时候收到不少启发,写得也比我详细
原创
发布博客 2022.03.15 ·
2497 阅读 ·
5 点赞 ·
8 评论 ·
4 收藏

2021 CMU-15445/645 Project #3 : Query Execution

0 介绍21年秋季的15445第3个Project是要完成一些执行器(executor)来实现一些数据库操作比如遍历、插入、更新、删除、连接等等。虽然算法难度上不如Project2,但是需要阅读大量代码并能调试BUG,还是有一些麻烦。在做之前,务必阅读包括但不限于Catalog、TableInfo、IndexInfo、Expression、PlanNode、Schema、Tuple这些类的代码,这样会好做一些。1 实现接下来介绍一些有难点的执行器实现。1.1 Seqential Scan这个执行器
原创
发布博客 2022.01.21 ·
2717 阅读 ·
2 点赞 ·
8 评论 ·
7 收藏

2021 CMU-15445/645 Project #2 : Hash Index

0 前言21年CMU-15445的Project2是实现一个基于可拓展哈希(EXTENDIBLE HASH)的哈希索引。比起Project 1,Project2的难度要高不少,我自己跑完所有的测试花了40s,只能算是一个中规中矩的成绩,在gradescope上好一点的成绩可以压缩到30s以内。不过我还是把它写成博客,希望能帮助到没有头绪的朋友,也希望完成的比较好的朋友能指正。下面说一下Project2的要点,不过按照课程要求,这里就不放代码了。对于EXTENDIBLE HASH算法理解有困难的朋友可以在
原创
发布博客 2022.01.03 ·
3526 阅读 ·
4 点赞 ·
3 评论 ·
4 收藏

2021 CMU-15445/645 Project #1 : BufferPool Manager

0 介绍最近开始做CMU的2021秋季15445/645数据库课程项目,课程项目的内容是实现一个小型DBMS BUSTUB的关键组成部分。2021年秋季课程的相关信息可以在课程官方网站获得,关于Project的相关配置可以在Project #0 c++ primer里获取,对此有疑问的读者可以留言提问,这里就不多说了。总而言之,这个课程Project对数据库学习和c++学习有很大帮助。1 Project #1实验内容Project1的实验内容是实现一个Buffer Pool Manager,Buffe
原创
发布博客 2021.12.16 ·
2773 阅读 ·
0 点赞 ·
5 评论 ·
6 收藏

Paxos算法论文总结

1 介绍之前通过MIT6.824课程,我对Raft算法有了深度的理解,自然而然地也就对被誉为“世界上唯一的一致性算法”的Paxos产生的兴趣,这篇文章就是阅读算法论文后的总结。我阅读的文章是Paxos Made Simple,可以在这里阅读。同时这篇博客的图片以及部分内容参考了这篇博客。2 算法2.1 一致性算法面临的问题...
原创
发布博客 2021.08.12 ·
583 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

2021 MIT 6.824 Lab2D Raft算法(四):日志压缩(log compaction)【完】

0 前言经过前面三个lab我们实现了raft算法的选举(leader election)、日志复制(log replication)与持久化(persist)的功能,在最后一个lab将实现日志压缩(log compaction)。日志压缩的诞生出于这样的考虑:在我们前面所有的代码中,日志均存在内存里,然而如果一台服务器是24×\times× 7地工作,某些时刻日志将会把内存撑爆,而且日志很多的话,持久化的时候也需要很多的IO操作时间,所以要引入日志压缩技术让服务器丢弃一些日志节省内存。所以使用什么技术丢弃
原创
发布博客 2021.05.25 ·
2287 阅读 ·
2 点赞 ·
8 评论 ·
3 收藏

2021 MIT6.824 Lab2C Raft算法(三):持久化(persist)

0 前言在Lab2A,2B里面,我们实现了Raft的leader选举和日志复制。在2C中,需要实现Raft的持久化功能(persist)。对于一个Raft节点服务器来说,当宕机重新启动的时候,它必须恢复到宕机以前的状态。论文Figure2中提到了需要持久化的状态:currentTermvoteForlogs(全部)Lab2C的主要关注点就是通过实现持久化,进一步提高系统的容错性。当然考虑到课程要求,这里就不上代码了。1 具体思路Lab2C的实现其实不太难,主要是要实现两个函数:Read
原创
发布博客 2021.05.13 ·
1364 阅读 ·
0 点赞 ·
0 评论 ·
6 收藏

2021 MIT6.824 Lab2B Raft算法(二):日志复制(log replication)

0 前言在之前的博客中实现了完成了Lab2A,raft的leader选举。这一篇博客讲述Lab2B,日志复制的内容。首先说一下总体感受,这是一个细节爆炸的实现,对论文理解稍有偏差就会导致测试不能通过,所以建议写码之前多读两遍论文,同时阅读一下课程助教写的guide,里面有一些常见的往年学生踩过的坑。如果还是有困难的话,可以参考一下这篇博客,写得确实很棒。下面说一下算法实现,当然,由于课程有要求,这里就不上代码了。1 概述之前也提到过,raft是基于复制状态机的,每一个服务器存储一个包含一系列指令的日志
原创
发布博客 2021.05.09 ·
1115 阅读 ·
3 点赞 ·
0 评论 ·
9 收藏

2021 MIT6.824 Lab2A Raft算法(一):选举(leader election)

0 前言Raft算法是一个有名的分布式一致性算法,论文点此处可以找到。6.824的Lab2将分为三个小lab实现这个算法。这篇博客将介绍Lab2A的内容,那便是raft的leader选举。Raft是基于复制状态机的算法,在一个系统中有唯一的一台机器是leader,剩下的机器是follower,follower根据leader的命令更新自己的状态。raft选举算法解决的问题是:当出现leader宕机或是网络不稳定的情况,能够正常的选举出leader并能保证出现问题的机器重新上线时系统能正常容纳它,以下的文章
原创
发布博客 2021.04.29 ·
982 阅读 ·
1 点赞 ·
0 评论 ·
7 收藏

2021 MIT6.824 Lab1 MapReduce算法总结

提示完成lab的一种可行的步骤是:首先修改mr/worker.go的Worker函数,实现的功能是向master领取一个任务,然后实现master的功能,返回一个文件名称作为未开始的map task,然后再让worker读取返回的文件名称调用Map函数map和reduce函数在对应的.so文件里,这个看看代码就懂了在本lab中,所有worker进程共享一个文件系统,也就是说所有worker是跑在同一台机器上的。如果说worker是在不同的机器上,我们就需要GFS这种分布式文件系统了worker的m
原创
发布博客 2021.04.23 ·
2815 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

ClickHouse源码阅读笔记(一):Server是如何工作的

0 简介ClickHouse是一个OLAP(联机分析)系统,适用于大数据分析的场景。最近开始读它的源代码,今天介绍一下ClickHouse的Server是如何启动直到接收到一条客户端指令。我手里这份代码是21.2.7版本的。文章参考了这篇博客。1 从main函数说起ClickHouse的入口main函数位于programs/main.cpp,大致代码如下:int main(int argc_, char ** argv_){ ...//省略 std::vector<char
原创
发布博客 2021.04.01 ·
395 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

数据库优化技术之向量化计算和编译执行

0 介绍最近开始接触一个战斗民族开发的列式数据库ClickHouse,它是一个高性能的OLAP,根据一些测试,它的查询效率达到mysql的数十到数百倍。那么至于它的性能为何如此之高,一个很重要的优化就是它实现了向量化计算和编译执行,这里介绍几篇文章解释这两个优化操作。1 火山模型在谈优化之前,不妨先读一下这篇文章火山模型介绍。火山模型的缺点在于每次都是计算一个 tuple(Tuple-at-a-time),这样会造成多次operator节点调用 next ,也就是造成大量的虚函数调用,这样会造成 CP
原创
发布博客 2021.03.30 ·
558 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

操作系统之常用磁盘调度算法

0 前言最近读ClickHouse的相关书籍时,涉及了一些磁盘与文件系统的知识,再次回顾了一下操作系统,特此记录。1 基础知识如下图所示,普通的磁盘由磁盘轴、盘片、磁头、读写头这些组件组成。当在磁盘上进行读写时,磁盘进行高速旋转,读写头到达对应位置进行操作,所以对磁盘进行读写操作是比较耗时的。这个时间由以下几部分组成:等待设备可用与通道可用寻道时间(最耗时)磁盘旋转时间读写时间而磁盘调度算法就是针对寻道时间所作的优化。2 调度算法2.1 先来先服务(FIFO)这个算法很好理解,
原创
发布博客 2021.03.29 ·
585 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

守护进程概念及Linux下的创建方法

0 前言最近在写一个HTTP服务器,打算做成apache服务器那样的守护进程使其后台运行。在写的时候发现守护进程有很多讲究的地方,特此记录。1 守护进程概念守护进程的英文为Daemon,词源是希腊神话中半神半人的精灵,负责默默守护一个人的灵魂从生到死。那么顾名思义,守护进程就是指那些在后台运行、不占有终端、生命周期很长的进程(一般从开机到关机)。Linux中常见的守护进程有ssh(远程登录)、httpd(web服务)。2 创建守护进程创建守护进程的步骤如下:执行fork(),让父进程退出,子进
原创
发布博客 2021.01.08 ·
236 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

死锁相关问题与哲学家吃饭问题

0 死锁概念在并发编程中,死锁是一个常见的概念,它是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。举例来说,如下图所示,进程1在已经锁定资源1的情况下,去申请锁定资源2,很不巧,资源2已经被进程2锁定了,所以进程1只能原地阻塞等待,更不巧的是进程2在执行过程中又来申请资源1,同样的道理进程2也只能原地阻塞等待,二者互不相让,所以只能永远等待下去。
原创
发布博客 2020.12.16 ·
445 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

非对称加密算法:RSA算法的通俗解释

0 介绍RSA算法是一个著名的非对称加密算法,作用是对信息进行加密。之所以称之为非对称的,这是相对于对称加密算法来说的。在对称加密算法中,加密与解密所需的密钥是一致的,比如著名的凯撒加密中,信息加密者对每个字母取此字母三位后的字母,如a->d,b->e,接收者收到密文后取每个字母前三位字母即可。而非对称加密中,通信双方各自拥有一个不同的密钥,发送者发送加密后的报文和自己的密钥,接受者收到后用自己的密钥(私钥)和来自发送者的密钥(公钥)将密文解密。也就是说,只要接收者不泄露自己的密钥,那么就没有
原创
发布博客 2020.12.12 ·
4667 阅读 ·
2 点赞 ·
0 评论 ·
6 收藏

并发编程中条件变量(condition variables)实现原理

0 介绍以前只是会使用Linux下的条件变量pthread_cond_t,知道它的作用是配合互斥锁解决并发编程的同步问题,没有思考过它的实现原理,今天学习了清华大学陈渝老师的操作系统网课,总算是明白了,特此记录。1 实现条件变量是一种等待机制,每一个条件变量对应一个等待原因与等待队列。一般对于条件变量会有两种操作:wait操作 : 将自己阻塞在等待队列里,唤醒一个等待者或者开放锁的互斥访问singal 操作 : 唤醒一个等待的线程(等待队列为空的话什么也不做)下面看看它的伪码描述,两个变量一
原创
发布博客 2020.12.05 ·
3772 阅读 ·
5 点赞 ·
2 评论 ·
14 收藏

操作系统自旋锁和互斥锁的实现原理

0 介绍对多线程编程有过了解的朋友一定知道锁的概念,它的作用是为了保证临界区的代码在多线程下能够正常工作,也就是说,锁将保证共享资源在任意时刻只能有一个使用者。过去博主我也只是知道锁是如何使用的,对其内在原理并不了解。今天看看了看清华大学陈渝老师的网课,对锁的实现有了一定认识,特此记录。1 原子操作理解锁的实现,首先要理解Cpu的原子操作。现代的cpu都提供一些特殊的原子操作,他们执行的时候将不能被中断,如CAS(compare and swap)、Test-And-Set。这两种操作均可以实现锁,
原创
发布博客 2020.12.04 ·
1831 阅读 ·
1 点赞 ·
0 评论 ·
8 收藏

关于c语言c99标准中的不定长数组

博主我在刚读大一学习c语言的时候,写过这样一段代码:#include <stdio.h>int main(void){ int n; scanf("%d",&n); int a[n]; return 0;}很明显,我是想从键盘读入一个整数n,然后定义一个大小为n的整性数组。当时程序的运行环境是vc6.0,这个程序不能通过编译,理由是定义数组大小时n必须是const的,查阅书籍教科书上、询问老师都是同样的回答。今天又一次写了这个程序,神奇的发现它是可以通过编译的。查
原创
发布博客 2020.11.28 ·
1206 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

线性排序算法:桶排序和基数排序

0 前言今天刷Leetcode的时候遇到一道题使用了基数排序,是一种线性时间的排序方法,感觉蛮有意思的,特地记录。1 桶排序桶排序的原理是这样:有时候我们只需要对整数排序,而且这些整数都有一个不大的上界M,于是我们使用一个大小为M的数组count,初始化为0,称count为一个有M个单元的桶。当读入一个数AiA_iAi​时,令count[Ai]count[A_i]count[Ai​]加1即可。读入所有数据之后,扫描count打印出数字即可。如下图所示,给学生分数排序时只需造一个M=100的桶,依次读入
原创
发布博客 2020.11.26 ·
214 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏
加载更多