自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

phantom_111的博客

随着时间的流逝痛苦会变得淡薄,然而我并不想让时间来治愈我的痛苦,就算从痛苦中逃脱,忘记一切,得到的也只是停滞,无法前进。

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

原创 用什么来存储 Docker 的镜像?

文章目录1. 写在最前面2. 分析下文件系统2.1 文件系统的组成2.2 文件系统的类型2.3 存储驱动3. 非常手段查看镜像3.1 查看本机可用镜像3.2 分析镜像 layers 组成4. 碎碎念5. 参考资料1. 写在最前面「不是你想要用什么,而是你有什么,能用的是什么?」反复思考这句话的时候,突然意识到不是 docker 选择用文件来存储镜像,而是除了文件以外,docker 别无其他选择。从宏观来分析,计算机的组成包括了CPU、内存、磁盘,排除法 CPU 负责逻辑,而内存又是易失存储,所以只能

2021-02-20 19:00:48 12

原创 Docker 底层技术推导

文章目录1. 写在最前面2. 什么推动了docker 出现2.1 出现原因2.2 优势总结3. 大胆猜测一下实现3.1 对比 Virtual Machine3.2 实现 docker 需要什么?3.3 要隔离什么?4. 真实的实现4.1 隔离进程的工具4.1.1 例子4.2 隔离资源的工具4.2.1 子系统介绍4.2.2 使用介绍4.3 附加工具5. 碎碎念6. 参考资料1. 写在最前面在听《牵丝戏》的时候突然灵光乍现想到了「与其扬汤止沸,不如釜底抽薪」这个观点。怎么将这个观点应用到这篇文章中呢?答

2021-02-08 19:18:18 12

原创 分布式一致性协议与事务

文章目录1. 写在最前面2. 解决的问题2.1 从流量说起2.2 从一主多从到分布式一致性协议2.2.1 一主多从2.2.2 分布式一致性协议2.2.3 总结2.3 分布式事务2.3.1 概念2.3.2 思考3. 具体实现协议3.1 分布式一致性协议3.1.1 多主协议3.1.2 单主协议:3.2 分布式事务4. 碎碎念5. 参考资料1. 写在最前面从隔壁大佬那边借来了 zookeeper 的协议 zap 的论文介绍,原本想对比一下 zap 和 raft 协议的异同。但是脑海里突然想到一句话「授人以鱼,

2021-01-25 21:03:45 24 1

原创 golang pprof 的原理分析

文章目录1. 写在最前面2. pprof 提供的能力2.1 查看方式3. pprof 使用3.1 server 服务3.2 非 server 服务4. pprof 源码分析4.1 思考4.2 细节说明4.2.1 SIGPROF 信号4.2.2 pprof 数据写入过程5. 碎碎念6. 参考资料1. 写在最前面最近在改面向集群 profiling 服务代码的时候,想到 golang 原生支持单机的 profiling。原本对比两种实现的异同,但是目前并不能够完全理解集群 profiling 服务的实现原

2021-01-12 21:15:27 59

原创 tcp KeepAlive vs http KeepAlive

文章目录1. 写在最前面2. 两种 KeepAlive 的区别3. 验证 KeepAlive3.1 http KeepAlive3.1.1 结论3.2 tcp KeepAlive3.2.1 结论4. 碎碎念5. 参考资料1. 写在最前面这个问题的好奇点背景是这个样子的。笔者所在的公司到了一年一度换证书的日子,为了做 double check (嗯,其实就是作为弱鸡的我默默的围观大佬换证书)。在验证更换证书是否生效的时候,有一个很有趣的现象:用之前已经打开的 Google 页面刷新的话,证书还是 2

2020-12-22 21:44:15 20

原创 Redis 协议规范

文章目录1. 写在最前面2. 试试手拼协议2.1 试试 1.3.6 版本的数据插入2.2 试试 3.2 版本的数据插入2.3 思考 3.2 是否兼容了 1.3.6 的协议3. 如何快速插入亿级的键值对3.1 Use the protocol3.2 Generating Redis Protocol4. 碎碎念5.参考资料1. 写在最前面偶然间跟同事讨论起 redis 的 client 和 server 之间传输数据的协议是什么样子的,以 set hello world 为例:我:set hello

