查看原文
其他

美团校招开奖了!

沉默王二 沉默王二 2022-07-13

大家周末好,我是二哥呀。

昨天晚上,有个读者私信给我说,他的一个师兄,校招拿到了美团的 offer,昨天开奖了,虽然美团没像去年那样成为香水团,但师兄仍然感觉非常满足。

我这个读者也非常向往美团,他今年大三,就顺带问了问师兄有什么学习建议给他,师兄给了他一些非常诚恳的建议,并叮嘱他一定要学好操作系统。

有一说一,操作系统不管是对科班还是非科班,我认为都是蛮重要的。这么说吧,操作系统是管理计算机硬件和软件资源的程序,是计算机的基石。

举个例子来讲,像 Java 中的并发编程这块,如果连进程调度的相关原理、同步和互斥都搞不懂,那多半会有两种结果:

  • 写出来的多线程程序出现了各种奇奇怪怪的问题;
  • 不知道为什么出现这些问题。

另外一方面,操作系统的确是校招面试中经常考察的核心知识点。

讲真,大三学习操作系统刚刚好,大一大二学了编程语言、数据结构与算法、数据库等等,有了编程的基础,再啃操作系统这块硬骨头就不那么难啃了!这次为了给读者一个满意的答案,我熬了一晚上,认真地挑选出来了两个操作系统的视频课程,一个国内的,一个国外的。

先看一门国内的,再看一门国外的,中西合璧,药效持久。

国内的推荐哈工大的《操作系统》实验课,以下四部分最为重要。

1)操作系统基础篇

https://mooc.study.163.com/course/1000002004?trace_c_p_k2=a79448e7966846a28cde039b6e1d0888#/info

2)操作系统之进程与线程

https://mooc.study.163.com/course/1000002008?trace_c_p_k2=edac826e21bc4e5f9dfbccf8966f9727#/info

3)操作系统之内存管理

https://mooc.study.163.com/course/1000003007?trace_c_p_k2=8ebbdbee5c764f1eac017d1bde87308e#/info

4)操作系统之外设与文件系统

https://mooc.study.163.com/course/1000002009?trace_c_p_k2=90017eef3d9e457a9303180d9efd5e6e#/info

哈工大的操作系统课是该校 CS 课程中含金量最高的,尤其是实验课。八个实验涉及到了操作系统的核心部分,虽然 lab 不是在哈工大自创的 HITOS 上,但 linux-0.11 确实是一个非常好的选择。

Linux-0.11 这个版本能让学生更加专注于实验,而不是纠结于各种奇奇怪怪的问题,作为 OS 入门算是足够了。

Linux 发展到现在,内核源码与 0.11 相比,几乎是翻天覆地的变化,但这不代表研究 linux-0.11 就没有意义,毕竟内核这东西,你懂的。。。

多的不说,学完 linux-0.11 后,你至少能明白,原来一个最简单的完整的操作系统,是这个样子的:它是这样一步步从 BIOS 开始加载程序加载数据的,它是这样实现单 CPU 多任务多进程调度和切换的。

Linux 内核主要由 5 个模块构成,分别是:

  • 进程调度模块,负责控制进程对 CPU 资源的使用。
  • 内存管理模块,用于确保所有进程能够安全地共享主机内存,同时,内存管理模块还支持虚拟内存管理方式,使得进程所使用的内存比实际的内存更多。
  • 文件系统模块,用于支持对外部设备的驱动和存储。linux-0.95 版本又逐步实现了虚拟文件系统,该模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节,从而兼容其他操作系统。
  • 进程间通信模块,用于支持多种进程间的信息交换方式。
  • 网络接口模块(linux-0.96 版本才有),提供对多种网络通信标准的访问并支持网络硬件。

它们之间的依赖关系见下图所示。其实连线代表它们之间的依赖关系,虚线代表 linux-0.11 中还未实现的部分。

由上图可以看得出,所有模块都与进程调度模块存在依赖关系,因为它们都需要进程调度程序来挂起或重新运行它们的进程。

linux-0.11 的学习推荐《Linux 内核完全注释》,该书对 linux-0.11 的全部代码文件进行了详细全面的注释和说明,能够让大家在尽量短的时间内对 Linux 的工作机制有一个全面而深刻的理解,为进一步学习 Linux 系统打下坚实的基础。

高清 PDF 版在 GitHub 上的一个开源仓库里可以找得到(附 linux-0.11 内核的源码):

https://github.com/itwanger/JavaBooks#Linux%E5%86%85%E6%A0%B8

我在逛 GitHub 的时候发现了这样一个仓库:

