这篇文章介绍的是我去年6月~9月份参加北大在职研究生操作系统课程的学习经验和体会,希望能给未来同校的学子和有志想学好操作系统课程的朋友们一个借鉴。
很多学过操作系统课程的在职研同学都认为这门课程比较难学。我觉得主要原因有几点:
1.这是一门实践课程,强调基础理论的掌握,更注重实践的应用。而实现理论的方式就是编程,所以,需要具备一定的编程基础,这里尤其要强调C语言的编程基础。
2.基础理论里,微观世界抽象的内容比较多,如果是头一次接触这类课程(比如说我,本科没有学过操作系统),对一些设计思想的建立需要一定的时间和过程。
3.在职研究生的特点就是不是全职搞学习,因此每周的学习时间很是有限。而学习和掌握知识需要实践和时间,所以在有限的学习时间里,很难遵守“理论-实践-理论升华”这一最最经典的学习曲线。
我本人大学里不是学计算机的,关于操作系统的零散知识,都是通过网上查找资料或者看书才有所了解的。之前由于工作调动,阴错阳差的被分配到了一个搞基于linux kernel的文件系统研发团队,从事了自己很陌生的测试工作,一干就是3年。所以,深刻体会到操作系统这门课程的重要性。基于自己对这门课程的迫切需求,所以能够舍得花大精力去学习。通过3~4个月的努力,也算是从这门课程中学到了不少的东西。
线程和进程
这个不用多说了,基础里的基础,很多用人单位的面试必考题内容之一。要想学好这们课程,这个是必须要学好的。概念介绍很是简单,但是要想深刻理解,就不是一句话两句话能说清的。学习这部分内容,不光要多看书,还需要多思考,尽量用自己的话去理解概念。有条件的要多跟别人进行讨论,我在学习这块儿内容的时候,就是在跟小组同学的争辩中度过的。虽然自己平时最讨厌这种无休止的费神费脑的争辩或争吵,但是,确实对深刻理解概念有一定的效果。
当然,完成实验作业才是自己真正对这部分内容的掌握。我们的实验课程模块是nachos. 这是一个基于C++语言的教学操作系统。基本模块已经建立好了,只留下接口,为学习者提供了很广的扩展空间。我们的实验课程,就是通过不断的开发新的功能或模块,来实现自己的理论知识,强化自己的实践技能。这部分的内容(简称LAB1)实验项目都比较基本,不光是检验我们对进线程基础理论的理解和掌握,也是督促我们尽快熟悉nachos环境,熟悉linux下C++编译环境。因此,LAB1的作业题也可以算是nachos学习的热身题,经历的这段热身训练,我基本上完成了对nachos开发的入门掌握。并且,对进程/线程如何在操作系统的实现也有了深刻的了解。
文件系统
这可是操作系统的一大领域!很多大公司会成立专门的开发或测试团队搞文件系统,可见这一领域在计算机行业的重要地位。其实大家仔细想想,我们现在用到的E-mail,网页,doc文档,甚至我们用到的操作系统,有哪个跟文件系统没有联系?缺少了文件系统,大家现在根本无法在互联网上看到我写的这片文章(只能买书或看杂志,如果我能发表的话)。文件系统涉及到的内容很多,不仅要具备底层的开发技能,还需要有能力设计优秀的数据结构和算法,甚至高深广博的数学基础。能长期从事文件系统开发的人,不仅需要坚实的计算机基础知识,数学基础,甚至需要一些天赋。所以这属于软件开发领域金字塔当中最上层的那一小拨人群(一般只有国外的计算机本科或国内研究生以上学历的人才有能力从事相关的开发工作)。
这部分内容,光上课认真听老师讲课是无法掌握的,需要反复阅读书本。很多概念,如文件系统布局,文件控制块,文件目录结构,文件操作,不仅需要理解,还需要记忆,像一些文件系统的布局图,最好能背下来,做到烂熟于心。因为只有这样,在将来自己开发和设计的时候,才能够避免无从下手,阅读高人们的代码的时候,才能更快的理解。
关于实验内容LAB2, 难度不小。如果LAB1算热身的话,LAB2俨然要把学习者培养成为一个nachos开发工程师。很多作业题,不是说简单的看看书就能解决的。不但需要对基础理论要扎实的掌握,还需要对nachos的文件系统和系统调用比较熟悉,之前最好还有一些APUE 的学习经历。完成这部分内容的作业,需要投入不少的时间,很多程序需要反复的调试。如果在时间允许的条件下,能独立完成这些作业题是最好的。但是,我感觉新手要想从无到有的完成这些代码的编写,难度还是很大的。所以,从网上搜寻一些代码片段,或者是一些设计思路,是比较有效的学习方法。整合这些代码片段,或者实现这些设计思路,其实也是一种对理论知识的学习和掌握。灵活运用“拿来主义”,将别人的东西通过内化变为自己的东西,就是一种学习!
内存管理
这也是操作系统的一大领域!C语言里最难处理和掌握的部分就是关于内存的分配和管理了,一个小小的指针错误运用,就可以搞得C程序员花数天时间加班加点吐血调试!所以,学好学精这部分内容,不仅让人从微观上更好的了解操作系统的某一方面,还帮助人们在学习C或C++的时候遇到的各种奇怪现象和困惑有了新的解释和分析角度。
完成这部分的作业(LAB3)同样是一个不小的挑战,完成的好坏不仅取决于编程技能的水平以及对这部分理论的掌握程度,还跟前两次课程的完成度都有关,因为有相当一部分的代码需要重用以前作业题中的代码(比如说系统调用那部分的作业和文件读写操作的作业)。立志完成这部分的所有作业题,需要勇气,毅力和恒心(对于新手来说,还需要一点点的运气)。一些涉及到内存算法实现的测试的附加题,其实也是不错的锻炼和实践机会。完成这些附加题,不仅让我从“What"的角度去学习理论,还养成了从"how"和"Why"角度去思考。
其实,操作系统课程不止包括这三大块的内容,还有诸如I/O、死锁、接口设计等等内容。我们的课程只涵盖了这三大块的内容,这也是整个操作系统课程的精华和重点。学过了这些内容,不仅对操作系统有了一个比较系统的深入了解,也为将来有机会学习剩下的内容或者从事相关的工作打下了坚实的基础。
所以,总结一下我这4个月来的学习体会:
1. 上课认真听讲
老师课上讲的不一定是书本或讲义上的所有内容,但一定是最最基本和重要的内容。对于新人来说,也许完全理解老师课堂上讲授的内容有一定的难度,但一定要认真做笔记,不明白的及时问老师,或者课下及时理解和消化。如果没有时间全部消化,也要做上相关的记号,至少要清楚老师讲授的进度。这些细节的操作也许大家当时看不到啥好处,但是在期末复习的时候,会轻松很多。因为不是所有的老师都喜欢在考试前将复习重点细化到文字上的。
2. 课下积极讨论
抽象的东西,要想理解和掌握不是件容易的事情。有一种笨方法比较有效,就是用嘴去说。如果能用自己的话去描述这些抽象的理论,让别人能够理解,就能最大效率的掌握这些理论。跟别人进行探讨,能最大限度的挖掘自己的理解潜力,因为只有深刻理解了,才能通过摆论据来说服别人。这也是检验自己理论掌握情况的有效办法。
3. 先想再写
写代码的时候,不要为了赶进度完成作业就着急编写和调试。一定要确保自己理论基础已经学透了,而且要认真阅读nachos的用户手册。这个貌似是一件耽误时间的事情,但实际上是在节省时间。因为可以避免自己在设计和编写代码的时候少走弯路或绝路。我就曾经经历过由于没有认真看手册,花2天时间编写的代码不能用只好放弃重新设计的困境。
4. 拿来主义
要学会学习别人的代码。这里的“拿来”当然不是指整片的抄袭,而是指代码片段的借用。很多涉及到底层的代码设计,如果已经有比较好的实现了,为啥不能借用呢?毕竟我们是在学习操作系统,不是在学习汇编或者更底层的驱动开发。学习和借鉴这些编程技巧,可以更高效的利用我们的时间,在知识的学习和能力的训练上达到最好的平衡。
5. 考前认真复习
考试是最经典的复习方式,只有通过考试,才能督促自己去学习和掌握。所以一定要重视期末阶段的复习和考试。让自己的理论学习更扎实,知识体系更系统。
阅读(5584) | 评论(3) | 转发(0) |