2020-12-01 19:34:59 26

原创 Redis 网络库分析

文章目录1. 写在最前面2. I/O 多路复用2.1 什么是 I/O 多路复用2.2 I/O 多路复用的实现3. 网络库源码结构3.1 anet 文件3.2 ae 文件3.2.1 aeEventLoop3.2.2 aeFileEvent3.2.3 aeTimeEvent3.2.4 aeFiredEvent3.3 ae_epoll、ae_select、kae_queue4. 思考5. 碎碎念6. 参考资料1. 写在最前面终于可以边调试边学习代码啦,其实调试的方法很简单,只需要三个步骤,值得拥有:

2020-11-08 21:47:53 23

原创 用 vscode debug c++ 代码

文章目录1. 写在最前面2. 如何配置文件2.1 编译 c++ 代码——task.json2.1.1 创建 task.json 文件2.2.2 编辑 task.json 文件2.1.3 编译 cpp 文件2.2 调试 C++ 代码 —— launch.json2.2.1 创建 launch.json 文件2.2.2 编辑 launch.json3. 调试4. 碎碎念5. 参考资料1. 写在最前面最近在看 1.3.6 版本的 Redis 的源码,有些地方没办法直接通过「看」的方式搞懂,觉得「用」才是快速上

2020-10-19 23:12:06 168

原创 B-tree 锁分析

文章目录写在最前面为什么需要锁?用锁来保护什么?2.1 保护的内容2.2 二者的区别保护 B-tree 的物理结构issuesLock Coupling(锁耦合)Load Balancing and Reorganization保护 B-tree 的逻辑结构Key Range LockingKey Range Locking and Ghost Records缺点优点Locking in Nounnique IndexesIncrement Lock Modes写在最后参考资料写在最前面上上周末跟许久不

2020-09-16 08:05:31 60 2

原创 《计算机程序构造与解释》读书笔记(2)

文章目录1. 写在最前面2. 构造数据抽象2.1 原因2.2 数据抽象导引2.3 层次性数据和闭包性质2.3.1 序列作为一种约定的界面2.4 符号数据2.4.1 引号2.4.2 集合的表示2.5 抽象数据的多重表示2.5.1 带有标志数据2.5.2 数据导向的程序设计和可加性2.6 带有通用性操作的系统2.6.1 通用型算术包2.6.2 不同类型数据的组合2.7 思考3 碎碎念1. 写在最前面「李白写过那么多诗,他自己会背吗?」「像李白那么不羁的人,估计写完就忘,放不下的是我们俗人自己。」写这篇.

2020-08-17 00:46:23 158

原创 《计算机程序构造与解释》读书笔记(1)

文章目录1. 概念是为什么?2. 构造过程的抽象2.1 程序设计的基本要素2.1.1 表达式2.1.2 命名和环境2.1.3 组合式的求值2.1.4 复合过程2.1.5 过程应用的代换模型2.1.6 条件表达式和谓词3. 过程与它们产生的计算3.1 线性的递归与迭代3.2 树形递归3.3 成本的计算4.用高阶函数做抽象4.1 过程作为参数4.2 用 lambda4.3 过程作为一般性方法4.4 过程作为返回值5. 写在最后最近有点「间歇性踌躇满志,持续性混吃等死」,难道是因为工作太久?随便什么原因,还.

2020-07-26 23:46:19 82

原创 关于 ELF 文件想知道的事

文章目录1.起源1.1 高级语言 vs 汇编语言 vs 机器语言1.2 机器语言和 ELF 文件2. 编译(从 section 到 segment)2.1 为什么定义两种不同视角的概念2.2 section 和 segment 是什么2.2.1 section2.2.2 segment3. 链接以后我便成为了你3.1 链接发展历史3.1.1 静态链接 + 静态装入3.1.2 静态链接 + 动态装入3.1.3 动态链接 + 动态装入3.2 动态链接本质碎碎念参考资料1.起源1.1 高级语言 vs 汇编.

