作者生涯
# ACMer
在 2020/09/20 日作者进入到大学校园,零基础刷学校的 oj 成为了一名 ACMer,并担任学校的队长。
抱着对算竞的热爱,体会训练的千姿百态与不易,在小队里面主要负责的是数学和dp,所以这两块的内容总结的比较多,不过别的算法也都有学习并且记录。
最终在打完 2022 年的 xcpc 后,于 2022/11/27 完成退役。
拿到了高不成低不就的成绩:
- 弱省省赛双冠
- xcpc一银三铜
- 蓝桥杯国一
这些训练和比赛的时光几乎充斥了我的整个大学,也为了后面技术方向的学习展开了铺垫
引链:
# CPPer
退役后不能闲着,因为作者的高数非常稀碎,指定是考不上研了,于是选择找工作。
作者的 CPP 路线起步时选择的是后端网络(滑稽),一直在搞项目与看面试题,学习计划比较错乱,导致在大三下面试暑期实习的时候手里就仅有一份 C/S 聊天项目,就是那种最基本的网络通信而已...
网络编程既然不行,痛定思痛将重心放在系统编程上,结合之前网络编程学习的知识拿着 c++ 最优势的功能从零做了一份 C/S 化的数据库内核,因为当时不知道有数据库 lab 什么的,也使得项目的自定义程度非常高
主要利用到的技术是下面这些,想找工作的童鞋可以参考一下该项目的设计方式~ 项目连接 (opens new window)
项目使用到的技术
- 存储
- 磁盘
- SST 组织 KV 数据
- 以 block 为磁盘与内存交互的最小单元
- block 内顺序存放 KV 对, 16 个为一组,设置重启点为索引存储偏移量
- KV 对采用前缀压缩的 entry 形式存放
- crc32 算法做脚注验证文件的完整性
- LSM-tree 组织 SST 文件
- SST 文件的编码与解码以及刷盘
- LSM-tree 下对 SST 文件进行 level 分级,level 越大 SST 文件越多
- LSM-tree 下对每层溢出的 SST 文件向下合并
- WAL 持久化命令,保证数据安全性
- SST 组织 KV 数据
- 内存
- LRU 缓存来减少磁盘 SST 文件的读取与写入
- MEM-Table(跳表) 作为 LRU 尾部节点弹出与刷盘之间的缓冲区
- 对 LRU 的存放为以内存内部利用率为主的内存池(连续分区存储管理),支持
- 空闲节点的切割与合并
- 空闲链表动态插入节点
- LRU 内 {键: lru节点} 的映射容器为手写的 Trie
- 磁盘
- 通信
- 任意类型数据传输
- 数据拆分成多个字节发送
- 收取多个字节后按类型需要的字节数进行合并
- 主从 Reactor 分发模式下的 Epoll:ET 触发
- 每个客户端经主Reactor监听连接后平均分配进一个subReactor中响应事件
- 响应事件的方法为每个客户端只会在一个线程内进行 Epoll:ET 触发的 IO 多路复用
socket
进程通信- 通过字符串通信模拟报头,完成前置指令
- 通过
uint8_t
传输完成字节信息传递(两个主机之间以大端字节序传输)
- 任意类型数据传输
- 权限与用户
mysql
连接下的用户登入信息判断- 手写容器模板-字典树用于存放 “[用户名] - 数据库对象”
- 支持 string 与任意类型组成的键值对的存储
- 支持部分 map<string, 任意类型> 的操作
暑期实习找的时候这个项目还没有做完,于是并不理想,好在最后超聚变收留了我给了我实习的机会,在里面学习开发操作系统知识。
# 后端er
这也意味着从底层、算法这样的选手转向业务,起因是暑假投的美团秋招,运气比较好问的都是我这个项目,进展十分顺利拿到了 offer ,当时就直接选择allin Java了,于是有了作者现在乱七八糟的技术栈。
由于原本一直在学习底层搭建之类的,突然进入业务方向感觉不太适应,好在抱着对前端的热爱让我度过了起步阶段,并在后面慢慢喜欢上了这门功能强大便捷的语言。
从 2023/09/01 开始学习的,将框架什么的不断进行扩充,并学些中间件什么的。
# 现状
目前作者已经到达了美团打工,公司的wiki和各种术语以及源码十分深奥,属于是边补充技术栈边干活儿吧。
目前就想到这里了...有时间了会再进行补充的~