自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梁熙民的csdn博客

简简单单

  • 博客(66)
  • 收藏
  • 关注

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

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

2022-03-15 21:13:17 2290 8

原创 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 17:31:52 2535 8

原创 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 16:33:28 3371 3

原创 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 19:16:29 2633 5

原创 Paxos算法论文总结

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

2021-08-12 14:51:31 500

原创 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 19:11:10 2080 8

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

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

2021-05-13 11:31:24 1196

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

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

2021-05-09 20:20:47 1006

原创 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 20:21:33 886

原创 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 14:50:27 2728

原创 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 15:12:42 311

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

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

2021-03-30 21:33:09 494

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

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

2021-03-29 14:33:59 496

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

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

2021-01-08 22:15:18 186

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

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

2020-12-16 14:47:03 396

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

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

2020-12-12 16:27:58 4345

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

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

2020-12-05 16:04:47 3175 1

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

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

2020-12-04 19:55:54 1716

原创 关于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 13:32:29 1100

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

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 19:48:43 179

原创 c++实现链表插入排序和归并排序

0 前言最近刷leetcode时遇到了两道链表排序题,相对数组排序而言处理上复杂了一些,却蛮有意思。有必要记录一下。1 插入排序Leetcode第147题对链表进行插入排序并不复杂,相对于数组的插入排序来说思路是直接可以用的。首先我们设置一个dummy头节点,然后从待排序链表里依次拿出节点,放入dummy链表里的合适位置即可。p1和p2是用于寻找合适插入位置的两个指针。算法复杂度o(n2)o(n^2)o(n2)。/** * Definition for singly-linked list. *

2020-11-03 11:06:04 558

原创 在centos7上安装MySql8.0踩坑总结

0 前言昨天打算在CentOs7上安装MySql8.0,我本以为是一件很简单的事情,没想到却踩了不少坑,特此记录。网上大部分安装教程都是针对5.7及以前版本的,或者比较繁琐,希望这篇博客能帮助大家。1 添加yum源mysql似乎被移除出yum源了,首先手动添加,新建文件:vi /etc/yum.repos.d/mysql-community.repo新建这个文件后,添加以下内容:mysql57-community]name=MySQL 5.7 Community Serverbaseu

2020-10-23 09:57:59 272

原创 c++虚函数表解析

转载自csdn博客原博客戳这里。0 前言c++是一门面向对象的程序设计语言。所谓面向对象的程序设计,它的核心思想是数据抽象、继承、动态绑定。通过数据抽象,可以将类的接口与实现分离;使用继承,可以定义相似的关系并对相似的关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,以统一的方式去使用对象。而今天谈的虚函数就是实现动态绑定的一种方式。虚函数的概念这里不多赘述,c++ primer中讲的很详细,下面谈谈虚函数的实现方式 --虚函数表。1虚函数表对C++ 了解的人都应该知道虚函数(Virtu

2020-10-04 14:42:22 134

原创 内存碎片与产生原因

1 内存碎片概念操作系统进行连续内存分配时,常常会出现不能被用户使用的小片区内存,这就是所谓的内存碎片。内存碎片可以分为外部碎片和内部碎片,下面来解释一下。2 产生原因2.1 内部碎片所谓内部碎片,是指内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间。内部碎片产生的原因在于因为分配的内存起始地址必须可被 4、8 或 16 整除,如申请7字节空间,可能会获得8或16字节空间,实际上多余的空间是不可使用的。2.2 外部碎片外部碎片指的是还没有被分配出去(不属于任何进程),但

2020-09-27 18:50:06 2021 1

原创 堆(优先队列)与堆排序通俗介绍(c++实现)

0 简介堆是一种比较精妙的数据结构,一般所使用的二叉堆,其本质上来说,是一棵完全二叉树,所以一般使用一个数组就可以模拟堆的各种操作。对于任意一个节点来说,若它的节点编号为iii(1<=i<=n1<=i <= n1<=i<=n),那么它的左儿子节点编号就是2i2i2i,右儿子节点编号就是2i+12i+12i+1,父亲节点就是i/2i/2i/2。最小堆中,每一个节点的值均小于父亲节点,大于它的父亲节点。堆一般支持插入元素、返回和删除最值元素等操作,下面以二叉最小堆为例讲讲这

2020-09-21 15:51:23 176

原创 计算机开机后操作系统的加载过程

0 介绍最近开始学习操作系统知识,并打算实现一下ucoreOs的核心内容。那么对于学习操作系统来说,遇到的第一个问题便是在计算机开机后,它是如何开始工作的。下面是计算机加载操作系统的流程。1 加载当我们打开计算机电源时,第一步:计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序(BIOS是主板上自带的一块存储器,里边烧录了固定的基本输入输出系统,不是由自己定义)。这个BIOS程序会自动检测主板上各个接口的状态,也就是是否连接了相应的设备(硬盘,网络

2020-09-04 17:19:01 8209

原创 回溯法求解数组全排列和全组合问题(c++)

0介绍回溯法是学习算法的一个坎,它将许多代码基础不够扎实的同学挡在通往更高水平的门外。究其原因,是因为回溯法本身与递归有着千丝万缕的关系,同时也要求学习者具备较强的抽象问题的能力。所以在学习回溯法之前,学习者必须熟练解决一些常见的递归问题,如二叉树的遍历、LCA问题等,这些问题leetcode均有题目,读者不妨先去练练手再回来。如果能熟练写出常见递归问题的代码,回溯法也就如庖丁解牛了。下面介绍两个回溯法练习的入门题,数组元素的全排列和全组合求解。1 回溯法求解数组全排列leetcode第46题考察了这

2020-08-24 20:37:06 1860

原创 树的公共祖先(LCA)问题:Leetcode235题和236题

0 介绍树的公共祖先问题(LCA)是一个经典的问题。所谓公共祖先,它的定义如下。对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。–摘自百度百科如图片所示,0和5的公共祖先是2。这个问题一般有两种形式,一种是问一颗二叉搜索树某两个节点的公共祖先,一种是问普通的树上两个节点的公共祖先。下面我们来介绍一下解法。1 二叉搜索树上的LCAleetcode235题考查了这个问题。对于二叉搜索树的

2020-08-20 20:11:09 240

原创 c++实现最短路径算法(Dijkstra算法)

0简介Dijkstra算法是一种计算某一顶点到其余顶点最短路径的算法。它采用了贪心的策略,实现时使用了广度优先。这个算法常学常忘,因此写篇博客彻底解决它。1计算步骤介绍Dijkstra的计算步骤不难,如下(1)设置一个集合表示已经标记过的节点,初始化为空(2)使用一个数组d记录所有节点与源节点s的距离,初始化d[s] = 0,其余设置为INF(3)循环n次{ 在未标记的节点中,选出d值最小的节点x; 将x加入标记过节点的集合; 对于从x出发的所有边(x,y),更新d[y] = min(d

2020-08-17 20:13:32 5980 4

原创 c++实现链表反转:leetcode206题和92题

0 介绍链表反转是一道常见的算法面试题,题意也很直白,就是让你将一个指定链表反序。Leetcode206题和92题考查了这样一道题目,下面来看一看。1 Leetcode206题-反转链表I该题题目描述如下:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解决这样一个问题需要三个指针pre、cur、tail,以示例输入为例,我们首先将pre初始化为空指针,cur初始

2020-08-16 18:56:00 166

原创 Centos7查看、关闭、打开防火墙的命令

0介绍今天在另外一台电脑上安装了Ubuntu,想要netcat一下主力电脑(centos7虚拟机)的echo server,却发现无法连接,但两台电脑之间却是可以ping通的。查了一些资料发现是centos的防火墙没有关闭,特地记录一下防火墙的打开、关闭命令。1防火墙状态查询查看防火墙的状态的命令为:sudo systemctl status firewalld如果active为active(running)说明是打开着的,否则如图中所示是关闭的。2 打开防火墙打开防火墙的方式有两种,一种是

2020-08-11 15:34:43 613

原创 双指针(双索引)算法介绍(c++)

0 简介双指针算法在一些数组题中很常用,它指的是一类使用两个指针遍历数组求解问题的方法,这里的指针是广义上的,有可能是c/c++中的指针,也有可能仅仅是两个整数下标。双指针算法有两种形式,一种被称为对撞指针,两个指针从两端向中间靠拢;另一种是快慢指针,两个指针向统一方向运动,滑动窗口方法就是一种常用的快慢指针方法。1 对撞指针对撞指针的思想如前所述,下面举一道具体的例题来说明。这道题是leetcode345题。题目描述如下编写一个函数,以字符串作为输入,反转该字符串中的元音字母。示例 1:输

2020-08-09 21:11:42 693

原创 c++实现快速排序

0 介绍快速排序是目前已知排序速度最快的排序算法,平均时间复杂度o(nlogn)o(nlogn)o(nlogn)。快速排序的思想很朴素,但是实现起来却很困难,一度被认为是一种理论上极值优化却无法实现的算法,原因在于有太多的细节需要把控。网上的快排代码许多是有错误的,或者可读性不高,这里把自己的代码分享出来,希望可以帮助到大家。代码已经通过leetcode912题的测试。用的时候直接调用我的quickSort函数即可。vector<int> sortArray(vector<int&gt

2020-08-05 17:45:47 228

原创 c++实现归并排序

0 介绍归并排序是一种常见的排序算法,时间复杂度o(nlogn)o(nlogn)o(nlogn)。它是经典的分治算法的应用,学习这个算法,不仅仅是学习排序本身,更重要是体会分治思想。下面谈谈具体的算法步骤。1 合并两个有序数组在我们介绍归并排序算法之前,不妨先考虑一下如何考虑如何合并两个有序数组的问题。这个问题在Leetcode88题也有,你不妨先练练手再回来。这个问题并不难,我们假设待归并的两个数组在同一个数组nums里,第一个数组的左右界限是left和rightEdge-1,第二个数组的左右界限

2020-08-04 22:07:51 356

原创 三种简单排序算法:冒泡排序、选择排序、插入排序(c++实现)

0 简介排序问题是一个基础又重要的问题,无论是工作面试或是考试都常常遇到。之前学习了一系列排序算法,但是很久不看又忘记了,特此总结。先总结一下三种简单的排序算法,后续总结更高级的算法,如归并、快排等。以下算法均为升序排序。1 冒泡排序冒泡排序是大多数人接触到的第一个排序算法,它的算法采取了逐渐缩小未排序序列的思路。对于一个长度N的数组,具体的算法步骤为:首先确定未排序的序列长度为N,然后让未排序序列中最大的值浮游到末尾(冒泡名称的由来),第二步,确立未排序的序列长度为N-1,在未排序序列中找到最大的值

2020-08-04 19:09:20 423

原创 muduo网络库源码复现笔记(二十五):缓冲区Buffer类

Muduo网络库简介muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕。它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。muduo网络库的核心代码只有数千行,在网络编程技术学习的进阶阶段,muduo是一个非常值得学习的开源库。目前我也是刚刚开始学习这个网络库的源码,希望将这个学习过程记录下来。这个网络库的源码已经发布在GitHub上,可以点击这里阅读。目前Github上这份源码已经被作者用c++11重写,我学习的

2020-07-30 21:43:25 290

原创 muduo网络库源码复现笔记(二十四):实现多线程服务器

Muduo网络库简介muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕。它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。muduo网络库的核心代码只有数千行,在网络编程技术学习的进阶阶段,muduo是一个非常值得学习的开源库。目前我也是刚刚开始学习这个网络库的源码,希望将这个学习过程记录下来。这个网络库的源码已经发布在GitHub上,可以点击这里阅读。目前Github上这份源码已经被作者用c++11重写,我学习的

2020-07-29 16:55:21 330

原创 muduo网络库源码复现笔记(二十三):TcpConnection断开连接

Muduo网络库简介muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕。它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。muduo网络库的核心代码只有数千行,在网络编程技术学习的进阶阶段,muduo是一个非常值得学习的开源库。目前我也是刚刚开始学习这个网络库的源码,希望将这个学习过程记录下来。这个网络库的源码已经发布在GitHub上,可以点击这里阅读。目前Github上这份源码已经被作者用c++11重写,我学习的

2020-07-28 17:07:01 439

原创 muduo网络库源码复现笔记(二十二):TcpServer类与TcpConnection初步

Muduo网络库简介muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕。它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。muduo网络库的核心代码只有数千行,在网络编程技术学习的进阶阶段,muduo是一个非常值得学习的开源库。目前我也是刚刚开始学习这个网络库的源码,希望将这个学习过程记录下来。这个网络库的源码已经发布在GitHub上,可以点击这里阅读。目前Github上这份源码已经被作者用c++11重写,我学习的

2020-07-27 17:05:03 188

原创 muduo网络库源码复现笔记(二十一):Acceptor类、InetAddress类、Sockets类、SocketsOps.cc

Muduo网络库简介muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕。它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程网络应用程序。muduo网络库的核心代码只有数千行,在网络编程技术学习的进阶阶段,muduo是一个非常值得学习的开源库。目前我也是刚刚开始学习这个网络库的源码,希望将这个学习过程记录下来。这个网络库的源码已经发布在GitHub上,可以点击这里阅读。目前Github上这份源码已经被作者用c++11重写,我学习的

2020-07-25 11:07:04 251

空空如也

空空如也

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

TA关注的人

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