2020-06-21 22:18:33 130

原创 elf 文件与链接

文章目录1.为什么需要 elf 文件1.1 前置知识1.2 elf 文件是什么1.3 结论2. elf 文件里有什么2.1 前置知识2.2 elf 结构之——问答设计2.1 从链接的视角2.2 从运行的视角3. 链接3.1 基本概念3.2 过程3.2.1 空间与地址分配3.2.2 符号解析和重定位4. 碎碎念5. 参考资料1.为什么需要 elf 文件1.1 前置知识操作系统在启动以后,cpu 与内存的管理权限完全由操作系统接管,若此时想要在操作系统之上运行其他的二进制程序,则其必须满足 ABI 的标

2020-05-18 22:14:18 251

原创 InnoDB 存储引擎——事务

文章目录1. 为什么 InnoDB 存储引擎被接受?2. 事务2.1 为什么支持事务2.2 事务的特性2.2 如何支持 ACID2.2.1 实现2.2.1.1 redo log2.2.1.2 undo log2.2.2 binlog & innodb 存储引擎重做日志2.2.3 总结3. 锁 & MVCC3.1 前置知识3.2 行锁3.3 意向锁3.4 兼容说明3.5 隔离性实现4...

2020-04-09 20:01:40 106

原创 《SRE Google 运维解密》笔记

文章目录1. 主旨2. 概览2.1 提出 SRE 的动力?2.2 SRE 聚焦问题点2.3 庖丁解牛2.3.1 你看到了什么?2.3.2 如何管理你看到的?2.3.3 能否站在全局视角上看问题?3. 指导思想3.1 学会拥抱风险3.1.1 如何度量服务的风险?3.1.2 判断服务风险的容忍度?3.1.2 设计合适的「错误预算」3.2 服务质量目标3.2.1 指标在实践中的应用3.2.2 目标在实...

2020-03-14 21:03:35 117

原创 《C++ 沉思录》学习笔记——下篇

