学习操作系统之前
# 0. 学习操作系统之前
在深入学习操作系统之前,我们先聊聊以下几点内容
- 学操作系统之前的知识储备
- 什么是操作系统(what?)
- 为什么要学习操作系统(why?)
- 怎么学习操作系统(how?)
# 学操作系统之前的知识储备
在学习操作系统之前,最好有以下的知识储备,不然学起来有一点点吃力。如果完全没基础的话,基本上是很难学习下去的。
- 计算机发展简史
- 数字电路(学习计组之前的知识储备)
- 计算机组成原理(知道什么是 CPU,CPU 是干嘛用的,怎么运行起来的)
- C 语言(操作系统主要由 C 语言实现,需掌握基本语法和指针)
- 数据结构与算法
- 汇编(学习操作系统对汇编的要求很高,个人认为学完《汇编语言-王爽著》就差不多了)
参考计算机基础学习路线
# 什么是操作系统
在讲什么是操作系统之前,我们先看看为什么会有操作系统,以此来理解操作系统的作用。
在计算机发展简史里我们可以知道,人们对计算的需求越来越大,计算的数据量也越来越高,因此人们发明了计算机,并不断提高计算机的性能,如今人们的生活越来越离不开计算机了。
那么,计算机是怎么构成的呢?根据计组里学的冯诺依曼结构,我们可以知道计算机由控制器,运算器,存储器,输入和输出设备组成。
如今,计算机已经包含了很多外设,例如键盘,鼠标,显示器等,如下:
计算机能帮助我们解决实际的问题,比如在早期用于战争时期的弹道计算,再比如如今我们用的 PPT,浏览器,导航软件等等。
我们先来看一个最简单的例子:在屏幕上输出一个 HelloWorld。怎么实现呢?我们要通过发送指令给 CPU,让 CPU 执行。假设 HelloWorld 已经在内存里了,地址为 300,那么首先是将 H 的 ASCII 码放到显存里(假设地址是 77),那么显示器上就会显示一个字符 H;下一步就是 显示字符 ‘e’,再下一步就是显示字符 ‘l’。所以输出 HelloWorld,就得一个一个的,慢慢地放到显存上。这样,计算机就帮我们解决了一个问题:显示指定的字符串(这里需是汇编的知识)
我们思考一下,上述过程是不是太麻烦了?明明我们用 C 语言的话,我们只需一行代码就能解决:
printf("HelloWorld")
那么,为什么 C 语言就能直接调用 printf,不用操作硬件?因为操作系统帮我们操作了硬件。也就是说有了操作系统后,再使用计算机硬件就变得很简单。这就是为什么会有操作系统。
我们可以给操作系统下个简单的定义:在计算机硬件之上,封装了一层软件,使计算机使用起来更方便。这就是操作系统。
应用软件(我们平常使用的程序,浏览器,Word 等) |
---|
操作系统(Windows,Linux 等) |
计算机硬件(CPU,内存,显卡等) |
人们把只有计算机硬件的部分叫做裸机,(比如刚刚看到的 CPU,内存条,显卡,显示器等),给裸机穿上衣服,使用起来就容易了
那么,操作系统管理哪些硬件呢?如下:
- CPU 管理
- 内存管理
- 终端管理
- 磁盘管理
- 文件管理
- 网络管理
- 电源管理
- 多核 CPU 管理
后面三个暂且不表,我们先学习前面 5 个,这几个部分就是一台计算机必须的 5 个基本组成部分。一旦学完了这些部分,那么一台单 CPU 的操作系统是怎么工作的,怎么管理硬件的,我们就知道的七七八八了,后续再延伸学习网络管理和多核 CPU 管理就更容易。
# 为什么要学习操作系统
身为这个行业的一员,操作系统是计算机最关键的一项技术了,如果我们只知道怎么使用操作系统,而不理解其内部的运作原理,是谈不上掌握这门关键技术的。
另一方面,我们出来社会上同其他人竞争,其他人是怎么学习操作系统的呢?比如斯坦福大学,他们是会做 4 个实验,会改动到操作系统里 4 个非常关键的部分,如果我们只知道一点皮毛的原理,是根本改动不了的。
而 CMU(卡内基梅隆大学)更狠,直接从硬件上做一个系统出来,但只有经过这样的训练,在计算机行业中才能堪当大任。
虽然我们并不是打算比他们更狠,至少我们应该接近他们。
这里引用哈工大一名学长的实验手册里的话:
操作系统是计算机科学与技术专业的一门非常重要的专业课程,操作系统课程的学习能使学生在操作系统层面上提升自己的应用计算机解决问题的能力;使学生系统的理解和应用计算机本科阶段学习的各种知识;使学生获得开发复杂的大型软件系统的直接经验;使学生体会多目标下的折衷技术……可以概括的说:“理解了操作系统就真正的理解了计算机”。
# 怎么学习操作系统
学习操作系统,有很多个层次。我们可以学习应用软件和操作系统之间的那一层,这也是很多同学学习的层次,比如知道有那些接口,怎么使用。但这样我们就只是知道一点皮毛,根本进不去操作系统。
而本课程要做到的:是从接口深入进去,知道其内部是怎么运作的,比如 printf 是怎么实现的?进程是什么?知道这个后,我们至少可以扩充操作系统,能改动操作系统,也为编写一个操作系统打基础。
而有的学校更狠,从硬件上配一个操作系统(例如 CMU),这个要求是非常高的。
我们尽量集中在改造操作系统上,知道背后发生了什么事,而不仅仅知道其原理,跟要知道怎么用代码实现。本课程有 8 个实验认真做完后才算 真正地有改造操作系统的能力了。这里也借鉴斯坦福的一句话:Learn OS concepts by coding them!
操作系统不简单,我们要阅读大量代码,撰写大量代码,不仅要知道代码,还要知道其背后原理;还要根据原理,能想到代码,两方面来回切换,对编程能力和抽象能力要求很高。
纸上觉来终觉浅,绝知此事要躬行。如果我们没有这样的决心,是学不好操作系统的,只有深入到操作系统内部,我们才能有这样的能力和国际接轨,掌握计算机的核心技术,同行业里的人进行同等的竞争。
# 总结
我们总结下本文讲述了什么:
- 什么是操作系统?操作系统简单来说就是硬件,能帮助我们更好的使用计算机硬件,管理计算机硬件
- 为什么要学操作系统?操作系统是计算机里的最关键的技术,学会它才能深刻掌握计算机原理。
- 怎么学习操作系统?学习操作系统有很多个层次,我们主要集中在能改动操作系统这一方面,并设置了 8 个实验