01操作系统要学什么操作系统的重要性当然不止于此。如果深入研究,就会发现操作系统在整个计算机科学体系中处于非常关键的位置。计算机科学的学科那么多,但总的来说,可以分为两部分,一是硬件,一是软件。这两个部分都喜欢玩自己的东西。说中间有次元壁也不为过。但它们都在一个系统中,所以我们必须想办法打破次元壁。谁来做这项重要的工作?它是操作系统。因此,从架构上看,忧虑系统处于所有硬件的顶端,所有软件的底部,是一个“跨界”的角色。操作系统很重要,那么作为一门学科,难不难学?人们的态度走向两个极端。一方面,人们认为操作系统没有什么可学的。不就是点一下鼠标,划一下玻璃吗?课程不一定教得认真,大学开设专业课也未必太夸张了。另一边的人认为操作系统太难了。操作系统的玩家要么是Linus这样的行业巨头,要么是微软、谷歌这样的行业巨头。萌新小本只能浑身发抖。这些观点是否正确?理解上有些偏差。我们平时说的“安装操作系统”,这里的“操作系统”,准确的说应该叫“操作系统产品”,而操作系统课程的主要内容就是操作系统的内核原理。操作系统产品和操作系统内核的关系有点像电脑和CPU。没有它就无法工作,也不能单独工作。一个操作系统产品首先要有一个操作系统内核,但光靠内核是不能用的,还得加上配套的外围功能。虽名为“周边配套”,但并不代表可有可无。大多数我们熟悉的操作系统功能,其实都是“外设支持”。比如我们最熟悉的“桌面”,上面放着漂亮的壁纸,上面摆满了各种图标,是操作系统的主要用户界面,术语叫做图形用户界面(GraphicalUserInterface,简称GUI)。那个自以为“精通操作系统”的同学其实只是精通了GUI的使用,对不起,GUI不在操作系统内核中。不过,话虽如此,虽然有“操作系统内核”这样的名词,但并不代表所谓的“内核”与“外设”之间有明确的界限。在操作系统中,一直存在宏内核和微内核两条路线的争论。争论的焦点是什么应该包括在“内核”中,什么应该算作外设。微内核的思想,顾名思义,就是尽量减少内核需要提供的服务,只负责最基本的功能,赶上应用服务、驱动、GUI,甚至一些功能感觉很基本,例如文件系统服务。出内核。这样做的好处是灵活方便。比如你要提供新的服务,直接添加就可以了。不需要对内核做额外的改动,但是缺点也很突出。所有的功能都被驱赶出去了。还需要在内核态和用户态之间切换。模式切换会增加额外的开销并导致性能损失。因此,有人提倡将所有常用的功能都包含进来。这就是宏内核。Windows更早使用了微内核架构,把GUI赶了出去。结果性能损失不堪,又重新找回来。直到现在,GUI仍然是Windows内核的一部分。02操作系统核心内容操作系统课程主要学习操作系统的内核。的确,操作系统的功能越来越丰富,操作系统内核也越来越复杂。操作系统界有一本很有名的书叫《Windows Internals》,讲的是Windows操作系统的功能原理。从本书中,我们可以看到操作系统的一个变化趋势。《Windows Internals》紧随Windows的革新,Windows在不断的更新,本书也在不断的再版。一个看得见的变化是书越来越厚了。现在最新版干脆把一本书分成两册,内容太多了。一块砖已经不够了。这还只是Windows,现在是移动互联网时代,一半以上的操作系统被iOS和Android占据,并且以一年一个版本的速度迭代。学的知识不是无穷无尽的吗?其实不用着急,操作系统确实发展很快,但核心还是那些老兄弟。操作系统有一本很经典的教科书,只要你问,肯定有人推荐,叫《Operating System Concept》,中文翻译成《操作系统概念》。因本书封面绘有恐龙,学术界又称“恐龙书”。恐龙书不仅介绍了操作系统知识,还以研究案例的形式介绍了“当前主流操作系统”。当然,恐龙书从第一版发展到第九版,书中的“当前主流操作系统”也一改再改,默默记录着操作系统的变迁与发展。不过我对比了几个版本,最新的版本增加了很多知识点,增加了一些新的内容,涵盖了iOS、Android等移动操作系统,但是主要的知识结构并没有太大的调整。研究的对象和问题还是之前出现的那些。他们是哪一个?只有三个:进程、内存和存储。操作系统最重要的功能是“管理”。具体来说就是两个任务,资源分配和资源调度。管理的核心对象是什么?这是三个对应的硬件:CPU、内存和硬盘,仔细想想就知道这三个也是计算机中的三个句柄子组件。我们说恐龙书是经典,其中一个地方就体现在对操作系统知识体系的划分上。当然,恐龙书会围绕这三个核心对象,为它们一一设置单元,再加上现在大家关心的本质介绍、安全性,以及前面提到的案例分析,就构成了恐龙书。最新第九版六大知识板块。作为一个操作系统爱好者,操作系统的书看了很多,有的偏重于原理,有的偏重于实例,也有新的,比如设置独立的章节,但是不管是哪本书,进程,内存,存储(也叫外存)始终是本书的三大主线。总而言之,学习操作系统首先要掌握进程、内存和存储来学习和理解。03如何学习操作系统既然进程、内存、存储是操作系统的三大核心对象,那么具体应该如何学习呢?一句话回答:带着问题学习。这里的“带着问题学习”和我们平时说的不一样。在操作系统中,进程、内存和存储都有各自需要关注的问题。以进程为例,进程在操作系统中是一个比较抽象的概念,所以大部分操作系统的教科书都会不遗余力地给进程下一堆定义,试图用文字解释清楚什么是进程。但是效果总是不太好,不容易让大家看懂,容易晕。毕竟,“抽象”意味着如果你理解它,你就会立即理解它。我认为没有必要过分担心流程的定义。关键是功能。一开始只需要记住进程对应CPU即可。计算机所谓的“计算”就是指CPU的运算,那么运算的内容是什么呢?这就是过程。本来这个过程并不复杂,似乎也没什么问题,但后来人们想出了“多进程”,一个CPU可以“同时”运行多个进程。但这个“同时”并不是真正的同时。用术语来说,是并发执行而不是并行执行。结果,它变得复杂,问题随之而来。进程多了,CPU却只有一个。有一个多对一的竞争问题,这是所有问题的根源。然后,该过程围绕竞争条件产生了许多问题。首先是调度问题。调度是操作系统的一个大问题。书上肯定会告诉你,一个流程有很多状态,有的还画成状态转移图,各种线条飞来飞去,看得眼花缭乱。感觉很难,但是我觉得把握了背后的逻辑之后,这些看似杂乱的知识点就清晰的串在了一起。在这里,我们只需要密切关注竞争问题即可。正是因为进程和CPU不再是一一对应的关系,才需要进行调度。所谓调度,就是杂技中用两只手打五个球。区分被拾起、准备抛出和停在空中的情况,因此也需要根据情况为流程设计不同的状态。调度的具体工作就是想办法让处于这些状态的进程来回迁移,最终造成CPU在同时执行多个进程的错觉。进程下面是线程,现在我们已经创建了协程和纤程。我不知道将来还会创建什么其他进程。但是,目的只有一个,更充分的利用CPU时间,而且很难避免一个问题,就是调度问题。调度本身并不难,难的是调度原则的设计。谁上谁下,执行多久,等多久,都需要一一考虑。最困难的部分是调度没有最优解。在此条件下,设计了一个很好的调度方案。进程除了争CPU,还争资源。例如,两个或多个进程可能需要同时读写同一个文件。我们熟悉的多对一关系会导致熟悉的竞争问题。有调度问题,到资源的时候就会导致同步问题和死锁问题。同步问题非常简单。既然要安排流程,肯定是没有办法一口气完成的。比如读写一个文件,读到一半就被替换掉。下次替换的时候,发现其他进程也在读写这个文件的时候,内容变了。多线程有个默契,就是前后台环境要一致。你从CPU换我我不反对,但是你要保证我所处的环境是一样的。不要像雍正一样一觉醒来就找清朝。死了以后就没法按照剧本来了。那如何保证一致性呢?这是一个同步问题。方法包括互斥量、信号量等。死锁问题听起来有点复杂。书中花了很多笔墨,但内容还是不太好懂。其实并不复杂。我们喜欢在小区门口看到的堵车,就是死路一条。小区门口只有一条车道,早高峰大家都要排队出门。如果一辆车从外面回来,当它到达大门时拒绝让路,它就会被堵在车流中。在操作系统方面,它是一个死锁。.前面说过,为了解决同步问题,我们会采用互斥锁等方法。简单的说,当多个进程需要使用同一个资源时,只有当前正在使用的进程才会被用完,术语上就是资源释放。只有这样才能使用后续工艺。这样做的好处当然是保证了一致性,但是坏处是会导致另外一个问题,就是死锁问题。走前面小区的出口,说清楚。当然,单车道是相互排斥的,要么只进,要么只出,不可能同时进出。如果两端进来的车占了车道的一半,结果就是想进来的进不去,想出去的出不来,两端都堵死了,就是死锁。那么怎么解决死锁问题呢,大体有两个方向,一个是避免死锁,从根本上解决这个问题,但是比较难。另一个是想办法及时检测和发现已经发生的死锁,然后进行恢复。但是怎么才能及时发现死锁呢?这是操作系统方向需要研究的另一个问题。