今日份的电影份额看完,那就默默的《 C++ 沉思录》的学习笔记补充完成吧,毕竟「出来混总得还不是」。下篇是对书中 0-11 章内容的总结,详情如下(ps《魔女》真的好燃,被女主圈粉的一天文章目录1. 序幕(0)2. 动机(1-3)2.1 为什么我用 C++(1)2.2 为什么用 C++ 工作(2)2.2.1 质疑2.2.2 抽象2.3 生活在现实世界中(3)3. 类和继承(4-11)3.1 类...

2020-02-15 23:09:26 101

原创 《C++ 沉思录》学习笔记——中篇

文章目录1. 题外话2. 容器相关(12-14)2.1 设计容器(12)2.1.1 问题:2.1.2 设计一个类似数组的类2.2 访问容器中的元素(13)2.2.1 模拟指针2.2.2 中间层 Array_data2.3 迭代器(14)2.3.1 什么是迭代器2.3.2 Pointer 类的迭代器如何实现3. 序列(15)4. 模板、泛型、迭代器(16-20)4.1 作为接口的模板(16)4.1...

2020-02-09 00:15:07 73

原创 《C++ 沉思录》学习笔记——上篇

文章目录1. 总结(31-32)1.1 通过复杂性获取简单性(31)1.1.1 类库和语言语义1.1.2 抽象和接口1.2 说了 Hello world 后再做什么(32)2. 技术(27-30)2.1 自己跟踪自己的类(27)2.1.1 设计一个实用的跟踪类——跟踪函数2.1.2 生成对象的审计跟踪——跟踪对象2.2 在簇中分配对象(28)2.2.1 问题2.2.2 方案 1—— 侵入2.2....

2020-02-01 23:18:53 147

原创 线段树

文章目录1. 概念1.1 定义1.2 使用场景1.2.1 时间复杂度2. 线段树——区间求和及更新3. 线段树——区间最值4. 碎碎念5. 参考资料1. 概念1.1 定义线段树使用一个完全二叉树来存储每个区间(segment) 的数据。线段树所使用的二叉树是用一个数组保存的。完全二叉树:除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对。参考 https://www.zh...

2020-01-20 20:35:35 98

原创 Java 入门图解 (上)

文章目录1. Spring 相关1.1 Spring 是什么1.2 Spring 核心理解1.2.1 IOC1.2.2 AOP1.3 如何新建一个 Spring 项目1.3.1 步骤 11.3.2 步骤 21.3.3 步骤 31.3.4 没有 src 目录怎么解决?1.3.5 没有 resouces 目录怎么解决?1.3.6 创建成功1.3.7 增加 spring 依赖 & 写个例子呗2...

2019-12-23 02:05:09 141

原创 拥塞控制 vs 流量控制

在 TCP 中,拥塞窗口和接收窗口的最小值,是任意时刻内发送方确定能被发送出去的字节数。拥塞窗口受拥塞控制的影响,接收窗口受流量控制的影响,以下会分别介绍拥塞控制和流量控制。拥塞控制与流量控制本质上来说,是生产者消费者的模型,如下图所示:拥塞控制目的:通过减少发送方发送的数据量,起到阻止发送方到接收方之间的链路变得拥塞的目的。实现:拥塞控制通过拥塞窗口实现,拥塞窗口由发送方维护,通过预...

2019-11-06 22:37:22 154

原创 重读TCP 协议

拖延症晚期患者,终于在周末的尾巴开始写这篇本来上周就应该总结出来的文章了……。1. 基本概念大部分介绍 tcp 协议的开头都是, tcp 协议是一种面向连接的、可靠的、基于字节流的传输层协议。讲真的就是这么单纯的记住这个概念,在实践中并没有什么具体用处,毕竟工作和考试不一样……。为了更深刻的理解这个协议,让我们先拆解下概念要点:传输层协议,什么是传输层呢,为什么需要抽象传输层的概念呢?...

2019-10-20 23:05:06 72

原创 进程调度

1.背景知识调度程序可以理解成一个分配者,用于分配有限的处理器资源。只有通过调度程序,处理器资源才能够达到最大限度的利用。调度程序主要负责以下工作决定哪个进程将会投入运行决定进程什么时候运行决定运行多长时间调度程序在设计上分为:抢占式调度程序决定什么时候停止一个进程,以便其他进程能够得到执行的机会。Unix 、Linux 和许多其他的现代操作系统都是抢占式的非抢占式除...

2019-10-07 22:25:02 80

原创 进程、系统调用

「多问,为什么?」能够帮助你深入理解各种你想要知道的东西?什么,你不信,那我们一起试试吧。1. 进程1.1 为什么需要进程不是进程需要我们,而是我们需要进程。想象一下,现在提供一个操作系统,而你想要通过操作系统控制各种资源,包括处理器、内存、磁盘等,你会怎么做?将各个资源排队,每次都取一类资源处理,最后整和到一起使用,这得是一种多么低效的手段……提前打包好各种可能使用的资源,每次使用申...

2019-09-22 21:02:53 439

原创 中断、信号、锁、信号量

1. 碎碎念作为一个上学能忘记带书包,出门能忘记带钥匙的人。兴冲冲的去看书,发现自己木有带书,只带了电脑,好像也就没什么可奇怪的了。好在现在是 2019 年,在网上找了下要看书的 pdf 版,完美解决小插曲,撒花。(ps 解释下,作为一个尊重知识产权的人,我还是买了纸质书的哈2. 背景对于中断、信号、锁、信号量这几个操作系统课本里常见的概念,笔者始终是木有理解清楚过。大概率是因为我上学的时候...

2019-09-15 19:36:48 423

原创 红黑树完全攻略

文章目录1. 前言2. 旋转2.1 为什么旋转2.2 基础旋转2.3 复杂旋转3. 红黑树的性质4. 插入4.1 插入论证4.2 复杂插入4.2.1 U 为红色的场景4.2.2 U 为黑色的场景4.3 复杂插入总结5. 删除5.1 删除问题转化5.2 删除情况枚举5.3 复杂删除5.3.1 N 有个红色的兄弟 U5.3.2 N 有个黑色兄弟 U5.3.3 N 有个黑色兄弟 U 续5.3.4 N 有...

2019-09-01 02:10:26 85

原创

作为勤勤恳恳好学的好少年,笔者决定写一篇文章来研究下锁。就好像因为饿才会去吃饭一样,使用锁也是因为锁能够解决我们需求。1. 为什么要使用锁为了避免陈述什么并发资源访问、多进程、多线程共享的课本式答案,我们来举一个栗子吧。背景是:现有学渣小 A,学霸小 C 两人,小 A 上课睡觉,下课后就会向小 C 借课堂笔记。无需使用锁小 A 就这么每节下课都愉快的去借阅小 C 的笔记,日子平平淡...

2019-08-20 21:07:37 51

原创 nginx 平滑重启 vs 平滑升级

1. nginx 架构在总结了 nginx 配置以后,发现 nginx 可以做到平滑重启和升级,即在重启和升级的过程中服务不间断。于是怀着好奇的心情,开始了探索 nginx 的平滑重启和平滑升级是如何实现的。先解释下笔者对这两个名词的概念:平滑重启:针对的是更新 nginx 的 *.conf 文件平滑升级: 针对的是 nginx 服务的二进制文件更新,比如版本升级或者引入三方的模块重新编译...

2019-07-16 22:03:10 401

原创 Nginx 配置说明

笔者最近在做公司的去 nginx 的工作,工作的内容是将 nginx 配置翻译成公司的自研的类 nginx 服务的配置,但问题是笔者之前并未接触过 nginx 配置相关的内容,本着「不懂就要总结」的精神,笔者整理 nginx 常用的配置,如有遗漏欢迎指出。1.Nginx 能做什么?Nginx 可以提供反向代理、静态资源 WEB、负载均衡、动态缓存的服务。1.1 反向代理正向代理与反向代理的...

2019-06-16 18:41:10 207

原创 vscode 的重装之旅 — 调试适配器进程意外终止

笔者想要研究下 channel 的源码,但是发现 vscode 的 debug 功能居然不能用了,真的是惨绝人寰,惨无人道啊,只能被迫开启重装之旅了。1. 报错笔者的英语水平有限,给 vscode 安装了中文的插件,所以提示的报错如下:中文 -> 调试适配器进程意外终止英文 -> Error: Debug Adapter Process Has Terminated Unex...

2019-05-20 21:54:20 2735

原创 HTTP vs HTTPS vs HSTS

在推动公司的全站 HTTPS + HSTS ,整理用到的知识,供以后查阅只用。1. HTTP 背景知识1.1 HTTP/0.9单行协议,极其简单。请求:由单行指令构成,以唯一可用方法 GET 开头,其后跟目标资源路径GET /mypage.html响应:只包含响应文档本身<HTML>这是一个非常简单的HTML页面</HTML>缺点:只能传输 H...

2019-04-28 21:37:14 264

原创 时序数据库入门

数据库的模型包含关系型、key-value 型、Document 型等很多种,那么为什么新型的时序数据库成为监控数据存储的新宠呢? 下面就会从为什么需要时序数据库?时序数据库的数据结构两个方面来介绍一下时序数据库。1. 为什么需要时序数据库1.1 时序数据特点时序数据有如下几个特点:基本上是插入操作较多且无更新的需求数据带有时间属性,且数据量随着时间递增插入数据多,每秒钟插...

2019-03-30 23:13:13 9106

原创 操作系统之——内存管理

程序的运行速度受计算机内存(RAM)大小的影响。但技术上并不能拥有一块容量无限大、速度无限快、永久性的存储器,所以提出了「分层存储体系」的概念。存储器类型特征由什么管理高速缓存以 MB 为单位、昂贵且易失硬件负责管理内存以 GB 为单位、价格适中且易失存储管理器磁盘以 GB、TB 为单位,价格低廉且非易失文件系统负责管理存储管理器负责内存管理部...

2019-02-27 22:05:45 106

原创 你听过文件系统吗?

你听过文件系统吗?听过那让我们一起复习一下吧_1. 复习背景知识第一部分属于对文件系统的复习内容,了解的人可直接阅读第二部分。1.1 为什么需要文件系统文件存于磁盘中,磁盘可以理解为一种固定大小的线性序列,支持读块 k 和写块 k 的操作。假设没有文件系统,用户必须手动进行以下的管理:记录数据存储在磁盘的哪些块中。记录哪些块是空闲块。避免在存取数据的过程中误操作其他用户的数据块...

2019-01-27 19:31:18 184

原创 小白的实时通信之路

1. 定义1.1 背景介绍通信: 客户端和服务端的一次交互过程。可以简述为如下步骤:客户端发出请求服务端接收,处理,返回结果客户端接收结果实时通信:所谓「实时通信」就是要求客户端能够收到服务端实时更新的结果,其实简单理解就是在通信这个词上加了「实时的」这个形容词,所以本质上通信的双方还是客户端和服务端。举个生活中实时通信的例子,约会中,为了实时获取到对方的位置,可能采用...

2018-12-22 17:52:52 222

原创 用 mutex、channel、自旋锁进行同步

背景Goroutine 是原生支持的一种轻量级线程——协程。协程的优势在于上下文切换的代价非常小,但进程中执行数以万计的协程,依旧能够保持很高的性能。进程、线程、协程的关系和区别:进程拥有独立的堆和栈,既不共享堆,也不共享栈,由操作系统负责调度。线程拥有独立的栈和共享的堆,由操作系统负责调度(内核线程)。协程拥有独立的栈和共享的堆,有 golang 的调度器负责调度。想象一个场景,...

2018-12-04 21:21:16 343

原创 正确使用 protobuf 的姿势

Protobuf 总结用途Protobuf 是 google 出品的序列化框架,可跨平台、跨语言使用,扩展性良好。与 XML, JSON 等序列化框架相同,Protobuf 广泛的应用于数据存储,网络传输,RPC 调用等环境。序列化: 将 数据结构或对象转换成二进制串的过程反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程笔者认为序列化和反序列化可理解为上学的时候...

2018-11-21 21:44:28 1920

原创 理论结合实践总结分库、分表

垂直拆分垂直分表把一张列比较多的表拆分成多张表,又称为「大表拆小表」,拆分是基于关系型数据库中的「列」(字段)进行的。通常情况,某个表中的字段比较多,可以新建立一种「扩展表」,可以按照如下原则进行垂直拆分:把不经常使用的字段单独放在一张表把 text, blob 等大字段拆分出来放在附表中经常组合查询的列放在一张表中数据库设计的一般建议遵循三大范式,垂直拆分更多的时候应该在数据表...

2018-10-27 18:53:50 95

原创 数学,我拿你怎么办(2)?

极大似然函数「极大似然」是统计学中的概念,容易懂的描述是,假设观测到一个现象的发生,就有理由认为这个现象(与其他现象相比)发生的「可能性」大。「可能性」是由似然函数刻画的(不是概率),既可认为造成「可能性」最大的就是真实的参数。比如,今天是个晴天,可以认为是晴天发生的「可能性」比阴天大,所以今天才是晴天。极大似然的目的就是:利用已知的样本结果,反推「可能性」最大导致这样结果的参数 。背...

2018-10-11 20:54:10 101

原创 一个死锁引发的思考

笔者在转到 golang 之后使用最多的就是 Grpc 的库,这次裸写 tcp 的 client ,由于 client 的 write 阻塞间接导致了代码死锁,在此处记录下。client write 的分类写成功「写成功」指的是 write 调用返回的 n 与预期要写入的数据长度相等,且 error 为 nil 。函数原型如下:func (c *TCPConn) Write(b []by...

2018-09-24 17:55:36 243

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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