- 博客(94)
- 收藏
- 关注
翻译 我退出了编程世界
经历了大量的计算机技术的学习后,我发现了一个朴素而简单的道理,那就是技术员相对于需求和业务而已毫无作用,技术从业者的未来毫无前途,于是我决定,永久退出编程世界。再见了编程,再见了计算机科学。
2023-06-14 00:37:20 7850 8
原创 io_uring 使用教程| io_uring 完全指南 | io_uring 实践指导 | io_uring 资料参考
io_uring 完全指南地图背景io_uring 是 2019 年做的,与 kernel 5.1 发布。后续打了很多补丁,比较重要的在 2020年5月之后基本达到了一个很好的可用性。学习这个东西和学习 epoll 系列的、学习 UNP 和 linux 网络编程其实没有什么区别,都是利用已有的工具解决问题,其实不涉及像学 OS、DBMS、分布式系统等这种系统方向技术上的东西,但是有一些惯常做法还是需要记录一下,如何利用工具,以及在工具的限制下解决问题也是一门形式化技术。本文只是提供一个使用 io_uri
2022-04-03 00:02:35 9179 2
原创 网络编程 高性能定时器数据结构分析 | 时间轮 红黑树定时器性能分析 | 为什么要做用户态定时器
本篇仍然是编写一个网络库、框架(类似muduo、libev、nodejs)的网络编程系列。原文和11月的另一篇笔记的第二部分附录基本内容一致,属于是一稿多投,主要补充了一些分析内容,实际本文技术含量不高,完全是空想臆测的流水账。
2022-02-19 00:37:44 3533
原创 epoll LT ET 区别 | Nginx epoll 原理 listend 用 LT
最近学 muduo 和 nginx 写网络库,总结一下 epoll 上遇到的一些问题和学习的笔记,主要是对 LT、ET 和平滑升级里的一些点理解一下。
2022-01-30 00:59:11 2881
原创 stl std::sort 内省排序 sort 函数源码分析 排序算法比较 排序算法性能 排序算法时空复杂度分析 为什么快排最快
算法课程第二次上机排序算法性能比较上机报告题目:实现插入排序(Insertion Sort,IS),自顶向下归并排序(Top-down Mergesort,TDM),自底向上归并排序(Bottom-up Mergesort,BUM),随机快速排序(Random Quicksort,RQ),Dijkstra 3-路划分快速排序(Quicksort with Dijkstra 3-way Partition,QD3P)。在你的计算机上针对不同输入规模数据进行实验,对比上述排序算法的时间性能。要求对于每次
2022-01-11 21:58:26 1242
原创 为什么 Redis 采用单线程还那么快?
本来在总结并发 B+ 树中的死锁问题,看到笔记里面写着 redis 不用做并发死锁活锁那些东西的处理,于是理解一下这一点。CPU 速度的定量数据主要根据 jeff dean 10年前的经典文件:Latency Numbers Every Programmer Should Knowredis 为什么单线程跳表redis 是单线程的,采用 IO multiplexing,因为他是内存数据库,根本不需要 CPU 运算做瓶颈,只要内存够大,本来内存速度就 10GB/s 左右。redis 采用 R...
2021-12-23 12:15:44 848
原创 C++20 coroutine 探索III: 异步编程,Task<T> 编写,boost asio 协程分析,C# async / await, cppcoro 源码分析
经过了前面对 coroutine 的反复学习,现在尝试写一些封装好的协程工具(reinventing the wheel)。本文先从最Promise 异步编程模型的最基本的 Task<T> 入手.异步编程Futures and promises - Wikipedia异步的关键点是真正的无线程异步必须要 all the way down 到 O/S system call 层面甚至到硬件层面的异步支持才能实现 (对于 Linux 的驱动模型, 做 top half 工作的 softirq
2021-11-23 21:37:51 2802 6
原创 多人网络游戏服务器开发基础学习笔记 II: 帧同步 | 游戏客户端预测原理分析 | FPS 游戏状态同步
这篇是对书本 网络多人游戏架构与编程 的学习第二篇,内容还是以基础为主。第一篇主要是讲解了网络多人游戏的一些最基础的知识。同时因为一些点书本内容太简略,所以参照学习了 GDC 2017 守望先锋对 ECS 架构涉及和网络同步的视频分享结合讲解加深理解。尝试提供所有必要基础知识理解游戏客户端预测(但是只是基础角度的分析,有需要深入学习的时候直接看视频)。对于守望先锋 ECS 架构部分这里不涉及,那部分内容属于 gameplay 部分,可以看云风大佬的分析。GDC 的视频连接下文会给出。对于游戏中的各
2021-11-14 17:46:05 11373
原创 EPOLL 原理分析线索 SELECT POLL 原理
首先复习一下 select,poll,和 pselect 先吧。select 是传一个 set 给他,内核收到动静返回,我们再检查 set 有谁可用。 pselect 是为了解决信号缺失的问题他保证在睡觉之前检查一下 mask (需要配合 sigprocmask)如果有马上返回。 poll 的主要解决问题只是 ns 的超时而已。linux 也提供了 ppoll 实现 pselect 相似的功能。还有一个要点是 pselect 只用了 bitset ,而 poll 用的是fd结构体数组。由于一个...
2021-11-10 20:00:39 507
原创 什么是高并发高可用一致性?| 现代网站架构发展 | C 语言实现布隆过滤器
Lab: Bloom Filter提要这是一个简单的数小时可以完成的 C 语言学习编程练习,读者将学习编写一个布隆过滤器 (Bloom Filter), 谁是当前网络应用中广泛应用的一环。本文假定读者是对网络编程零基础的。参与者应当具备良好的 C 语言编程基本知识,包括但不仅限于以下知识点:基本的编程(分支循环等)整数数据类型位运算结构体指针堆上内存分配 (malloc 和 free)以下将提供足够的必要前置知识(不够清楚的地方可以在网络进行信息检索)关于布隆过滤器帮助完成练习。本文
2021-10-16 20:53:15 396 2
原创 从自旋锁、睡眠锁、读写锁到 Linux RCU 机制讲解
总结一下 O/S 课程里面和锁相关的内容. 本文是 6.S081 课程的相关内容总结回顾, 前置知识是基本的操作系统知识以及部分组成原理知识. 举例如: 线程与并发的概念, 中断与管态用户态概念, 以及基本的并发编程锁模型如读写锁等和部分数据结构. 对于 shared data structure, 需要保证读写的 critical section 时具备 consistency, 特别是读的适合, 不希望读到一个不完整的数据或者数据结构的不完整的结构. 比如一个链表在多个线程的读写过...
2021-08-07 04:24:07 5116
原创 从无到有构建计算机网络
本学期网络课程使用自底向上的思路学习, 如果思考为什么要做这个东西, 也就是需求的话, 还是要用自顶向下的方法分析. 但是做的时候又要自底向上一层一层建起来的, 有时候又会发现, 有些下层的东西, 又恰好是根据上层的应用才修改的. 只能说两种思路会促使不同角度看问题. 这些总结我希望以自底向上的方法来写, 最后再写一个自顶向下的串起来回顾. 自底向上也能帮助了解更多历史上的设定. 由于要传输数据, 我们上从物理层开始创建一个东西. 既然是数据通信, 就有物理连接, 这个东西就是传输介质....
2021-07-09 00:06:42 1425
原创 Karplus-Strong Algorithm 弦乐器模拟 吉他弦乐器发声原理 泛音 乐理概述
本文是记录 CS61B HW1 学习中内容。 这段时间在学乐理,信号与系统还有模拟电子,遇到这个 HW 现在杂糅一下记一下思路方便之后回顾。 这个 Hw 在做一个 Physical Modelling Synthesis 的过程,主要是用这个 Karplus-Strong 算法来模拟打鼓和弦乐器的声音(这个应用也许可以做电钢和合成器?不过为什么不用录音),我粗略读了一下论文,主要是先给出了模拟方法,构建了系统框图,然后在复频域分析为什么简单的算法能得到好效果。我这里为了能方便理解...
2021-07-08 23:57:01 2184
原创 深度学习知识速成 I 深度学习工具链名词解释 深度学习原理
简单的想法是再倒着做一次 RNN,但是实际不行,因为我们希望一致的结果,所以实际我们需要做一些改善,其实有正的,也就可以有反的。预训练是指预先训练的一个模型或者指预先训练模型的过程,微调是指将预训练过的模型作用于自己的数据集,并参数适应自己数据集的过程。CNN 除了用于分类,还有图像生成中的风格迁移、滤镜化等也很有效,这种由原图生成近似图像的时候,CNN 本身卷积生成结果的过程其实可以认为是一种滤波,只要参数够多,网络够大,一个 CNN 看作一种滤波器就能理解了。还剩下的内容有目标检测的 Yolo。
2022-12-30 17:49:36 1832 1
原创 Graphviz 排版思路 Graphviz 如何控制节点位置
实际效率需求的生产中,我们还是用 GUI 工具吧,这种除了要通过代码生成的情景或者大量的数据下之外,比如这种需要对特定节点特定边的位置进行控制的,没有太大必要去用脚本工具画图。原理是通过添加额外的节点和边以及 rank 限制条件,来控制生成节点尽量满足需要的排版。不过这个实际和算法执行起来算出来的效果有关。这里 invis 边就是用来控制位置用的。因此我们继续加入一些限制来吧这个 3 移动回到 2 的左边。可以看到 3 就是不能在 2 的左边。有个画图需求是需要生成特定排版的关系图。
2022-12-20 01:37:13 3823
原创 “ 奋斗者耕耘论坛 ” 商业计划书 | 内卷 | 大学生创业计划书 | 大创 | 创新杯项目 | 如何财富自由 | 怎么发财 | 赚钱方法
2020 年, 各行各业的奋斗者们都很焦虑. 他们在”内卷”的大环境下压力从从. 无论是大学还是职场, 奋斗者们努力着挥洒汗水, 希望实现自己的梦想,过上追求的美好生活. 无论是学业的压力还是职场的压力, 让这些曾经高考的佼佼者, 毕业生中的优胜者也苦不堪言. 他们 没有获得一种‘拥有’的确定感,而这, 就是我们奋斗者论坛应该做的事情!熟悉互联网职场的人应该都知道一个职场 APP—脉脉, 这个基于互联网职。
2022-10-30 00:12:20 604
原创 A记录 CNAME记录是什么 | DNS 查询的过程 | DNS 根服务器是什么 | 配置域名 CNAME 原理
全球共有 13 个根服务器, 然后近到本地 Isp 会配置多个缓存服务器(DHCP分配的 dns 就是 isp 提供的缓存服务器).终端设备进行 DNS 查询的时候, 首先是本机缓存,然后是 host文件
2022-10-29 17:40:15 954
原创 珂朵莉树 范围查询 chtholly tree Old driver tree
因为我没看过这个动画,所以还是备注一下。珂朵莉是珂朵莉·诺塔·瑟尼欧里斯,轻小说《末日时在做什么?有没有空?可以来拯救吗?》及其衍生作品中登场的女主角,成体妖精兵之一。最强圣剑“瑟尼欧里斯”的适合者。原题是 Codeforce 上的一道区间有关的题目。Chtholly Tree 又名 Old driver Tree。 珂朵莉树 - OI Wiki (oi-wiki.org)这个锯树结构其实并不是数据结构,只是一个 set 的用法二一。首先是基本的思想,实现老司机树,只需要一个 `std::set` 以及熟悉
2022-06-20 14:42:24 358
原创 Life, Art, and Mysticism | Vita, arte e mistica | 布劳威尔 生活艺术和神秘主义翻译,第一章 | I - The sad world
原文:Vita, arte e misticaLUITZEN EGBERTUS JAN BROUWER 布劳威尔英语 Translation by WALTER P. VAN STIGT机翻+润色,第一章。网上找不到中文翻译。马上来备用。虽然可以读英语,但是效率太低了。charper 1 the sad world荷兰被创造并一直存在由于大河的沉积。 沙丘和三角洲,潮汐和排水。Holland was created and was kept in existenceb..
2022-05-30 20:53:30 534
原创 More C++ Idioms C++ 惯常用法总结
内容来源: 正在上传…重新上传取消 More C++ Idioms - Wikibooks, open books for an open world 总结Acyclic visitor 没搞明白 address of 是为了解决重载 operator & 的问题。 Attach by initializaiton,对于 event-loop 的程序以及接管 main 的程序(通常是 GUI 或者像 gtest 这种),有一些 main 之前的逻辑 ...
2022-05-26 23:50:43 1125
原创 Golang tutorial for C++ Programmers | Go 语言速成 | 3分钟学会 Go 语言 | Go 语言教程给 C++ 经验
map: map[key]value 用 append 和 slice 实现 queue。 用 make 造数组首先花几秒钟浏览一下 Go 的语法:Learn Go in Y Minutes (learnxinyminutes.com)Go for C++ prgmGo for C++ developers (golang.org)看完后下面花两分半钟总结一下 Go 语言的速成:Go 核心array = 数组 slice = span<T>/basic_...
2022-05-25 16:27:00 290
原创 编译原理语法分析 CFG 上下文无关文法基础 简单语法制导 parser
+-乘除的 Context free grammar 是:Low precedence operator produce high precedence operator.Left associativity place recursive production to the left of of the body.torn apart 思路:factor 无法被 operator torn apart (即不能让 sub factor 与 factor 被拆分运算)。 t..
2022-05-17 19:46:53 994
原创 正则表达式与自动机基础 NFA 驱动程序 手写 NFA 自动机
到这里,理解 NFA 的模拟思路和编写通用 NFA 驱动已经是很简单的事情了,state 是整个状态机的圆圈状态,states 是圆圈状态的一个集合。技术总结,上面的代码写得又臭又长,但是我觉得这是十分契合简单直接(愚蠢的我)的直觉思路,对 NFA 的优化更有兴趣的,一个是 leetcode 上面针对这一题的有很多简洁的写法,然后 algs 4 上面有专门的章节讲这个,但是他还真的有一个 Graph (邻接表或者矩阵,忘记了)的数据结构,同时支持了括号、|,* 等,纯纯 DFS 思路,我是不想研究了。
2022-04-23 20:35:21 1324
原创 grpc 基础和 http1.0 http2.0 http1.1 区别 HTTP 2.0区别
数据库MySQL Connector 最新版本的安装、配置链接的 manualMySQL Connector/C++ 8.0 Developer Guide (oracle.com)MySQL Connector API 的不同语言 manual 目录。MySQL :: Connectors and APIsMySQL 有好几种 API。最简单的是 mysql 本身有一套 tcp 通信协议:MySQL :: MySQL Internals Manual :: 14 My...
2022-04-23 20:23:53 3549
原创 io_uring 触发内核线程的问题 iou-wrk 线程 io_uring 原理 io_uring SQPOLL 原理
2022.04.06记录一下 io_uring 用于 socket 触发大量 wrq 线程的问题昨天我写了一个 sq poll 的版本。好不容易编译了内核(教训是内存和 swap 一定要充足)。然后编译了 perf(原来这些 linux kernel 源码就自带了,为什么不直接编译呢?)kernel 源码1,200M,编译完之后 15 m。然后进行了 perf 测试,大跌眼镜。我本来以为在 ECS 上是 CPU 瓶颈 lo 跑的是 4000 /min 的并发(2核资源受限云资源虚拟机)...
2022-04-23 20:18:17 1858
原创 小心 UB
记录一下这次由于眼睛瞎了“学习” DPDK 的 lockfree ring 来改装自己的 spsc lockfree ring 的时候选择性忽视了 volatile。2021/12/3 10:57我不知道什么时候引发一个印象是因为清楚了编译器的代码优化工作之后形成一种观念是 inline register 这些 qualifier 都没用,结果无意识下也把 volatile 给算进去了。但是肯定不能这样想啊,毕竟 cv qualifier 每次写相关的东西都会有 clang-tidy ...
2022-04-23 20:14:12 1070
原创 虚拟继承和里氏替换原则
(Liskov Substitution principle)我完蛋了,完全忘记虚拟继承了,面试的时候没想明白。(因为我编程也没用过虚拟继承,都是用静态的)。。。somehow,我写出了一个很离谱的代码(某种拙略的 ECS 变种?之后一定要学习一下 ECS):#define VIRTUAL_INHERITtemplate <typename BASE>struct defaultModule : virtual BASE {};template <template
2022-04-23 20:13:11 1407
原创 有栈协程和无栈协程的区别
有栈协程和无栈协程之前面试的时候面试官问我这个问题。我说好像他们都有运行时候的栈,所以我不懂有什么区别。面试官说他们的区别主要是调用者是否需要考虑栈的大小。后来我回来理解了一下,的确有栈(ucontext这种)和无栈实际都会有 context 和 registers 、pc 指针保存,但是作用域不一样。这里一张图说明一下:有栈就是 ucontext 以及 xv 6 里面写的那个 user level thread (no multicore),可以直接挂起一系列的帧。无栈就是编译器在 aw
2022-04-23 20:09:39 1075
原创 windows 10 navicat 连接 wsl2 MySQL ERROR 1410 (42000) 连接未知错误
mysql bind address 的意思是绑定一块入站网卡ip地址。由于 win10 和 wsl 2 是随机生成的 ip 地址的,因此绑定的时候要允许通过虚拟网卡入站。首先设置sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf把bind-address=127.0.0.1 去掉,或者改为虚拟网卡绑定的网卡接口。可以通过ip addr show查看 172 开头的地址。然后进入 mysql,创建 test 用户,% 是允许所有入站地址进入。crea
2022-04-10 13:11:54 2091
原创 Ubuntu apt-get update 一直 0% 等待报头 waiting for headers
这个问题属实太烦了。上次也是遇到一次类似的问题。先上结论,如果遇到这个问题,但是 curl 可以走通没问题,可能就是 mtu 的问题,一般可以用 ifconfig 来改 mtu,但是新版的 ubuntu 确实离谱,什么都没有,要安装 net-tools 又要 apt-get,经典鸡蛋问题。 sudo ip link set mtu 1492 eth0问题是今天用 Ubuntu apt-get update 准备安装一些编译内核的工具,然后他就一直卡着。换了好几个源和文明上网都没用。最后想起来.
2022-04-05 21:34:12 3468
原创 基于协程io_uring 异步网络库系列 VIII: 异步 task 的线程池 | CPU bound task 使用线程池 | Reactor 多线程 v.s. Proactor 多线程
主要讨论一下一些异步的投递的实现,第二部分是 CPU bound 的 task 的线程池,因为 proactor 对线程池的要求和 reactor 的不一样。
2022-03-06 16:37:22 469
原创 基于协程io_uring 异步网络库系列 VII(资料): io_uring 和 NONBLOCK | short read 问题 | io_uring blocking io 资料
这里其实我之前有一个问题的,对于普通的非阻塞read write 来说可能每次读到写到的 n 都不等于我们请求的 nbytes,然后最好情况也最多是 64kb,不可能够传输长(相对)连接大文件的,这个问题 io_uring 提交的时候是否能支持更大的 nbytes 呢? 当然 manual 的说法是Each I/O operation is, in essence, the equivalent of a system call you would have made otherwise, ...
2022-03-06 16:30:44 1785
原创 基于协程io_uring 异步网络库系列 VI: io_uring v.s. epoll | proactor v.s. reactor | io_uring Proactor 模型
本文讲解 io_uring 如果编写 proactor 编程模型,同时对比 Reactor 模型。主要涉及的是模型中的 IO 部分,比如 short read。
2022-03-06 16:28:10 584
原创 基于协程io_uring 异步网络库系列 V: executor 和线程池 thread pool
这是一个系列文章,目录:cppcoro 源码级使用教程系列: 概述 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记_我说我谁呢 --CSDN博客很遗憾的是,虽然本身学习服务器应该把 socket 编程、缓存处理、linux 系统调用信号机制等这些为重点,但是对于要用 coroutine 来做的话,其实是优点舍近求远的,因为你必须理解异步和 coroutine 本质上的状态机,所以这里的非关键因素的篇幅和绕程度可能会大一些。我属实没搞明白他们是怎么学这部分的内..
2022-03-06 16:25:00 1135
原创 C++20 Thread Cancellation | jthread | std::stop_token | jthread 和 stop_token | CAS| 内存屏障|std::atomic
熟悉一下 C++20 引入的 stop_xxx 即 <stop_token> 头文件提供的 Thread cancellation 的支持。熟悉多线程编程了,一般 demux 程序(比如基于 epoll/select/poll 的大部分时间的“死”循环)就是一个状态机。过程中我们如果希望调控他的话,就要使用变量(作为状态机的输入),达到一个检查状态的时候,程序(一般是我们写的死循环)就会响应我们的输入,给出输出。或者说是一种信号机制吧,Nginx 的信号控制进程的停止、reload...
2022-03-04 13:39:45 1691
原创 基于协程io_uring 异步网络库系列 IV: Proactor 与 asynchronous operation | C++20 coroutine | io_uring 异步IO 网络框架
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前...
2022-03-04 05:54:55 548
原创 基于协程io_uring 异步网络库系列 III: Proactor、异步与协程 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前广泛的.
2022-03-04 05:52:17 837
原创 基于协程io_uring 异步网络库系列 II: 协程基本组件概要 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前广...
2022-03-04 05:47:30 906
原创 基于协程io_uring 异步网络库系列 I: 异步和协程复习 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
首先复习协程的部分先(对照 C++20 coroutine 探索 系列笔记, 建议对着第二篇的查阅备用来复习)。这可能是因为编写 awaiter 是如何的是很重要的(如果要支持用 co_await 写程序的话),所以还是要搞明白协程和 cppcoro 提供的协程包装(是C#早有的成熟系列)的执行过程。其实下面我会一直强化这个协程状态机的运行走向,就当作是复习巩固记忆了。一个协程的返回值 task 是一个 R 类型兼 Awaiter 类型,他的 promise_type 的 initial_susp...
2022-03-04 05:44:12 789
原创 基于协程io_uring 异步网络库系列: 概述 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
很遗憾的是,虽然本身学习服务器应该把 socket 编程、缓存处理、linux 系统调用信号机制等这些为重点,但是对于要用 coroutine 来做的话,其实是优点舍近求远的,因为你必须理解异步和 coroutine 本质上的状态机,所以这里的非关键因素的篇幅和绕程度可能会大一些。我属实没搞明白他们是怎么学这部分的内容的?是因为学过 call/cc? 是从 ts 开始就跟踪这个协程的点?还是本身研究理解过 javascript 的异步、C# 的异步、还是其他语言像 golang 的 coroutine...
2022-03-04 05:41:52 2139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人