计算机网络串记
名词解释
RDT(Reliable Data Transfer,可靠数据传输)协议
通过 ARQ 技术以实现 RDT 协议,TCP 就是一种 RDT 协议。
ARQ(Automatic Repeat reQuest,自动重传请求)
ARQ 是一种用于数据通信中的错误控制方法,旨在保证数据传输的可靠性。ARQ 协议通过在发送端和接收端之间引入确认机制来检测并纠正传输过程中出现的数据丢失或损坏问题。
停等式(Stop-and-Wait)ARQ:最简单的形式,每发送一个数据包后就停止并等待确认。只有在收到 Ack 之后才会发送下一个数据包。这种方法效率较低,因为发送方在等待确认时处于空闲状态。
回退 N 步(Go-Back-N,GBN)ARQ:允许发送方连续发送多个数据包而不需要立即等待每个数据包的确认。如果某个数据包未被正确接收,发送方需要重传从那个数据包开始到当前的所有后续数据包。
选择性重传(Selective Repeat,SR)ARQ:类似于回退 N 步 ARQ,但更高效。它只需要重传那些确实丢失或损坏的数据包,而不是从出错点开始的所有后续数据包。这减少了不必要的重传,提高 ...
GC 算法笔记
标记清除法
标记清除法主要包含两个步骤:
标记
清除
示例如下:
开启 STW,停止程序的运行,图中是本次 GC 涉及到的 root 节点和相关对象。
从根节点出发,标记所有可达对象。
停止 STW,然后回收所有未被标记的对象
标记清除法的最大弊端就是在整个 GC 期间需要 STW,将整个程序暂停。因为如果不进行 STW 的话,会出现已经被标记的对象 A,引用了新的未被标记的对象 B,但由于对象 A 已经标记过了,不会再重新扫描 A 对 B 的可达性,从而将 B 对象当做垃圾回收掉。
三色标记法
三色标记法将对象用三种颜色表示,分别是白色、灰色和黑色。
最开始所有对象都是白色的,然后把其中全局变量和函数栈里的对象置为灰色。第二步把灰色的对象全部置为黑色,然后把原先灰色对象指向的变量都置为灰色,以此类推。等发现没有对象可以被置为灰色时,所有的白色变量就一定是需要被清理的垃圾了。
初始标记阶段,指的是标记 GCRoots 直接引用的节点,将它们标记为灰色,这个阶段需要「Stop the World」。
并发标记阶段,指的是从灰色节点开始,去扫描整个引用链,然后将它们标记 ...
C 十十 面经杂文
STL,C++11
move 相关
这里需要构造一个方便指明不同对象的 class A,下面的实现是不符合复制、移动构造函数的语义的,请不要模仿:
12345678910111213141516171819202122#include <iostream>using std::cout, std::endl;class A {public: int id = 0; A() { cout << "Construct A" << endl; } A(A &a) { this->id = a.id + 1; cout << "Copy A(" << a.id << ") to A(" << this->id << ");"; } A(A &&a) { this->id = a.id + ...
Mysql 锁机制笔记
行级锁与表级锁
行级锁由存储引擎实现,而表级锁则是服务器端实现。所以不同的存储引擎有不同的行级锁(说到底似乎只有 Innodb 有这个锁),但带伙的表级锁则是共用的。
网上存在大量博客在解说表级锁的时候每一句都要强调这个功能 Innodb 有,MyISAM 也有,这不是废话吗。。
间隙锁、记录锁与 next-key 锁
间隙锁锁开区间,记录锁锁单条记录,next-key 锁是两个锁组合锁 (...,...](...,...](...,...] 区间的。
间隙锁一副可以使用区间树的模样,但是考虑到只能锁两条存在记录的区间这一表现,比如有 id 为 2 和 10 的记录,现在查找 id<6 的记录,间隙锁按理说是(−∞,6)(-\infty, 6)(−∞,6),但实际上会锁(−∞,10)(-\infty, 10)(−∞,10)。因此这是有原因的:
插入语句在插入一条记录之前,需要先定位到该记录在 B+ 树 的位置,如果插入的位置的下一条记录的索引上有间隙锁,才会发生阻塞。
https://xiaolincoding.com/mysql/lock/how_to_lock.ht ...
原始面经存档
字节后端日常实习一二三面面经
一面(40 分钟)
1,自我介绍,主要介绍了一下一个 go 写的基础项目,强调了一下高并发环境下数据库/消息队列/微服务在里面的作用,后面基本都是围绕这个项目来提问的。
2,你提到了高并发,那么对于高并发环境下数据库的优化都有哪些(说了缓存/分库分表/悲观锁乐观锁和队列)
3,说说乐观锁和悲观锁的区别
4,如果我现在做一个电商下单,比如说抢购的情景,你会用什么方法实现数据库(说了乐观锁,面试官反问乐观锁合适么,我陷入思考)
5,面试官又说,比如现在有两个场景,一个是只有一件商品,有比如十万个人抢购;另一个场景是有一千个商品,还是有十万个人抢购。你都会怎么设计策略。(思考了一会,如果一件商品直接乐观锁,适用于读多写少的场景,如果一千件商品就用一个队列强行把请求变成单线程,只放一千个请求过去,其他全部返回抢购失败)
6,开始问消息队列,有什么作用(异步解耦,说了一个例子)
7,如果使用消息队列怎么解决返回消息同步性的问题(有点记不清了,这个问题想了有点久,和面试官讨论了很久,因为不知道答案说了消息队列的原理/回调,但是感觉都不是正解,后面面试官就跳过这个问 ...
一片荒芜的面经
Mysql
Mysql 的事务隔离级别有哪些?
给定 MYSQL 的情景:通过非主键列更新数据时加锁的流程。
一列主键 a,一列 b,一列 c,通过 b 读出五行 c 的数据需要进行几次磁盘 IO?
索引用什么数据结构?
索引设计原则及优化手段有哪些?
B+ 树的优势是什么?为什么不用 B 树?
三大引擎(MyISAM, InnoDB 等)讲一下,各自的优势和区别是什么?
NoSQL 与 SQL 的区别?
数据库优化
对于高并发环境下数据库的优化都有哪些?
缓存、分库分表、悲观锁乐观锁和队列
为什么会引起索引失效?最左前缀法则?
从 b+ 树的角度去讲一讲,如果插入节点的时候达到了页上限,树结构怎么调整的?
乐观锁和悲观锁的区别是什么?
数据库的锁都有什么类型?
介绍一下行级锁和表级锁。
给出一个使用表级锁的场景例子。
在更新没有索引的非主键列时,加锁的流程是什么?
MySQL 聚簇与非聚簇索引的区别是什么?
联合索引的具体结构是什么?给定一个 SQL 语句,能否命中联合索引 (a,b,c)?
1select * from order whe ...
OSPP 2024 经验分享
简单版简历
Github: feathercyc
邮箱:feathercyc@163.com
教育经历:
2023-现今:硕士,计算机科学与技术,华中科技大学
项目基本信息
项目名称:图数据库 NebulaGraph 对接数据访问层 OpenDAL
项目导师:Suyan
项目描述:OpenDAL 是一个数据访问层,允许用户以统一的方式轻松有效地从各种存储服务中检索数据。目前 OpenDAL 尚未对接图数据库 NebulaGraph,希望通过这个项目完成 NebulaGraph 和 OpenDAL 的对接,让 OpenDAL 能直接访问 NebulaGraph 存储的数据。
项目链接:https://summer-ospp.ac.cn/org/prodetail/241190422
关于 OpenDAL 社区
OpenDAL 是一个数据访问层,其支持以相同的方式访问多种存储后端,旨在减轻开发人员要为每个服务重新实现访问各种存储后端的工作量。
关于 NebulaGraph 社区
NebulaGraph 是图数据库,其以 vertex,edge 和 tag 的形式 ...
Mysql 索引设计笔记
聚集索引
非聚集索引:也叫 Secondary Index。指的是叶子节点不按照索引的键值顺序存放,叶子节点存放索引键值以及对应的主键键值。
聚集索引:也称 Clustered Index。是指关系表记录的物理顺序与索引的逻辑顺序相同。由于一张表只能按照一种物理顺序存放,一张表最多也只能存在一个聚集索引。与非聚集索引相比,聚集索引有着更快的检索速度。
非聚集索引与聚集索引应当是要与 Innodb 引擎绑定的,从简易的 CMU15445 数据库以及 Miniob 数据库设计来看,最基本的索引应当是 key 是 col 的值,value 是数据库自己管理的 page index 以及 offset,这里的 value 也可称为行指针。同样的,MyISAM 引擎和简单的 memory 引擎用的都是这种行指针。
在很多地方能看到——MyISAM 引擎用的是非聚集索引——这种奇妙的话。按叶子节点存放索引键值以及对应的主键键值这一定义来看,这显然会导致一个问题——那么主键键值又该怎么访问呢?这句话仅仅考虑了非聚集索引叶子节点不按照索引的键值顺序存放的特点,未免有失偏颇。
MyISAM 这 ...
GSOC2024 Completion Record with Reflections
What I have done
add some doc
feat: add ci
[chore] change some fn’s and variable’s name
add some iter type
chore: add example and correct README
feat: add tests.rs
feat: add intervalmap tests
chore: change crate name to prepare for cargo publish
I have extracted the interval map impl from Xline, refined this part into a crate, added detailed documentation and testing, and published it as rb-interval-map on crates.io.
fix: correct request validation
chore: transfer utils’s interval map impl i ...
Nas 自动化追番系统搭建
来使用 Nas 搭建一个自动化娱乐设备罢。
购买背景
由于笔者现在电脑设备有好几台,最近出于优化工作流的想法,想把自己的个人资料和一些工作文件丢到一起方便管理;而且笔者去年买的 1TB 和 2TB 固态剩余空间现在都有些捉襟见肘了,想把一些 galgame 和正经游戏丢到机械硬盘里存起来;再而且,笔者也需要一台 24h 运行的性能还过得去的设备来跑一些百度云下载、自己写的爬虫等等的简单任务。
综上所述,奖励自己一台 2k 元的威联通 Nas TS-464c 情有可原。
在此之前,笔者有组过 OpenWrt 软路由和使用树莓派 + 外挂硬盘当文件服务器使用的经历。踩的坑太多了,最近也没什么时间捡垃圾回来自组一台 Nas,索性就买一次成品 Nas。
威联通与群晖是 Nas 老牌厂商了,大家对于群晖的评价是简单易用、高价低配,那么威联通自然就是难用、买硬件送软件的性价比代名词。当然,笔者阅读了大量文章后能感觉出威联通所谓的难用也只是对于计算机小白来说的,对于笔者这种软件开发者而言没什么难度,所以威联通很合笔者口味,当即下单。
实际上,笔者想下单之时(2024 年 6 月 2 日)正好遇上 ...