2024年度总结
2024的元旦仿佛还在昨日,2025的元旦已经悄然来临,大概是因为大半年的时间都在实习上班。今年做了不少错误的决定,最后落到了一个令自己不太满意的处境。
技术成长回首 2024,我似乎并没有什么令人满意的技术成长。从3月开始实习就占据了我几乎所有的时间,早10点半晚10点的工作让我很难挤出精力给工作以外的事情,即便是周末也没有精力和动力去学习其他东西。bustub 断断续续做了一年也没做完,还差个 P4 没做。这大概也将会是我毕业工作后的状态,一想到这一点就有点绝望。作为代替,我在实习的工作中熟练掌握了鸿蒙开发。说起来也挺可笑的,原本那么看不起华为,结果最后还是要靠给华为的系统贡献生态为生。
为什么不是老本行安卓开发?这就要谈到我 24 年做的一个错误决定了:3月份时原本打算找腾讯的客户端实习,最开始面了 QQ,面了两面面试官告诉我他们在排序,不要抱太大希望。这时 dcd 的 hr 在 boss 直聘上主动找上门来,就面了一下,很轻松的过关了。我想着反正是字节,其实还不错,就去了。实际上 QQ 那边释放之后腾讯还有很多机会,pcg 腾讯视频,浏览器,wxg 的公众号都陆续找我约面试。其 ...
区块链中的共识算法概述
Abstract共识算法是区块链技术的核心,能够让分布式网络中的节点在去中心化的环境下对共享账本的状态达成一致。它们确保了交易在复杂网络条件下的完整性和一致性,即便面对恶意行为也能维持系统的正常运行。本文概述了几种主流的共识算法,包括比特币(BTC)使用的工作量证明(PoW)、以太坊(ETH)2.0 采用的权益证明(PoS)、以及在分布式系统中具有重要地位的拜占庭容错(BFT)和崩溃容错(CFT)算法。
1 Introduction (引言)区块链的共识算法是一种分布式节点之间达成一致的机制。在区块链网络中,众多节点(可以是计算机、服务器等设备)共同维护一个分布式账本。由于这些节点可能分布在不同的地理位置,由不同的主体控制,并且网络环境复杂多变,所以需要一种方法来确保所有节点对于账本的内容(如交易的顺序、有效性等)能够达成统一的认识,共识算法就是用于解决这个问题的技术手段。
在本文中我们将对若干种主流的共识算法进行概述,包括比特币 (BTC) 使用的最经典的工作量证明 (PoW),以太坊 (ETH) 2.0 使用的权益证明 (PoS),还有在分布式系统容错领域发挥关键作用的拜占庭容错( ...
Y Combinator
TL;DR
combinator 函数必须不含自由变量,combinator 之间可以组合
Y combinator 解决了匿名函数不能递归调用自身的问题 (在不能给函数命名的 lambda caculus 中也可以递归了)
What is Combinator?
A combinator is just a lambda expressions with no free variables.
123456(lambda (x) x) ✅(lambda (x) y) ❌(lambda (x) (lambda (y) x)) ✅(lambda (x) (lambda (y) (x y))) ✅(x (lambda (y) y)) ❌((lambda (x) x) y) ❌
所以一般的递归函数都不是 combinator
12345(define factorial (lambda (n) (if(= n 0) 1 (* n (factorial (- n 1)))))
factorial 是自由变量,那么如何解决这个问题?只要再套一层 l ...
实现一个 crepl
https://jyywiki.cn/OS/2024/labs/M4.md
今年在追番蒋炎岩老师的 NJU OS 2024spring。因为之前已经做过不少 os lab,所以这次不打算做 os lab,但是发现 jyy 的非 OS lab 设计得都非常有意思,所以决定做一下。
以前我从来没有思考过 crepl 要怎么实现,没想到利用 gcc 就可以如此容易的实现一个 crepl,以前没怎么接触过的 so 库的用法和其本质也逐渐熟悉起来了。
虽说出于学术诚信上的考量 jyy 并不希望我们公开 lab 代码,但是这个 lab 确实没什么难的地方,相信不会有南大学子上网搜代码抄的。并且我因为偷懒直接使用了 system ,直接抄我的也得老老实实改成 fork & execve 实现:D
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798 ...
Linux 并发原语实现
起因之前听到群里有人在问条件变量的实现,发现自己对这方面一无所知。
先复习一下 xv6内核中用到了两种锁,自旋锁和睡眠锁。
自旋锁先看看实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354// Acquire the lock.// Loops (spins) until the lock is acquired.voidacquire(struct spinlock *lk){ push_off(); // disable interrupts to avoid deadlock. if(holding(lk)) panic("acquire"); // On RISC-V, sync_lock_test_and_set turns into an atomic swap: // a5 = 1 // s1 = &lk->locked // amoswap.w.a ...
博客写作部署分离实践
使用了 Elog 一键同步飞书文档上编写的博客文章到 hexo 仓库,以后博文迁移到飞书文档上编写。
发现这玩意好像也不是很好用,感觉可以自己写一个。不过感觉有点浪费时间,算了。
该博文同步自飞书文档
2023年度总结
CS 公开课
北大编译实践
算是编译器方面的一个启蒙,不过感觉连入门都算不上
CMU 15-213 CSAPP
其实课刷得有点马虎,不过把 lab 过完了
这课早晚得再过一遍
MIT 6.S081
对系统内核理解 0 的突破,也学着读了一些英文论文
参加了清华组织的 rcore 开源操作系统训练营,混了个结营证书
因为是实习期间做的,所以其实有点水,不过实验都做完了,也学了一些工程项目中内核的调试方法,也不算毫无收获
复习了一下 Rust
CS106X (正在学习)
本意是想过一遍 cpp,后来发现其实基础的算法和数据结构讲得更多。
不过听着感觉也不错,巩固下基础,对以后做力扣题也很有帮助。
参加了达坦科技的 MIT 体系结构公开课开源学习社区,现在在看 MIT 6.004
会学 Bluespec,lab 是做 MIT 6.175 的,内容是用 bluespec 搓颗 RISC-V CPU
真搓出来了想在上面跑 rcore(_我的天,还有比在自己写的 CPU 上跑自己写的系统内核更酷的事情吗_)
猛然发现 2023 是我的 CS 启 ...
周报
2023.12.18~12.24因为游戏账号被封了一个月所以开始写周报 push 自己学习的第一周(
看到学弟在学 6.824,说实话有点慌,真得 push 一下自己了
学习 & 工作
完成 CS106B 的 assignment 1,2
目前为止都是一些很简单的内容,还没有涉及到我比较想学的部分
参加了
Datenlord 的 mit 体系结构公开课学习社区
学习的课程是 6.004 6.175 6.375 ,这三门课的知识点重复度很高,大概只需要看 6.004 的课,做 6.175 的 lab,穿插学习 6.375 即可
不过大概率不会坚持到最后,只是一个学习计组的契机
学习体系结构的过程中也会并发进行另一门公开课的学习,目前是 CS106X,之后会做 445 和 824
生活
久违的下了个音游(邦邦)来玩,发现了一首很不错的曲子
下周计划下周其实离考试周就很近了,所以不一定能做完
过完 6.004 讲 bluespec 之前的内容
过完一半 CS106X 的课,至少再完成 CS106B 的两个 lab
解决 bear 在 MacOS 中生成空 compile_commands.json
在做到 xv6 的最后一个 lab 时,我终于忍受不了满屏的爆红,着手开始配置代码高亮。参考 https://zhuanlan.zhihu.com/p/501901665 配置 Intellisense,然后我遇到了一个问题:
make clean && bear — make qemu 生成空 compile_commands.json
我 google 查了一下,目前没有中文博客提到这个问题。我在 Bear 的 issue 下发现这个问题已经老生常谈了,因为 linux 和 macos 下 bear 的工作原理不同:
For your problem, here is a little background information… Bear works differently on Linux and Mac. On Linux it intercept the process executions with a preloaded shared object. This trick does not work on Mac. Instead it use ...
virtual-memory-for-user-applications
MIT 6.s081 lecture 17 个人总结笔记
参考:
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/lec17-virtual-memory-for-applications-frans
https://pdos.csail.mit.edu/6.828/2020/readings/appel-li.pdf
之前我们知道,virtual memory 的 page fault 已经被内核玩出了花。进程 fork 的 COW 机制,虚拟内存页表的驱除机制等等,都是利用了 page fault 这个机制实现的。page fault 很好用,那么我们能不能让用户程序也利用上 page fault 呢?
为了让用户程序有效的利用上 page fault 机制,操作系统内核需要向用户程序提供一系列原语(primitives):
Prot1 降低单个 page 的 accessibility (mprotect)
ProtN 降低 N 个 page 的 accessibility,之所以单独提 ...