一更,目前前边还有几个剩下的没做完,目前是学到fs了,有太多想说的了,实在是忍不住就写了这篇博客,再往后会继续更新这部分相关.
在去年暑假想学操作系统学这门课之前,看很多企业招聘985高材生给的工资都给的挺多的,有的能给到月薪1.8w+,还有什么年终奖啥的, 俺从来就没见过这么多钱, 还是梦想能有份这么挣钱的工作.
听说985的大佬们都是自学国外的公开课的,又听说MIT的操作系统很好,于是就入坑了6.S081
这门课,看看自己跟985大佬的差距. 选择这门课作为操作系统的启蒙课简直是炼狱级难度,但从学习能力上来看这差距还真不是一点半点,好在学习能力能慢慢练出来.
我记得我刚开始学这门课的时候的水平很捞,大概是英语四级过线一点,会基本的C语言程序设计还有就是会调点python的包. 基本上有啥问题全靠搜.当时连git都不会用,能学懂的大部分课要么比较简单,要么没啥实验.我之前真的踩了太多太多的坑(踩坑经历在结尾),花费进去太多时间,一直在挫败感中挺了那么多时间,终于找到方法了,如果当时踩坑的时候能有人告诉我这些就好了,于是就有了这篇文章. 在我刚开始独立做出那几个hard难度的lab的时候,我简直高兴的要飞起来了,哈哈哈哈哈哈哈哈哈哈哈.
以下经验仅仅代表我个人,仅供参考,我目前并没有独立做完所有的lab,只是独立做出了一部分,但是我踩坑踩了好久,最终还是摸索出来了一些方法,所以我觉得我后边写的这些也是有点参考价值的. 并不是每个人都是大佬级别的,上来就能很容易学懂这种课,我觉得从一个小菜鸡慢慢学懂的过程可能更具有参考价值, 因为大佬可能根本想不到有人还能才菜到这种坑哈哈哈哈,如果后续发现更好的经验还是会修改并且更新出来的.
我认为学一个新的东西应该现有一些基础,然后是边做边学,有一部分基础并不意味着要太高的要求, 没必要用基础要求太高给自己设限,更多的在于集中注意力的尝试.
英语四级过线左右
能识别句子的主谓宾,大体知道一些从句是如何修饰主谓宾的,理解基本的语法是看懂书的关键, 好多函数命名啥的是从书里的单词压缩来的,直接翻译意思不对.
c语言程序设计基础
主要是能看懂那些指针的用法,还有一些操作符,读懂lecture2里preparation要求的部分即可(最好做几个后边书上的练习)
每次学习大概能抽出4h+的时间
每次学习的时候能集中精力
因为涉及到在过程中顺便习惯英语阅读,还有看代码,有时候一个段代码会和其它很多部分的代码联系紧密,只看一个地方可能很懵逼.
摸爬滚打很多尝试了很多方法之后,终于找到这条朴实无华但是非常实用的方法:
按照课程的日程表来, preparation让干什么就去干什么,
read的意思是读懂而不是阅读.
看书的时候尽量不要依赖任何关于书的翻译材料,
看视频的时候一开始可以看精译双语字幕版,因为有些单词带点连读带点方言可能听不出来是啥词,可能也不认识.
在一个集中的时间段内长时间集中精力
直接看xv6的英文书,不会的查字典翻译,一开始特别慢,这是正常的,因为还要加上学英语的时间. 尽量找一块能几种经历的很大的时间,比如说6个小时,比较适合放假学. 集中精力是很重要的,因为一开始的时候有英文和操作系统还有c语言指针相关的很多困难,刚开始的时候很难,后边就好了.
尽量不要依赖课程本身提供的任何外部资料(除了视频双语精译和课程记录).
我学这门课的时候希望用它当一个循序渐进的过程去学更多的国外公开课精品课,很多课有时候只是提供教材和lecture notes,甚至都没有视频,很难碰到有人把翻译做到如此精致的课. 我希望我学这门课学完了能拥有通用的学习能力,尽量不依赖除了公开课本身提供的还有字典以外的资料.
听力不那么容易练,因为讲课的时候有很多连读,有可能还有点方言啥的,词汇量不够本身就不那么容易识别一些单词.
独立完成,独立做出来之前千万不要去看答案!,独立做出来之前千万不要去看答案!,独立做出来之前千万不要去看答案!
要不然到时候能独立做出来了会很后悔,有种脏了的感觉,会少很多成就感,而且看答案会了并不是会了,只是以为会了.
一开始肯定很慢,可能觉得难,但其实并不是难,而是不习惯,不习惯英语阅读,不习惯长时间集中精力,不习惯看很多相对复杂的代码.后边会快起来,看书的速度和理解会更容易,听视频也比较容易听得懂.
大概做完这些, 会读完一本四万五千字CET6+(书里边有很多GRE词汇)的英语原著, 而且阅读理解能力会显著提示(因为理解不了也读不下去…), 而且这个课可以看成是一个跳板,学完之后再学其他国外精品课心里也不怂了. 更重要的是,能极大程度上增加信心, 逢山开路,遇水搭桥.
还记得高中老师讲过一个有趣的方法(也是他的老师给他讲的),他当时举了个例子,说如果你家来了客人,你要给他泡茶,这个时候拿起空茶壶,接水,烧水,然后泡茶,最后端上去. 突然有一天,你拿了一个里边装了水的茶壶,这时候突然来客人了,你要去给客人泡茶,这时候该怎么做?
答案是把水倒掉,而不是直接去烧水.
当时很不理解是为什么, 没想到现在有点慢慢开始理解了.
硬啃英文,边学边啃
逢山开路,遇水搭桥
尽量不依赖课程本身以外的任何其它资源
多花时间慢慢来,理解这门课+学过程中英语的时间(需要很多)
集中注意力
有时候一天刷个几个小时短视频,很难集中注意力了,这个时候也不慌,我的话是习惯喝点浓咖啡.
不要自我设限
独立完成,独立做出来之前千万不要去看答案!,独立做出来之前千万不要去看答案!,独立做出来之前千万不要去看答案!
因人而异,按照我这个方法来要花费的时间可能巨多,请慎重考虑.
讲这门课的教授开篇会提到这门课很有趣,以及有趣的原因,如果您也认为这些很有趣,那学下去肯定不亏,很容易能感受到教授和学生的那种热情,听得出来他们很高兴探索这方面的知识.
我在学这个之前写过一些单片机的代码, 挺好奇为什么操作系统能跑那么多程序的, 从找对方法开始,整个过程不仅非常预约还很有成就感. 总的来说,还是很快乐的.
我直接选这个作为我操作系统的启蒙课,md,之前走弯路走了好久,一个lab都没有独立做出来,还总是焦虑,根本原因大概是时间不够, 放假了慢慢来, 还是有很大好转, 慢慢学进去了也不焦虑了.
大家看网上有大佬做的快也不用焦虑, 大佬们都是CET6+的选手,好多是做完了其它操作系统的lab顺便来看看xv6, 咱不能跟他们比.
踩坑记录如果后续想看俺也可以整理发出来,这里节省篇幅不在赘述了.
图例 | 含义 |
---|---|
√ | 没看答案,独立完成 |
√o | 一开始看了答案,但是不懂,后来自己重新做出来 |
o | 看了答案,懂了 |
× | 不会,没看答案 |
xo | 看了答案也不会 |
还没做 |
到现在,挺后悔之前没做出来就看答案的,有种脏了的感觉, 一开始没学明白,直到后边搜索一些相关的学习方法的时候看到很多人说做出来之前一定不能去看别人的答案,然后才开始"闭关修炼".
于是直接不看答案按照自己的方法开始学, 总算是能做出些lab了, 一开始独立做出moderate级别的几个, 当时开心极了,因为终于能自己做出来了! 然后又把之前没做明白的做了一遍,当独立做出了两个hard的时候,简直爽的不行.
单元 | LAB | 完成 | 备注 |
---|---|---|---|
Lab util | Boot xv6 (easy) | √ | |
sleep (easy) | √ | ||
pingpong (easy) | √ | ||
primes (moderate)/(hard) | ×o | ||
find (moderate) | o | ||
xargs (moderate) | o | ||
Lab syscal | System call tracing (moderate) | √o | |
Sysinfo (moderate) | √o | ||
Lab pgtbl | Speed up system calls (easy) | √ | |
Print a page table (easy) | √o | ||
Detecting which pages have been accessed (hard) | √ | ||
Lab trap | RISC-V assembly (easy) | √o | |
Backtrace (moderate) | √o | ||
Alarm (hard) | √ | ||
Lab cow | Implement copy-on write(hard) | 回头补上 | |
Lab net | Lab: networking | 回头补上 | |
Lab thread | Uthread: switching between threads (moderate) | × | 切换进程没问题,但是恢复的时候有问题,后续在看看 |
Using threads (moderate) | √ | ||
Barrier(moderate) | √ | ||
Lab lock | Memory allocator (moderate) | √ | |
Buffer cache (hard) | |||
Lab fs | Large files (moderate) | ||
Symbolic links (moderate) | |||
Lab mmap | mmap (hard) |
20年的,时间足够的话再回头补上这个
Lab lazy | Eliminate allocation from sbrk() (easy) | ||
---|---|---|---|
Lazy allocation (moderate) | |||
Lazytests and Usertests (moderate) |
刚开始学的时候,是真的看不懂,也不知道啥学习方法啥都,只是想着过一遍. 不过这种实操性强的课程还是挺好的,因为学不懂了过是根本过不明白的,看lecture全是一头雾水,看lab更是连中文翻译都很难看明白,但是那个时候我发现直接看英文翻译比看中文更容易理解.
其实最一开始我是想先学英语,英语水平够了直接再学这个的,这样就不用看翻译了,因为翻译出来的难免晦涩,而且一句话用英文说出来和用中文说出来强调的点可能不一样,同样的意思用中文并不会那么说,但是赶时间,于是还是先全程看翻译.
在做到2020年的lab:pgtbl之前,我一个lab都没独立做出来,但是每个lab我都花了很多很多时间,走了很多弯路,看书也稀里糊涂,直接看的翻译,但是为了看懂,也花了很久,每段都反复读好几遍,代码看着也是懵逼,因为那个时候基本上不知道指针怎么用.
一开始想快速刷完的想法破碎了,后边开始看c程序设计基础的黑皮书,去硬啃前边几张的内容,做完书上的练习,大概做了几十道题,之后再看代码,语法上能看懂了,但是很还是很懵逼.
然后又去看youtube上一个老先生讲xv6源码,能看懂80%,但是还是做不出lab.
然后我怀疑自己是弱智,还专门去测了一下智商,测出来是118,这么看的话应该还不是弱智.
当时很焦虑, 但是我甚至并没有意识到自己在焦虑, 后来找了个朋友问了一下我的状态, 我说我学不懂,花了很多时间还很懵逼巴拉巴拉, 然后他告诉我我在焦虑,应该走出这份焦虑而不是在焦虑中循环焦虑.
赶上疫情放假早,于是回到家里. 一开始还是学不懂,后边就躺平了,主要是那几天阳了,阳了就躺着,躺着真舒服,越躺越舒服…
躺平之后很久躺无聊了,游戏玩腻了,抖音也刷腻了,搞diy做个智能小车,结果小破板子画出来通上电电机驱动芯片炸了,白焊了半天,就不打算做了,有时候想着每天该做点什么,要不然好无聊.
正好赶上时间充足,就打算直接看英文的xv6书,反正也不亏,正好能练练英语阅读,回去有六级的补考,而且之前就觉出来了看英文相对更容易懂.
一开始看比较容易困,全是生词,不认识就查,顺便背点单词,背不过了就算了,反正都在一本书里边,后边还会重复出现,每天看一点书看点代码,看几个小时累了就给自己做点好吃的,不想看了就躺平.
这个时候神奇的事情发生了,慢下来看完英文的书,再看结合代码看也比较容易懂了,按照preparation里的要求看懂了书把和代码,再看课的时候我发现我很容易听得懂了,即使是把中文字幕扣了,我听几个词也大致能猜出他想表达什么意思. 然后做lab发现竟然特喵的能做出来moderate的了,后边又重新回去做hard的看到提示也有很多思路了,甚至hard的感觉也不hard了,最后还是能独立做出来.
现在回头看,知道一开始为啥折腾半天学不明白了,因为他的lecture是建立在已经看懂大部分书和代码的情况下讲的,当时看翻译只能知道每句话是什么意思,连起来就不知道他为什么这么说,想表达哪些了.然后lab也是这样,因为没达到preparation的要求,preparation里的read应该是读懂大部分的意思,而不是略读. 还有就是当时图快,很多时候没读懂自欺欺人,就为了快点结束枯燥的阅读去看视频,其实阅读并不枯燥,只是一直没看懂才枯燥.
收获还是很多的,在学这么课的时候,顺便磨合了一些工具,比如git,因为一开始要求用git,然后我自己做点别的东西发现git还挺好用.还有clion,我比较喜欢jetbrains系列的ide,比如pycharm,datagrip,idea都挺好用的.
学了个差不多成就感还是满满的,我读完了人生中第一本英文呢原著,对,没错,我读完的第一本英文书竟然是这个四万五千字的教科书,查单词的时候发现很多词汇是GRE词汇(大概是比CET6等级高一小点吧应该),读完了还是挺爽的,属于是解锁人生成就了哈哈哈. 还有就是我看到好多人学这门课的时候都是工作了好多年的还有考研上岸了的大佬, 好多人都是学了一遍操作系统再学这个的,俺直接学这个就学明白了哈哈哈哈(虽然花了太多时间,不过试错本身也是成长的一部分,感觉不亏). 更重要的是感觉写代码的能力增加了,c语言在做lab的时候用的熟悉了很多,感觉自己不再是能简单的调调包了,从表面掉包写写toycode到优化一个系统的性能添加新功能,感觉又近了一步.
还有就是顺便也磨磨性子,之前挺浮躁的,不过lab很硬核,浮躁和自以为学会了根本不管用,没有学会就做不出来,还得是沉下心集中注意慢慢来. 躺平的时候天天刷抖音确实会让脑子变傻, 简单的说就是大脑的运行内存和集中注意(超频)的能力基本上会随着短视频那些东西给消下去.
课程双语精译
课堂内容完全笔记版
CS自学指南
答案参考