https://github.com/hoverwinter/HIT-OSLab

作者大四,他的这门操作系统实验课满分,打算自己写一个 OS,就顺带把之前的代码给开源了出来,希望对学习操作系统,以及对哈工大这门实验课感兴趣的同学一些参考。

其中 lab1-lab7 给出了修改的部分,lab 8 给出了完整的修改后的 linux-0.11 的代码。虽然这个仓库已经有好多年没有更新了,但仍然有参考的价值。

作者的那句:“Just coding system,it’s fantastic!”我觉得也蛮给力的。

国外的强烈推荐 MIT 6.268 这门课(主要研究生级别),是一门公认的硬核课程,一直以来都有很高的知名度,广受好评,是理论与实践相结合的经典。

https://pdos.csail.mit.edu/6.828/2018/schedule.html

不过,在学习这门课之前,最好之前有过一些操作系统的基础,比如说上过本校的 OS 课,比如说阅读过《操作系统导论》这本书,比如说熟悉 C语言和汇编,对计算机组成原理也有一定的了解。

这门课有多牛逼呢?

举个例子,以陈波老师为首的上海交通大学的 IPADS 实验室可以说是国内最强的操作系统相关实验室之一了,而陈波老师等人在读博阶段就完成了 6.828 课程的学习,并且在此基础上开发了 corey 操作系统,并发表了一篇被广泛引用的论文:Corey——An operating system for many cores。

如果觉得这门课的难度有点大,可以选择 MIT 的 6.S081(Introduction to Operating System,操作系统导论)这门课,主要针对本科生级别。

https://pdos.csail.mit.edu/6.S081/2020/schedule.html

穿插个小故事,蠕虫病毒大家有听说过啊?他的发明者 Robert Morris 是 6.S081 的一位授课老师,当年 Morris 是康奈尔大学的一名学生,写了一个小的实验程序,即蠕虫病毒,想“测量互联网的规模”,但怕被抓,为了掩盖真相,就选择了在 MIT(麻省理工学院)释放蠕虫病毒,没想到这个病毒造成了巨大的影响,Morris 也受到了审判,也许是觉得自己坑了 MIT,Morris 后来就去了 MIT 任教。

6.S081 这门课是基于一个类似于 Unix,但比 Unix 简单得多的一个教学操作系统 XV6 来讲解的,虽然不是原汁原味的 Linux,但对于理解 Linux 的工作方式和结构是足够了。

这门课是全英文的形式,video 链接里甚至没有英文字幕,对于国内的同学来说,如果英文功底一般的话,很难较好的理解这门课程。

下图是课程表,里面有 PDF 和 video 链接🔗。

为了减轻大家的学习压力,我在哔哩哔哩上找到了这门课的克隆版,但中英文字幕的那种。

哇,有了中英文字幕,学起来就舒服多了。课程地址我贴一下:

https://www.bilibili.com/video/BV19k4y1C7kA

除了这个,我还找到了一份中文版的在线阅读文档,总共有 35 万字左右,据作者说,他大概花费了 200 个小时,辛苦劳作的结果是不仅作者自己的知识盲区补全了,也为后来者留下了一笔不可多得的学习资料。害,除了能蹦出“牛逼”两个字外,我想不到更惊艳的词汇了!

https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/

这门课的一部分会讲操作系统的基本概念,一部分是 lab,几乎每周都会有一些编程实验。

我们都知道,操作系统很重要,那操作系统的学习单靠看和听肯定是不行的,必须配合实战来。做实验的意义就在于能帮我们获得一些使用和实现操作系统的实际动手经验。

还有xiaofan 的学习笔记也是非常值得参考的:

https://fanxiao.tech/posts/MIT-6S081-notes/#11-processes-and-memory

学习 6.S081 这门课的目的有三个:

  • 理解操作系统的设计和实现
  • 能动手扩展一个小型 OS
  • 能动手实现系统应用

我之前有整理过一份操作系统的核心知识点,大家也可以拿来作为参考资料。

有一说一,操作系统确实难刷,大家在刷的过程中一定要记得多喝水,因为这门课实在是太干了。说实话,光是整理这两门课的过程,我就又 get 到了不少新鲜的知识点。希望我推荐的这两门课算是抛砖引玉吧,大家一起冲!

记住一点,动手很重要,动手做 lab 很重要。

参考资料:

https://zhuanlan.zhihu.com/p/251366985
《Linux 内核完全注释》
https://github.com/hoverwinter/HIT-OSLab
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/
http://xiongchen.cc/posts/6.s081-lab-2/

没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟

推荐阅读

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存